ちょっといろいろと触っているGitに関して。
前回は作業ディレクトリ、インデックス、コミットについて説明したのですが、今回はブランチについて行います。
ブランチとは?
訳すと枝になるのですが、Gitでいうと「ある履歴を管理した1つの流れ」とでもいえるでしょうか。
branchなんて全く意識しなくてもgitでadd,commitした瞬間にmasterというディフォルトのブランチができます。
そしてGitでずっと1本の履歴で開発してきたとして、実験的な機能を追加させたい場合は別の履歴をつくることになります。
こういった行為をブランチを作る、といい、上記のケースの場合、2本のブランチを作ることになります。
ブランチを作っておけば、これを切り替えることで1つのディレクトリの中で通常の開発で使うソースと様々な機能を実験的に追加したソースを混合させることができるわけです。
ブランチには三種類ある
ところがgitのbranchといっても一筋縄ではいかないんですよ。
例えばmasterだけのbranchを考えてみても実は3種類あります。
ローカルブランチ
一番わかりやすいのはローカルブランチでしょうか。
普段作業ディレクトリ、インデックス、コミットを行った場合、このコミットの記録が直接記録されているものがローカルブランチですね。
いわばローカルの普通のブランチとでもいえばいいのでしょうか。
リモートブランチ
その次のリモートブランチですが、これはリモートのリポジトリにあるブランチのことです。
リモートは当然物理的に離れたところにあるブランチですので、ローカルにコミットしただけではリモートには反映されません。
ローカルのコミットを反映させたければgit push 、逆にリモートの変更を取り込みたければgit pull(getch)が必要になってきます。
追跡ブランチ
そしてなにより、わかりにくいのがこの追跡ブランチです。
実はリモートの変更を調整する窓口(?)のようなものです。
gitではリモートの変更を取り込むときに、いきなり変更を反映させることもできますが、一時的に別の場所に変更履歴をとりこんでおき、差分をみてからとりこむ、ということもできます。
前者のいきなりとりこむのがgit pullであり、後者がgit fetchになります。
この一時的に変更を取り込んだ時に変更が反映されているのが追跡ブランチになります。
svn→gitへの移行などを行った場合には、追跡ブランチが先にでき、ここからローカルブランチを作る必要があります。
git branchの見方
例えばgit branch -aとなったときに下記のような一覧が現れます。
1 2 3 |
* master remotes/origin/HEAD -> origin/master remotes/origin/master |
まずremotesがついていないものは普通のローカルブランチです。
この場合、masterがローカルブランチで※がついているのは現在参照をしているブランチという意味です。
次の remotes/origin/master というのが追跡ブランチのことです。
ちなみに remotes/origin/HEAD→origin/master というのは現在のHEADのbranchを指します。
参考リンク