追跡ブランチ (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)。
master
とorigin/master
の違い
まずは、「master
とorigin/master
の違い」についてあなたは説明できますか?
ここで両者の違いを整理した上で追跡ブランチ (tracking branch) について考えればすんなり理解することができます。
詳しくはgit fetchの理解からgit mergeとpullの役割 などを参照してください。
要点は
- ローカルには
master
とorigin/master
の2つのブランチが存在する。 master
はローカルの更新を見ている。origin/master
はリモート側の更新を見ている。git fetch
を行った際にorigin/master
は最新になるがmaster
は更新されない。git merge origin/master
を行うとmaster ← origin/master
へmerge
される。
ということです。
ローカルのブランチには2種類ブランチがあってそれぞれローカル側とリモート側(Githubとか)をチェックしているよと。
で、
git pull
というコマンドは一度origin/master にリモートの変更点を更新し(ここまでgit fetch
)、- 更新した
origin/master
ブランチをorigin
ブランチにmerge
している(ここまでgit merge
)んだよ
ということですね。
自分のところのブランチとサーバー側のブランチを別々にもっておいて突き合わせてマージする、簡単ですね。
追跡ブランチ (tracking branch) について
さて、本題。
リモートブランチからローカルブランチにチェックアウトすると、追跡ブランチ (tracking branch) というブランチが自動的に作成されます。
追跡ブランチ (tracking branch) を作成するには以下のコマンドを実行します。
git checkout -b [branch_name] [origin]/[branch_name]
「ローカルにはmaster
とorigin/master
の2つのブランチが存在する」と上で書きましたが、origin/master
はmaster
ブランチのリモートブランチであり、追跡ブランチです。
`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)がないというのが個人的には???でした。
ようやく放置してきた疑問が解消されたので今日はぐっすり眠れそうです。