ページ目次
Gitでよくリモートとローカルにずれが生じるという方
それは私です
うまく説明できなくて申し訳ないのですが、gitって、よくなにがどうなってるのか分からなくなりませんか?
自分の理解がダメダメなのだとは思いますが、よくリモートとHEADがずれたり、pushしようにもできなかったり…。
そういうわけで、自分がこんがらがるところをまとめておこうと思います。参考になるようであれば幸いです。
トラッキングブランチの存在を忘れがち
origin/masterってのがトラッキングブランチ
自分の中では、これが結構肝でした。この存在を頭に置いているといないとでは、だいぶ混乱具合も変化しました。
pullとかfetchしたときによく表示される「origin/master」、これがトラッキングブランチというものです。
では、トラッキングブランチってのは一体なんなのか。
ローカルリポジトリにしれっと存在している
まずgitにはリモートとローカルがあります。端的に言うならば、ローカルは自分のPC、リモートは遠くのサーバーとかPCです(なんてアバウトな汗)。
トラッキングブランチは、その間にしれっと存在しているブランチです(ローカル側にある)。リモートにあるブランチの変更を追いかけています。そしてローカルとリモートの各ブランチを結びつけているのです。
したがって、origin/masterというのは、『リモートリポジトリoriginのmasterブランチを追いかけるブランチ』ということになります。
git pullとfetch
pullはfetch + merge
これはよく言われています。が、厳密に言うとそうではない。と、いう記事も見かけたことがあるような、ないような。。。
とりあえずfetchが基本だと考えます。pullはすべてを理解した上でfetchもmergeも一緒にやってしまえ!という場合に使う。よって基本はfetch。
まずはトラッキングブランチが更新される!
$ git fetch
fetchします。しかし実際にさわっているローカルのブランチにはなにも変化はありません。ここで更新されているのはトラッキングブランチ(origin/master)だけなのです!
※正しくは、「origin/*」。ローカルに存在しているトラッキングブランチ全てを指す。
この「リモート→トラッキングブランチ→実際のローカルブランチ」。この流れを意識しているかどうか。が、結構重要です(個人的には)。
そして、トラッキングブランチをmergeすることでローカルのブランチがようやく変更されます。
$ git merge orgin/master
これを一気にやってしまうのがpullです。
fetchとpullの引数
$ git fetch
$ git pull
上記のコマンドを実行するとどうなるか。gitの設定ファイル(.git/config)によって変わりますが、基本的には、「originっていうリモートのブランチを全部持ってこい。」と、いうことになります。
まずfetchの場合は、正式には下記のようなコマンドになります。[]で囲まれた部分が省略されています。ここでのローカルの保存場所というのは、上述の各トラッキングブランチとなります。
git fetch [リモートリポジトリ名] [リモートブランチすべて:ローカルの保存場所(それぞれのトラッキングブランチ)]
この省略はpullに関しても同じです。しかし、開発の関係から「ローカルのmasterにmergeされたくない!」という場合もあると思います。そういう時はこうします。
$ git pull [リモートリポジトリ名] [ブランチ名]
例: git pull origin branch_a
この場合のmerge先はカレントブランチです。よって、上記の例で言うならば、リモート(origin)のブランチ(brach_a)を現在のローカルブランチにmergeするということになります。
こうやって文章にすると、理解がすすんで頭の中がスッキリしてきました!
“【Git】トラッキングブランチの存在を意識して理解を深める” への1件の返信
コメントは受け付けていません。