まくまくGitノート
共有リポジトリからの fetch と push
2010-07-22

共有リポジトリから変更を取得する (fetch)

リモートリポジトリ(共有リポジトリ)をクローンしてきた後に、他のユーザによって行われたリモート上での変更を再度取得するには git fetch コマンドを使用します。

$ git fetch

リモートリポジトリから fetch してきた内容は、直ちに現在チェックアウトしているブランチに反映されるということはなく、いったん自分の PC 上のリモートトラッキングブランチ (remote-tracking branch)というところに格納されます。

自分の PC 上のリモートトラッキングブランチを確認するには、git branch コマンドに -r オプションを付けて実行します。

$ git branch -r
  origin/HEAD
  origin/master

origin/ というプレフィックスは、トラック対象となっているリモートリポジトリの名前を示しています。 最初に git clone したリモートリポジトリには、デフォルトで origin という略称がつけられており、上記の出力は、この origin リモートリポジトリをトラックするためのリモートトラッキングブランチであることを示しています。

origin/HEADorigin/master というブランチは、ローカルブランチと区別して、リモートトラッキングブランチと呼びます。

fetch してきた変更をローカルブランチにマージする

git fetch によってリモートリポジトリから取得してきた変更内容は、自分の PC 上のリモートトラッキングブランチ(origin/master など)に格納されます。 つまり、ローカルブランチ(master など)にはまだコミット内容が反映されていない状態です。

この変更をローカルブランチに対してコミットされた状態にするには、リモートトラッキングブランチ (origin/master) 上のコミット内容を、ローカルブランチ (master) にマージする必要があります。

$ git checkout master  # master ブランチに切り替える(必要があれば)
$ git merge origin     # リモートトラッキングブランチをローカルブランチ master にマージ

git merge が成功すると、ローカルブランチにリモートブランチの内容がコミットされた状態になります。 git log でちゃんとマージされていることを確認できます。

$ git log   # ローカルの master ブランチに内容が取り込まれていることを確認

git fetchgit merge をまとめて実行する git pull というコマンドもあります。 ただ、慣れるまでは、git fetchgit merge は別々に実行して、動きをちゃんと理解するようにしたほうがよいでしょう。 git pullgit merge まで一気に実行するため、変更内容のコンフリクトが発生して頭を抱えることがありますが、git fetch 単独の実行が失敗することはほとんどありません。 git fetch さえ実行しておけば、他のユーザが共有サーバ上で行った変更を git log origin/master コマンドで確認することができます。

ローカルブランチの変更を共有リポジトリに push する

ローカルブランチ master に対してコミットした変更を、リモートリポジトリ(共有リポジトリ)に送りたい場合は、次のようにします。

$ git push origin master:master

上記の master:master という部分は、<ローカルブランチ名>:<リモートブランチ名> というペア情報を表しています。 つまり、上記のコマンドは、「origin というリモートリポジトリに対して、ローカルの master ブランチを、master ブランチという名前で push する」という操作を表しています。 ローカルブランチ名とリモートブランチ名が master:master のように同じ名前の場合は、次のように省略して指定することができます。

$ git push origin master

さらに、プッシュ先のリモートリポジトリ名が origin であり、現在チェックアウトしているブランチの内容を push したいのであれば、以下のようにパラメータをすべて省略することができます。

$ git push

push される内容を事前に確認する (dry run)

共有サーバーへの push は、多数のユーザに影響を与える作業であるため、最初のうちは若干緊張するかもしれません。 コマンド実行時に --dry-run オプションを付けて実行すれば、どのような処理が行われるかをシミュレートできるので、まずはこれで何が起こるかを確認してから、実際の push 作業を行うとよいかもしれません。

$ git push --dry-run
2010-07-22