minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

ブランチについて、補足です。

ブランチヘッド

ブランチはその名の通り、枝として表現されます。

$ gitk
        o--o--o <-- Branch A
       /
o--o--o <-- master
       \
        o--o--o <-- Branch B

コミットをする度に枝は伸びていき、新しくブランチを作れば枝分かれします。
ここでは時間軸は右に伸びています。つまり、新しい方が右です。
枝は常に右方向(右上、右下)に伸びていきます。左方向に伸びることは決してありません。

git には、枝の状態をグラフィカルに表示してくれる便利なツールがあります。

$ gitk

ここで、master ブランチとは何を指すでしょうか?
中央に通っている一本の枝、が正解です。
枝には3つのコミットがありますが、そのどれもが master ブランチです。
その中でも特に、最新のコミットをブランチヘッドと言います。
master ブランチにある一番右のコミットが、master のブランチヘッドです。

では、Branch A は何を指すでしょうか。
上を通る枝がそうです。6つのコミットがあり、全てが Branch A ブランチに属します。
最初の3つのコミットは、master ブランチと共通しています。
その中でも一番右のコミットが、Branch A のブランチヘッドです。

ブランチヘッドだけがブランチではありません。
例えば Branch A の右から二番目のコミット、これも Branch A ブランチの一部です。
この状態のファイルを取得したい場合は、以下のようにします。

$ git checkout 427abfa...

前述したように、全てのコミットにはIDが付いています。
このIDを指定すれば、その状態でのファイルを取得することができます。

では以下はどうでしょうか。

$ git checkout Branch_A

これは、Branch A のブランチヘッドの状態を取得します。
このように、ブランチ名は「そのブランチヘッドのコミットIDを示すためのエイリアス」として認識されます。

$ git branch
  master
* Branch_A
  Branch_B

一つ戻って、Branch A の右から二番目のコミットを取得します。
このとき git branch の結果はどうなるでしょう。

$ git checkout 427abfa...
$ git branch
* (no branch)
  master
  Branch_A
  Branch_B

このようにブランチヘッド以外の場所にいるとき、no branch と表示されます。
この状態を「切り離されている (detached)」と言います。
通常、切り離された状態で編集作業をすることはありません。
特定の状態を取得したり、そこから新しい枝を増やしたりするときに一時的に使うものです。

ブランチの削除

ブランチを削除する、とはどういうことでしょうか?
では先ほどの状態で Branch A を削除してみましょう。

$ gitk
        o  o  o
        
o--o--o <-- master
       \
        o--o--o <-- Branch B

図で見るとわかりやすいですね。ブランチを削除すると、その名の通り枝が削除されます。
このとき、上に残る3つのコミットを「到達不可能なコミット」と言います。
ですからこういったブランチを削除するときには警告が出るのです。

しかしブランチを削除しても、相変わらずコミット自体は生きています。
ですから開発者はこのコミットのIDを使用してこれらのコミットを取得することが可能です。

コミットの範囲指定

コミットの内容を見るとき、特定の範囲に絞って見たいことがあります。
いくつか指定方法がありますので、見ていきましょう。

$ gitk master..
        ●--●--● <-- Branch A
       /
o--o--○ <-- master
       \
        ●--●--● <-- Branch B

これは、master(のブランチヘッド)以降のコミットが表示されます。
このことを「master から到達不能なコミット」と言います。
逆に、master の最新コミットを起点として、左方向に伸びる全ての枝によって到達できるのが
「master から到達可能なコミット」です。

$ gitk master..Branch_A
        ●--●--● <-- Branch A
       /
o--o--○ <-- master
       \
        o--o--o <-- Branch B

これは「master から到達不可能で、Branch A から到達可能なコミット」を表します。
つまり、master から枝分かれした Branch A がその後コミットしてきた全ての内容になります。

$ gitk Branch_A..Branch_B
        o--o--o <-- Branch A
       /
o--o--○ <-- master
       \
        ●--●--● <-- Branch B

        o--o--o <-- Branch A
       /
o--○-o <-- master
    \
     ●--●--● <-- Branch B

     o--o--o <-- Branch A
    /
o--○--● <-- master
        \
         ●--●--● <-- Branch B

これは「Branch A から到達不可能で、Branch B から到達可能なコミット」を表します。
簡単に言うとこれは、「両者のブランチの共通祖先から、Branch Bのみが加えた変更」の全てを表します。

まとめ

ある一つのブランチを見たとき、以下の共通点があります。