20190529のGitに関する記事は8件です。

Git リモートとのやりとり 自分用メモ

リモートからの情報取得

リモートの表示

git remote

対応するURLを表示
git remote -v
fetch用、push用で2つ出てくる

リモート詳細情報を表示

git remote show <リモート名>
git remote show origin

リモートリポジトリの追加

最初のリモートリポジトリを作るのと同じ動き

リモートリポジトリは複数登録できる

git remote add <リモートリポジトリ名> <リモートリポジトリURL>
このコマンドの本質は、URLにエイリアスをつけること。Gitコマンドの中で、リモートリポジトリ名でURLにアクセスできるようにしているだけ

リモートからの情報取得(フェッチ、プル)

「他人が加えた変更をローカルに持ってくる」という場面

フェッチ("取り出す")

リモートリポジトリからローカルリポジトリに情報を持ってくる
自分の手元(ワークツリー)に持ってくるわけ ではない
ローカルリポジトリ remotes/<リモート名>/<ブランチ名> という場所に保存される

git fetch <リモートリポジトリ名>

例:リモートリポジトリだけに変更を加えるため、GitHubからhome.indexというファイルを追加してみる。
git fetch origin で、リモートリポジトリの情報をローカルリポジトリのremotes/origin/masterに保存する

この時点では、ローカルリポジトリ/masterには何の変更もない。
ただremotes/origin/masterという所定の場所にリモートリポジトリの情報を持ってきただけ。

内容を確認するには、ブランチを切り替える必要がある。
git checkout origin/master
lsしてみると、GitHub上で追加したファイルが表示されている。

