Git で「追跡ブランチ」って言うのやめましょう


TL;DR

突然ですがクイズです。「追跡ブランチ (tracking branch)」という言葉の使い方で正しいのはどれだと思いますか?

  1. origin/master はリモートリポジトリの master を追跡する追跡ブランチである
  2. origin/master はローカルの master に追跡される追跡ブランチである
  3. ローカルの masterorigin/master を追跡する追跡ブランチである

現在の正解は多分3番です。過去には1番でした。

分からなかった方、分かったけど他人に「追跡ブランチ」と言って伝わるか不安な方。大丈夫です。正確な用語1で言い換えることにしましょう。

  1. origin/master はリモートリポジトリの master を追跡するリモート追跡ブランチ (remote-tracking branch)である
  2. origin/master はローカルの master ブランチの上流ブランチ (upstream branch)である
  3. ローカルの masterorigin/master を上流ブランチとする

図で表すとこんな感じです。

これで安心ですね。

解説

「追跡ブランチ (tracking branch)」が何であるか考える前に、 Git の2つの概念について確認しておきましょう。「リモート追跡ブランチ (remote-tracking branch)」と「上流ブランチ (upstream branch)」です。

リモート追跡ブランチは「ローカルリポジトリにあって、他のリポジトリの状態を追跡するブランチ」のことです。 git fetch すると更新されるあのブランチです。たんにリモートブランチということもあります。たとえば origin/master はリモートリポジトリ originmaster ブランチを追っているリモート追跡ブランチです。

上流ブランチは大雑把にいうと「引数なしで git pull したとき対象になるブランチ」のことです。たとえば master をチェックアウトして git pull すると自動的に origin/master の変更を引っ張ってきますね。ここで origin/master はローカルブランチ master の上流ブランチです。「masterorigin/master を追跡 (tracking) している」ともいいます。

さて、どちらにも追跡という言葉が出てきました。これが混乱の元です。現在のところ「masterorigin/master を追跡している。だから master は追跡ブランチである」というのが正しい捉え方だと思います。 Pro Git Book は追跡ブランチをそのように説明しています。

ところが、上流ブランチのことを追跡ブランチと呼ぶ記述をときどき見かけます。日本語では追跡の対象とされるほうを追跡ブランチと呼んでも違和感がないからでしょう。2また、ふつう上流ブランチにはリモート追跡ブランチを選ぶので、上流ブランチとリモート追跡ブランチを混同したうえ追跡ブランチと呼んでいるらしき記述が英語でも見られます。3

過去に遡ってみると、 Git は現在のリモート追跡ブランチのことを単に追跡ブランチとも呼んでいました。 Git v1.5.0 の gitglossary には以下のように書かれています:

tracking branch::
A regular git branch that is used to follow changes from
another repository.  A tracking branch should not contain
direct modifications or have local commits made to it.
A tracking branch can usually be identified as the
right-hand-side ref in a Pull: refspec.

訳:追跡ブランチは他のリポジトリの変更を追う普通のブランチである。追跡ブランチは直接編集したりコミットしたりすべきではない。(略)

当時は上流ブランチという用語は(少なくとも gitglossary には)ありませんでした。記憶が正しければ、現在でいうところの上流ブランチにあたるものも追跡ブランチと呼んでいたように思います。たいていの場合はこれでも問題ありませんでした。ふつうはリモート追跡ブランチを上流に設定するものです。

厄介なのは、(あまりやらないにせよ)ローカルブランチは他のローカルブランチを上流に設定することもできるという点でした。このとき上流側のローカルブランチは慣習的に追跡ブランチと呼ばれた(はず)ですが、ローカルブランチは明らかに当時の定義でいう追跡ブランチではありません。さらに「上流に設定する」ことを「追跡する」とも言ったので、下流側のローカルブランチこそ追跡ブランチと呼ぶこともできそうでした。

これでは不便ということで、v1.7を前後して上流ブランチという用語が追加され、 Git のマニュアルの中ではリモート追跡ブランチと上流ブランチが使い分けられるようになりました。また git branch --track オプションに加えて git branch --set-upstream-to オプションが追加されるなど、「(ローカルブランチが別のブランチを)追跡する」という動詞は「上流に設定する」へと徐々に置き換えられていっています。それでもなお、かつての用語の混乱は今に影響を残しているのです。

ややこしいですね。それもこれも追跡ブランチという言葉があるからです。「追跡ブランチ」って言うのやめましょう


  1. 詳しくは git help glossary を参照(オンラインでも読めます)。 

  2. たとえばこの記事には “origin/masterはmasterブランチのリモートブランチであり、追跡ブランチです” とあります。追跡対象の意味で追跡ブランチと書いているようです。 

  3. Pro Git Book には “Checking out a local branch from a remote-tracking branch automatically creates what is called a “tracking branch” (or sometimes an “upstream branch”). Tracking branches are local branches that have a direct relationship to a remote branch” という記述があります。上流ブランチと追跡ブランチを混同しているようです。