Git のトラッキングブランチの確認と設定方法


Git でリモートブランチをトラックするローカルブランチをトラッキングブランチと言いますが, トラッキングブランチとはどういうものなのか, どのように確認できるのか, 設定できるのかということを紹介します.

Git のバージョンは 2.18.0 です.

トラッキングブランチとそうでないブランチの違い

そもそもとしてトラッキングブランチとそうでないブランチの違いを軽く説明させていただきたいと思います.

まずトラッキングブランチは git clone <repository> でクローンすると自動的に, <repository> のアクティブなブランチが, トラッキングブランチとして作られます.

通常は master というブランチが, トラッキングブランチとして作られます.

そしてトラッキングブランチとそうでないブランチとの違いは, ローカルレポジトリとリモートレポジトリが紐付いているかどうかということになります.

紐付いていることによって git merge, git pull, git push といったコマンドを引数なしで実行できます.

なぜなら現在のローカルブランチは, どのリモートブランチと繋がっているかという情報があるので, 明示的にリモートレポジトリやブランチを指定する必要がありません.

通常のローカルブランチの場合だと, そのようなどのリモートブランチと繋がっているかという情報がないので, git merge origin/master, git pull origin master, git push origin master のように明示的に指定する必要があります.

あと git status で, どれだけローカルブランチの最後のコミットが, それと紐付いているリモートブランチの最後のコミットよりも進んでいるのか, 遅れているのか, もしくは同じなのかということもわかるようになります.

トラッキングブランチであるかどうかを確認する方法

ローカルブランチがトラッキングブランチであるかどうか確認する場合, ローカルブランチ master がリモート origin のローカルブランチ master のトラッキングブランチであるかという場合, 次のコマンドで確認できます:

git status -sb

トラッキングブランチである場合, 次のように表示されます:

## master...origin/master

origin/master と表示されるので, master はリモート origin のローカルブランチ master をトラックしていると確認できます.

トラッキングブランチでない場合, 次のように表示されます.

## master

どのリモートブランチもトラックしていないと, このようにローカルブランチ master としか表示されません.

もしくはファイル .git/config の中身を見て確認するという方法もあります.

次のように branch.master.remotebranch.master.merge が設定されていれば:

[branch "master"]
    remote = origin
    merge = refs/heads/master

ローカルブランチ master はリモート origin のローカルブランチ master をトラックしていると確認できます.

トラッキングブランチを設定する方法

最初の方でも軽く触れましたが, git clone でリモートレポジトリをクローンすると, リモート origin のローカルブランチ master (リモートブランチ) をトラックするローカルブランチ master が自動的に作られます.

なので git clone 以外の方法でトラッキングブランチを設定する方法をいくつか紹介します.

例として, リモート origin のローカルブランチ development (リモートブランチ) をトラックするローカルブランチ development を設定するということでいきたいと思います.

  1. リモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定する場合:

    git branch development origin/development
    

    リモートブランチ origin/development をベースに, ローカルブランチ development を作り, origin/development をトラックするよう設定します.

  2. リモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定し, チェックアウトする場合

    git checkout -b development origin/development
    

    1 のコマンドと同じなのですが, トラッキングブランチとして設定したローカルブランチ development をチェックアウトします.

    なのでこのコマンドは次のコマンドの速記になります:

    git branch development origin/development
    git checkout development
    
  3. リモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定し, チェックアウトする場合 (その 2):

    git checkout development
    

    2 のコマンドの速記で, origin/development というリモートブランチが存在していて, ローカルブランチ development がローカルレポジトリに存在していない場合, こんなにも簡潔にトラッキングブランチを作ることも可能です.

  4. 現在のローカルブランチをトラッキングブランチとして設定する場合:

    git branch -u origin/development development
    

    もし development というローカルブランチが既に作られていて, そのローカルブランチが origin/development をトラックするように設定する場合, このようなコマンドになります.

    もしくは既に何かのリモートブランチをトラックしていて, そのリモートブランチを別のリモートブランチに変更したいという場合にも使えます.

    オプション -u のロングバージョンが --set-upstream-to なことからわかるように, Upstream (上流) といわゆるリモートブランチを設定します.

    もしローカルブランチ developmentgit checkout development でチェックアウトしている場合, 次のように development の指定を省略することができます:

    git branch -u origin/development
    

ただ 1 と 2 のコマンドで developmentorigin/development をトラックするように設定することができるのは, branch.autoSetupMerge という設定の値がデフォルトで true となっているためです. もしその値を false と設定している場合でも --track オプションを付けると origin/development をトラックするように設定することができます:

git branch --track development origin/development
git checkout -b development --track origin/development

なので branch.autoSetupMerge の設定をいじっていない限り, このように --track オプションを付け加えなくてもリモートブランチをトラックするように設定できます.

トラッキングブランチでなくす方法

トラッキングブランチ development がどのリモートブランチもトラックしないようにする場合, 次のコマンドでそのようにすることができます:

git branch --unset-upstream development

もしくは developmentgit checkout development でチェックアウトしている場合, development の指定を省略できます:

git branch --unset-upstream

まとめ

トラッキングブランチは git clone でクローンすると自動的に origin/master をトラックするローカルブランチ master として作られますが, 他のブランチも他のリモートブランチをトラックさせるという場合には, 今回の内容を参考にしていただければと思います.

Git において git pull, git push といったコマンドは日常茶飯事なので, それらのコマンドを引数なしで使えるようにしてくれるトラッキングブランチは Git をより使いやすくしてくれます.

また上流のリモートブランチとどれだけ差があるのかということも確認できるようになるので, トラッキングブランチは Git においてとても重要な役割を持っていると思います.