いったんローカルリポジトリに戻る(git checkout master
フェッチしてきた情報をワークツリーに、反映させるにはマージ(統合)を行う必要がある

git merge origin/master
「ローカルリポジトリに保存した、originリモートのmasterブランチ情報を、現在いるブランチ(この場合はローカルのmaster)に統合する」
(リモートリポジトリから直接持ってきているわけではなくフェッチによってローカルリポジトリに保存した情報を使うため、
git merge origin masterではなく、git merge origin/masterとなる。)

lsしてみると、GitHub上で追加したファイルがmasterにも反映されている。

フェッチとマージを一気にやりたいときは、プル

git pull <リモート名> <ブランチ名>
git pull origin masterについては、git pullと省略できる

git fetch origin master + git merge origin/master = git pull origin master
= 「指定したリモートリポジトリからローカルリポジトリに情報を持ってきて、現在いるブランチをその情報で上書きする」

???フェッチとプルの使い分け

プルの注意点

ローカルの統合先は、あくまでも現在自分がいるブランチ**(同じ名前のブランチ、とかではない)

慣れるまでは、フェッチ + マージ がよい。

リモート名の変更・削除

変更

git remote <旧リモート名> <新リモート名>
git remote rename tutorial new_tutorial

削除

git remote rm <リモート名> rm => "remove"
リモートリポジトリそのものが削除されるわけではない
(GitHubには表示されている)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git 操作取り消しメモ 自分用メモ

ファイルへの変更を取り消し

git add、git commitなどをしておらず、単純にファイルへの変更を取り消したい場合

ローカルリポジトリの状態を、ステージの情報と同じにする

git checkout ファイル名

git checkout ディレクトリ名

git checkout . 全ファイルについての変更を取り消す

ステージに追加した(git add)変更を取り消し

= 最新のコミットを参照して、ステージの内容を上書きしている

git reset HEAD ファイル名 or ディレクトリ名 or .
* git checkout --と違い、ローカルリポジトリには影響しない。
ローカルリポジトリの変更も取り消したい場合は、git reset HEAD後に、git checkout --する

コミットをやり直す

誤ったコミットをしてしまった場合。
正しい変更を加えた状態でgit add .
git commit --amend
= 最新のコミットを、現在のステージの状態で上書きする

Pushしてからこれやると大変なことになる。
(Pushの内容を直したい場合は、普通にgit commitしてPushする???)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gitで「新規ファイル」「削除ファイル」のみをaddする

はじめに

git add -u .とやると、「更新ファイル」のみaddしてくれますが、
「新規ファイル」「削除ファイル」のみと言うオプションは用意されていません。(たぶん)

やりたいときは、シェル芸で行きましょう。

git status -s(--short)が便利です。
http://sohtaro.com/blog/2017/05/28/git-status-short/

削除ファイルのみadd

git status | grep deleted | awk '{print $2}' | xargs git add

または

git status -s | grep ' D ' | awk '{print $2}' | xargs git add

追加ファイルのみadd

git status -s | grep '?? ' | awk '{print $2}' | xargs git add

追加ファイルの場合は普通にgit statusとやるとファイル別のgrepがしづらいので、
git status -sが必須ですねー。

では、シェル芸で素敵なgitライフを!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

windows git diff 変更差分が全範囲になる(おかしい)

文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。コマンドで修正参考記事

コマンド
git config --global core.autoCRLF false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

windows git diff 変更差分が全範囲になる(文字コード)

文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。git bashでコマンドを入力して修正参考記事

コマンド
git config --global core.autoCRLF false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

windows git diff 変更差分が全範囲になる

文字コードの違いで、ファイルを編集したときにgit diffがファイル全体にかかってしまう現象がある。コマンドで修正参考記事

コマンド
git config --global core.autoCRLF false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【目的別】Github手順書【初心者向け】

当記事の目的

以下の悩みを解決

  • GitHubのコマンドが書いてあるページはたくさんあるけど、現状に合わせてどう組み合わせて使ったらいいか分からない
  • はじめてGitHub触るけどぶっちゃけ何から手を付けたらいいか分からない

前提条件

  • 構成管理システムの概念的な話は一切触れません
  • GitHubのコマンドをインストール済みで、Linux上でGitHubにアクセスすることを想定
  • fetchとは何か、mergeとは何か、ローカルリポジトリとは?originとは?みたいな話は別のまとめを見てください。気が向いたら参考ページ張ります
  • 筆者がGitHubに慣れていくにつれ加筆されていきます

Windows環境の人は、インストールについてはそれなりに手間なので、【Windows】Gitの環境構築を参考にしてください。Linux環境の人はデフォルトでインストールされていることがほとんどですが、なければsudo apt-get install gitしてください。

インデックスを見ながら、自分に合った目的をお探しください

GitHubコマンド手順

case1 : 開発チームに入ったぞ!早速ローカルのフォルダにリモートのソースコードをクローンしてこよう!

手順

  • 自分のリポジトリにアクセス
    画像

  • Clone or downloadをクリックし、表示されたURLを控える(https://github.com/自分のリポジトリ.gitとする)

  • ローカルリポジトリを作成したいフォルダに移動

  • $ git clone https://github.com/自分のリポジトリ.git -b branch_name local_folder_name

    • branch_nameは、リモートのどのブランチをクローンするか指定
    • local_folder_nameは、作成するローカルリポジトリの名称(デフォルトはリモートURL-ブランチ名
  • ユーザID、パスワード入力を求められるため、GitHubにログインする際のユーザ名とパスワードを入力する

詰まりそうな点

case2 : ブランチを分けてカスタマイズをするぞ!まずはブランチを分けよう!

手順

  • gitクローンされた、ローカルリポジトリ下にいることを確認
  • $ git branchでブランチの状態を確認
shun@shun-VirtualBox:~/xxx/yyy$ git branch
* original_branch_name
  • $ git checkout -b new_branch_name original_branch_nameで新ブランチ作成
    • new_branch_nameは、作成する新しいブランチの名称
    • original_branch_nameは、基にするローカルのブランチ名称
    • リモートからチェックアウトする場合は$ git checkout -b branch_name origin/branch_name
      • origin/branch_nameがリモート、branch_nameがローカル
  • $ git branchでブランチの状態を確認
shun@shun-VirtualBox:~/xxx/yyy$ git branch
  original_branch_name
* new_branch_name

case3 : カスタマイズが終わったから、分岐したローカルブランチに対してコミットしよう!

  • gitクローンされた、ローカルリポジトリ下にいることを確認
  • $ git statusでチェックアウトしてからの変更情報を確認
    • deleted: moved_file.pyは、消去されたファイル(実際にはファイル移動)
    • modified: changed_file.pyは、変更が加えられたファイル
    • deleted: deleted_file.pyは、消去されたファイル
    • new_file.pyは、新規で作成されたファイル
    • new_folder/moved_file.pyは、新規で作成されたファイル(実際にはファイル移動)
shun@shun-VirtualBox:~/xxx/yyy$ git status
ブランチ new_branch_name
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
    deleted:    moved_file.py
    deleted:    deleted_file.py
    modified:   changed_file.py


追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)

    new_folder/moved_file.py
    new_file.py

no changes added to commit (use "git add" and/or "git commit -a")
  • この状態を想定して、まずはaddしていく
    • $ git add moved_file.py
    • $ git add deleted_file.py
    • $ git add changed_file.py
    • $ git add new_folder/moved_file.py
    • $ git add new_file.py
  • $ git statusでaddした後の状態を確認
    • それぞれがrenamed, modified, deleted, new fileとしてコミット予定の発射台に乗っていることを確認する
shun@shun-VirtualBox:~/xxx/yyy$ git status
ブランチ new_branch_name

コミット予定の変更点:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    moved_file.py -> new_folder/moved_file.py
    modified:   changed_file.py
    deleted:    deleted_file.py
    new file:   new_file.py

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)


追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)

