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.remote と branch.master.merge が設定されていれば:
[branch "master"]
remote = origin
merge = refs/heads/master
ローカルブランチ master はリモート origin のローカルブランチ master をトラックしていると確認できます.
トラッキングブランチを設定する方法
最初の方でも軽く触れましたが, git clone でリモートレポジトリをクローンすると, リモート origin のローカルブランチ master (リモートブランチ) をトラックするローカルブランチ master が自動的に作られます.
なので git clone 以外の方法でトラッキングブランチを設定する方法をいくつか紹介します.
例として, リモート origin のローカルブランチ development (リモートブランチ) をトラックするローカルブランチ development を設定するということでいきたいと思います.
リモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定する場合:
git branch development origin/developmentリモートブランチ
origin/developmentをベースに, ローカルブランチdevelopmentを作り,origin/developmentをトラックするよう設定します.リモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定し, チェックアウトする場合
git checkout -b development origin/development1 のコマンドと同じなのですが, トラッキングブランチとして設定したローカルブランチ
developmentをチェックアウトします.なのでこのコマンドは次のコマンドの速記になります:
git branch development origin/development git checkout developmentリモートブランチを基にしてローカルブランチを作りトラッキングブランチとして設定し, チェックアウトする場合 (その 2):
git checkout development2 のコマンドの速記で,
origin/developmentというリモートブランチが存在していて, ローカルブランチdevelopmentがローカルレポジトリに存在していない場合, こんなにも簡潔にトラッキングブランチを作ることも可能です.現在のローカルブランチをトラッキングブランチとして設定する場合:
git branch -u origin/development developmentもし
developmentというローカルブランチが既に作られていて, そのローカルブランチがorigin/developmentをトラックするように設定する場合, このようなコマンドになります.もしくは既に何かのリモートブランチをトラックしていて, そのリモートブランチを別のリモートブランチに変更したいという場合にも使えます.
オプション
-uのロングバージョンが--set-upstream-toなことからわかるように, Upstream (上流) といわゆるリモートブランチを設定します.もしローカルブランチ
developmentをgit checkout developmentでチェックアウトしている場合, 次のようにdevelopmentの指定を省略することができます:git branch -u origin/development
ただ 1 と 2 のコマンドで development が origin/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
もしくは development を git checkout development でチェックアウトしている場合, development の指定を省略できます:
git branch --unset-upstream
まとめ
トラッキングブランチは git clone でクローンすると自動的に origin/master をトラックするローカルブランチ master として作られますが, 他のブランチも他のリモートブランチをトラックさせるという場合には, 今回の内容を参考にしていただければと思います.
Git において git pull, git push といったコマンドは日常茶飯事なので, それらのコマンドを引数なしで使えるようにしてくれるトラッキングブランチは Git をより使いやすくしてくれます.
また上流のリモートブランチとどれだけ差があるのかということも確認できるようになるので, トラッキングブランチは Git においてとても重要な役割を持っていると思います.
関連記事
Git の Pull コマンドの使い方2018.06.07
git rebase でヒストリを直線的にする方法と使う時の注意点2018.08.13
Git のコミット履歴を大胆に書き換えるなら git rebase -i がオススメ2018.08.23
Git の mergetool で vimdiff を指定して Vim でマージコンフリクトを解決してみた2018.08.20
Git の difftool と mergetool コマンドが Neovim を使うように設定してみた2018.08.21