追跡ブランチ (tracking branch) というブランチが何なのか調べた

まとめ

追跡ブランチを指定する

git checkout -b fb_track origin/develop

あとから追跡ブランチを指定する

git branch --set-upstream-to origin/[branch-name]

追跡ブランチ (tracking branch) という概念がわからない

以前、「tracking branchを指定していないからgit pull してもこのブランチには更新されないよ〜」と言われたことがあり「???」となったまま疑問を解消せずに放置を決め込んでいた。

いちおうGit/Githubは操作することはできるけど、きちんと理解したいな、疑問点はすぐに解決しないとなと思いたち調べてみました(1年以上放置してきた疑問だけど:p)。

masterorigin/masterの違い

まずは、「masterorigin/masterの違い」についてあなたは説明できますか?

ここで両者の違いを整理した上で追跡ブランチ (tracking branch) について考えればすんなり理解することができます。

詳しくはgit fetchの理解からgit mergeとpullの役割 などを参照してください。

要点は

  • ローカルにはmasterorigin/masterの2つのブランチが存在する。
  • master はローカルの更新を見ている。
  • origin/masterはリモート側の更新を見ている。
  • git fetchを行った際に origin/masterは最新になるがmaster は更新されない。
  • git merge origin/master を行うと master ← origin/mastermerge される。

ということです。

ローカルのブランチには2種類ブランチがあってそれぞれローカル側とリモート側(Githubとか)をチェックしているよと。

で、

  • git pullというコマンドは一度origin/master にリモートの変更点を更新し(ここまで git fetch)、
  • 更新したorigin/master ブランチをorigin ブランチにmerge している(ここまでgit merge)んだよ

ということですね。

自分のところのブランチとサーバー側のブランチを別々にもっておいて突き合わせてマージする、簡単ですね。

追跡ブランチ (tracking branch) について

さて、本題。

リモートブランチからローカルブランチにチェックアウトすると、追跡ブランチ (tracking branch) というブランチが自動的に作成されます。

3.5 Git のブランチ機能 - リモートブランチ

追跡ブランチ (tracking branch) を作成するには以下のコマンドを実行します。

git checkout -b [branch_name] [origin]/[branch_name]

「ローカルにはmasterorigin/masterの2つのブランチが存在する」と上で書きましたが、origin/mastermasterブランチのリモートブランチであり、追跡ブランチです。

`origin/master` == リモートブランチ == 追跡ブランチ (tracking branch) 

です。

新しくローカルにorigin/developブランチからfb_trackというトピックブランチを作成する場合は

git checkout -b fb_track origin/develop # パターンA

とコマンドを打てばいいです。

注意すべきなのはリモートブランチに存在しないブランチ名でチェックアウトする場合です。

[origin]/[branch_name]を指定してあげないと追跡ブランチ (tracking branch)は作成されません。

git checkout -b fb_track # パターンB

追跡ブランチ (tracking branch)を確認する

追跡ブランチ (tracking branch)を確認したい場合以下のコマンドを実行します。

git branch -vv

追跡ブランチ (tracking branch)あり

git checkout -b fb_track origin/develop と指定することで追跡ブランチ (tracking branch) が作成されます。

# パターンA のコマンドでブランチを作成した場合
fb_track 75988fe [origin/develop] FBのトラッキングコードを登録完了ページにのみ設置

※[origin/master]が追跡ブランチ (tracking branch)

追跡ブランチ (tracking branch)なし

もし、[origin]/[branch_name]を指定していなければ追跡ブランチ (tracking branch) は作成されません。

# パターンB のコマンドでブランチを作成した場合
fb_track 75988fe FBのトラッキングコードを登録完了ページにのみ設置

master ブランチにはorigin/masterが追跡ブランチ

おまけ、master ブランチにはorigin/masterブランチが作成されている。

master 496e3e9 [origin/master] クライアント側のキャッシュ保持期間指定

あとから追跡ブランチ (tracking branch)を追加するには

一度、チェックアウトしてファイルの編集も行いコミットもした後に追跡ブランチ (tracking branch)を指定していないことに気づいた。

こういう場合は、

git branch --set-upstream-to origin/[branch-name]

とします。

ローカルブランチがどのリモートブランチを追跡してるのか確認する方法

最後に

リモートブランチに存在しないブランチ名でチェックアウトする場合に追跡ブランチ (tracking branch)がないというのが個人的には???でした。

ようやく放置してきた疑問が解消されたので今日はぐっすり眠れそうです。

Web制作者のためのGitHubの教科書 チームの効率を最大化する共同開発ツール