no changes added to commit (use "git add" and/or "git commit -a")
  • $ git commit -m 'message'でコミットを実行
    • messageは任意のコミットメッセージを入力

詰まりそうな点

  • 間違えてaddして、取り消したい場合は$ git reset HEAD added_fileを実行。$ git reset HEADまでは固定。renameの場合は、変更前のファイルと変更後のファイルに対して両方resetする必要がある
  • 一括でadd取り消したい場合は$ git reset HEAD
  • commit時にメッセージは必須で、-m以降を入力しないとvimが開いてしまう

case4 : ローカルのブランチにコミットしたぞ!リモートブランチにも反映しよう!

手順

  • $ git push origin new_branch_name
    • originは固定値
    • new_branch_nameはリモートに反映させたいブランチ名称
    • new_branch_nameがリモートにない場合は、新規に作られる

詰まりそうな点

  • リモートに同一名称のブランチがない場合は、new_branch_nameが新規作成される

case5 : ローカルのブランチを、リモートのブランチの状態に合わせたい!

ローカルで色々更新したんだけど、やり直したい場合を想定。同一名称のリモートブランチに別のマージが入っている場合は、以下のやり方ではなく素直$ git pull origin developでプルをする。

手順

  • $ git fetch origin
    • [new branch]となっているブランチは、ローカルには無いけどリモートに存在するブランチ
    • original_branch_nameは、ローカルにもリモートにも存在するブランチ
shun@shun-VirtualBox:~/xxx/yyy$ git fetch origin
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/自分のリポジトリ
 * [new branch]      new_branch   -> origin/new_branch
   c5996a4..47d6cc0  original_branch_name    -> origin/original_branch_name
  • $ git reset --hard origin/original_branch_name
    • git reset --hard origin/までは固定、original_branch_nameは、合わせたいブランチ名称
    • fetchしてきたリモートのブランチを、ローカルの同一名称ブランチに反映させますよ!という命令
  • $ git checkout original_branch_nameで、reset後のブランチに移動する
  • $ git clean -df .で余分なファイルを削除する
    • ここまでの命令では、あくまで更新情報/新規作成情報のみをリモートから取得できるが、不要ファイルの削除をしてあげる必要がある
    • ここまで実行することで、リモートブランチと全く同じ状態になる

詰まりそうな点

  • fetchって何?と思う人は、リモートリポジトリとローカルリポジトリの中間層があると思えばよい。そこを「origin」と呼んでおり、リモートをoriginに反映させる処理をfetchと呼ぶ。originを使ってローカルリポジトリをどうするかが、reset以降のコマンド【入門者向け】Gitのfetchコマンドについて図を用いて解説

case6 : 1つ1つaddするのめんどくさいから一括でaddしたい!

