M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

André Fachat氏の記事「Git のコマンドだけでなく、その仕組みを学ぶ」でpullとpushを理解する

developerWorksで公開されているAndré Fachat氏の記事「Git のコマンドだけでなく、その仕組みを学ぶ」を読んで、リモート・リポジトリからのpull(fetch+merge)やリモート・リポジトリへのpushの意味がわかった。

鍵となるのは作業者のローカル環境に(つまり.git配下の管理情報として)作成される、リモート・リポジトリへの参照 もしくは リモート・リポジトリのストリームのコピーであるところの「リモート・トラッキングリポジトリ」。

すでにリポジトリーを使用している場合、git remote add コマンドを使用するとリモート・リポジトリーを追加することができます。リモート・リポジトリーを追加した後は、fetch コマンドを使って、独自のリポジトリーにリモート・ブランチのミラーを取り込むことができます。このブランチはリモート・システム上で開発を追跡することから、リモート・トラッキング・ブランチと呼ばれます。

(ローカル・ブランチとしてではなく) リモート・トラッキング・ブランチとしてだけ存在するブランチをチェックアウトすると、Git は自動的にそのリモート・トラッキング・ブランチからローカル・ブランチを作成して、そのブランチをチェックアウトします。

(・・・)

git fetch により、リモート・トラッキング・ブランチが更新されます。更新後のリモート・トラッキング・ブランチとローカル・ブランチの間では、通常のマージ操作を行います (この例では、git checkout master; git merge repo1/master)。フェッチ操作の後は、フェッチされたリモート・ブランチへのショートカットとしてマージ・コマンド内で FETCH_HEAD 名を使用することができます (例えば、git merge FETCH_HEAD)。また、前述の説明と同様に、このマージによる結果は、早送りマージ、競合しないマージ、または手作業で解決する必要がある競合のいずれかとなります。

git pull コマンドは、fetch に merge を組み合わせた便利なコマンドです。

変更をローカル・ブランチにコミットした後は、それらの変更をリモート・ブランチに転送する必要があります。それには、push コマンドを使用して、ローカルの変更をリモート・ブランチにプッシュします。push は pull の反対の操作ではなく、fetch の反対の操作ですが、単なるフェッチの反対の操作以上のことを行い、リモート・ブランチのローカル・コピーを更新するだけでなく、もう一方のリポジトリーのリモート・ブランチも更新します。(引用元

Gitに関するドキュメントや書籍は何度か手にとって読んでいるから、きっとこの「リモート・トラッキング・ブランチ」の概念もこれが初見ではないはずなのだけど、今回はじめて注目できたというか。おかげでpullとpushを理解することができた(気がする)。