Gitのブランチの使い方
Gitのブランチの使い方についてまとめました。
ブランチとは
ブランチとは、コミットファイルを指し示したリンクのことです。並行して複数機能を開発するために使う機能です。デフォルトはマスターブランチで、他にブランチをいくつもつくることができます。マスターブランチは、たとえばコミットファイル5が最新とすると、そのコミットファイル5を指し示すリンクです。他のブランチも同様に最新コミットファイルのコミットIDを保持して、それを指し示すようなシンプルな仕組みになっています。
そして、HEADとは今自分が作業しているブランチを指し示したリンクのようものです。
ref:ブランチ名と紐付け情報がHEADで保持されています。このようにHEADもシンプルな仕組みで現在の作業中のブランチ指し示しています。
ブランチもHEADもリポジトリに記録されています。
リポジトリの.git/HEADというところにHEADは格納され、.git/refsにブランチが格納されています。
ブランチの仕組み
Gitのデータの持ち方は、リポジトリの中に、圧縮ファイル、ツリーファイル、コミットファイルを保存しています。
コミットファイルには40文字の一意のハッシュ値が設定されています。
コミットファイルは、その時のスナップショットと一つ前のコミットファイルのハッシュ値(親ファイル)を保持しています。
その親ファイルのハッシュ値をたどることで時系列にさかのぼることが可能です。
スナップショットで各データを保存して、親ファイルのハッシュ値でそのときのデータを記録していて、たどることができるのがGitの重要な仕組みです。
ブランチは、最新のコミットファイルの指し示すリンクのようなもので、コミットファイルが新しくできればそちらを指し示します。
HEADは、現在作業をしているブランチを指示したリンクです。
たとえば、masterブランチ、featureブランチ、reviewブランチなどがあったとします。コミット1をmasterブランチが指し示しているときに、別のコミットをしてコミット2をfeature、コミット3をreviewブランチが指し示す、といった具合に枝分かれして別々のコミットファイルを指し示すことができます。さらにブランチは最新のコミットファイルにリンクしているので、それぞれの追跡が可能となります。
そして、ブランチの中身は、最新のコミットファイルのハッシュ値を記録しているだけです。
HEADの中身も同じくシンプルで、ref:masterなどreference(参照先)のブランチ名を記録しているだけです。
そして、ブランチもHEADもリポジトリに保管されており、.git/refs/にブランチ、.git/HEADにHEADが記録されています。
ブランチのコマンド
新しくブランチを作成する
git branch ブランチ名
git branch review
git branchコマンドは、新しくブランチを作成するだけで、そのブランチに自動的に切り替わるわけではない点に注意しましょう。
ブランチの一覧を表示する
git branch
git branch -a
-a(all)はリモートリポジトリにあるすべてのブランチも含めて表示することができます。
そして、表示結果に*の印がついているものが現在のブランチです。
そして、
git log --oneline --decorate
というコマンドでどのブランチがどのコミットファイルを指し示しているかを確認することができます。
既に作成済のブランチに切り替え
git checkout 切り替えたいブランチ名
git checkout review
ブランチを新規作成して切り替える
git checkout -b 新ブランチ名
現在作業中のブランチの切り替えは、HEADが指し示すブランチを変更することになります。
すでに作成しているブランチに切り替えたい場合は、git checkoutコマンドで既存のブランチ名を指定します。
そして -bオプションをつけて新しいブランチ名を書くことで、新規作成してその新しいブランチへ切り替えることができます。
ブランチ名を変更したいとき
git branch -m 新しいブランチ名
自分が作業しているブランチの名前を変更することができます。
mはmoveの略で、新しいブランチ名に移動させるという意味です。
ブランチ名を削除したいとき
git branch -d ブランチ名
dはdeleteの略です。マスターにまだマージされていない変更が残っている場合、削除しません。安全な削除です。
強制削除する
git branch -D ブランチ名
完全に不要なブランチの場合は、強制削除を使います。
ブランチを利用した開発の流れ
- masterブランチをリリース用のブランチとして利用
- 開発はトピックブランチを作成して進める
というのが基本です。
masterでの開発はせず、トピック用にブランチを作ってはmasterにマージするようにしていきます。
masterブランチで登録した内容を開発用ブランチに適用する
masterブランチで登録した内容を開発用ブランチに適用したい場合、
git branch ブランチ名
で開発を進めるためのブランチに移動して、
git merge master
でマージします。
リモートブランチについて
リモートブランチとは、リモートのブランチの状態へのリンクのようなものです。
リモートリポジトリは、共同開発しているときは、他の人がマスターを更新していくため、自分のローカルリポジトリよりも最新の状態となります。
そのため、リモートリポジトリからfetchして情報を得ます。その時に使うコマンドがgit fetchです。
コマンドを実行すると、origin/masterといったリモート名/ブランチ名のブランチが作成されます。それらがリモートブランチです。