【Git】トラッキングブランチの存在を意識して理解を深める

理解できない

Gitでよくリモートとローカルにずれが生じるという方

それは私です

うまく説明できなくて申し訳ないのですが、gitって、よくなにがどうなってるのか分からなくなりませんか?

自分の理解がダメダメなのだとは思いますが、よくリモートとHEADがずれたり、pushしようにもできなかったり…。

そういうわけで、自分がこんがらがるところをまとめておこうと思います。参考になるようであれば幸いです。

トラッキングブランチの存在を忘れがち

origin/masterってのがトラッキングブランチ

自分の中では、これが結構肝でした。この存在を頭に置いているといないとでは、だいぶ混乱具合も変化しました。

pullとかfetchしたときによく表示される「origin/master」、これがトラッキングブランチというものです。

では、トラッキングブランチってのは一体なんなのか。

ローカルリポジトリにしれっと存在している

まずgitにはリモートとローカルがあります。端的に言うならば、ローカルは自分のPCリモートは遠くのサーバーとかPCです(なんてアバウトな汗)。

トラッキングブランチは、その間にしれっと存在しているブランチです(ローカル側にある)。リモートにあるブランチの変更を追いかけています。そしてローカルとリモートの各ブランチを結びつけているのです。

したがって、origin/masterというのは、『リモートリポジトリoriginのmasterブランチを追いかけるブランチ』ということになります。

gitのトラッキングブランチ

git pullとfetch

pullはfetch + merge

これはよく言われています。が、厳密に言うとそうではない。と、いう記事も見かけたことがあるような、ないような。。。

とりあえずfetchが基本だと考えます。pullはすべてを理解した上でfetchもmergeも一緒にやってしまえ!という場合に使う。よって基本はfetch

まずはトラッキングブランチが更新される!

$ git fetch

fetchします。しかし実際にさわっているローカルのブランチにはなにも変化はありません。ここで更新されているのはトラッキングブランチ(origin/master)だけなのです!
※正しくは、「origin/*」。ローカルに存在しているトラッキングブランチ全てを指す。

この「リモートトラッキングブランチ実際のローカルブランチ」。この流れを意識しているかどうか。が、結構重要です(個人的には)。

そして、トラッキングブランチをmergeすることでローカルのブランチがようやく変更されます。

$ git merge orgin/master

これを一気にやってしまうのがpullです。

git pullやfetchの流れ

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するということになります。

こうやって文章にすると、理解がすすんで頭の中がスッキリしてきました!

(Visited 6,046 times, 1 visits today)

“【Git】トラッキングブランチの存在を意識して理解を深める” への1件の返信

コメントは受け付けていません。