手順

  • $ git add -u

    • トラッキング(バージョン管理)されているファイルについて、すべてaddされる
    • つまり、「削除されたファイル」、「変更されたファイル」はaddされ、「新規作成されたファイル」はaddされない
  • $ git add -A

    • トラッキング(バージョン管理)されていないファイルも含めて、すべてaddされる
    • つまり、「削除されたファイル」、「変更されたファイル」、「新規作成されたファイル」がaddされる
  • $ git add .

    • カレントディレクトリ以下に対して、$git add -Aを実行する

case7 : プルリクも承認されたし、不要ブランチを削除するぞ!

手順

まずはローカルのブランチから削除していく

  • % git branch
    • まずは現在のブランチの状態を確認
    • developにマージが完了しており、updateDevelopを削除したいとする
shun@shun-VirtualBox:~/workspace/global$ git branch
  develop
* updateDevelop
  • $ git checkout develop
    • このままでは削除できないので、developブランチに移動する

マージが完了している場合

  • $ git branch --delete updateDevelop
    • 不要ブランチを削除する

マージが完了していないが削除したい場合

  • $ git branch -D updateDevelop
    • 不要ブランチをマージをせずに削除する
    • ※これまで反映したcommitは削除されるので注意

次にリモートブランチを削除する

  • % git branch --remote
    • まずは現在のリモートのブランチの状態を確認
    • ローカルでは削除したupdateDevelopが残っている
shun@shun-VirtualBox:~/workspace/global$ git branch --remote
  origin/HEAD -> origin/master
  origin/develop
  origin/updateDevelop
  • $ git push --delete origin updateDevelop
    • 不要ブランチを削除する

もしくは以下のコマンドでも可能

  • $ git push origin :updateDevelop

最終的なブランチの状態を確認する

  • $ git branch --all
shun@shun-VirtualBox:~/workspace/global$ git branch --all* develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/develop

case8 : 親ブランチにされたコミットを、今の作業ブランチに反映させたい!

手順

developブランチで作業している際に、masterブランチにコミットが入りました。そんな時はrebaseを使います。

ブランチの状態は以下の通りで、origin/maseterにコミットが加えられている

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master* 
 develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop
  • $ git checkout -b master origin/master

    • まずはローカルに、masterブランチをcheckoutします
  • $ git pull origin

    • リモートmasterブランチへの反映を、ローカルのmasterブランチにも行います
  • $ git checkout develop

    • 元々作業していたdevelopブランチに移動します
  • $ git rebase master

    • masterブランチへのコミットを、現在の作業ブランチに反映ささせます

現時点のブランチの状態は以下の通りで、ローカルのmasterとdevelopは同じ状態

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master
 develop* 
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop

リモートにも反映させる場合は、プッシュをしてあげればOK

  • $ git push origin develop

case9 : リモートブランチに反映された内容をローカルの同名ブランチにも反映させたい!

手順

現在のブランチの構成は以下の状態とし、リモートのdevelopに反映されたコミットをローカルdevelopにも反映させたいとします

shun@shun-VirtualBox:~/workspace/global$ git branch -a
  master
 develop* 
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/develop

一発で反映させたい場合は、以下のコマンド

  • $ git pull origin develop
    • origin(追跡ブランチ)に、リモートのdevelopを反映させる(フェッチ)
    • また、originからローカルのdevelopブランチに統合する(マージ)

上記の手順を別コマンドで行うと以下のようになる

  • $ git fetch origin develop
    • origin(追跡ブランチ)に、リモートのdevelopを反映させる
  • $ git merge FETCH_HEAD
    • originのFETCH_HEADからローカルのdevelopブランチに統合する

続く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

♪どつぼにはまってどっぴんしゃん

まったく進まなくなってしまった...

  • GitHubの二段階認証が有効な環境でSourceTreeを使うにアクセストークンを発行し、それをソースツリーに入れればOKと書いてあったのでやってみた。でもダメ
  • 昨日は疲れて寝てしまい落としてしまったし
  • でも仕方ない。明日改めてがんばろう

今日の気持ち

  • GOの勉強のはずなのにどんどん違う方向に進んでいる
  • 参った、ホント参った
  • でも諦めない。また明日
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む