7

StackOverflowで数回引用された記事(例: 1git push )で、著者はとの間の非対称性について説明しgit pull、次のように述べています。

更新:David Ongaroに感謝します。彼は、git 1.7.4.2以降、push.defaultオプションの推奨値は、追跡ではなくアップストリームですが、追跡は非推奨の同義語として使用できます。リモートリポジトリのアップストリームブランチとのこの関連付けを設定するコンテキストで「トラック」という用語を廃止する取り組みが進行中であることを示唆しているため、変更を説明するコミットメッセージは素晴らしいです。(gitブランチの「track」のまったく異なる意味--trackと「remote-trackingbranchs」は、gitを人々に紹介しようとしたときに長い間私を苛立たせてきました。)

彼が言及している正確な違いは何ですか:

  • gitブランチの「トラッキング」の概念--track
  • リモートトラッキングブランチでの「トラッキング」の概念

最後の文で?

4

2 に答える 2

8

私はその文の作者ではないので、確信が持てません。著者が説明している混乱は、「追跡」ブランチと「リモート追跡」ブランチの間の一般的な混乱であると考えてみましょう。gitguysにはこれに関する素晴らしい記事がありますので、実際に読んでください。彼らは素敵な写真とすべてを持っています。

これが私の見解です...

設定

例として、github に非常に単純な git リポジトリがありmaster、いくつかのコミット (C1 と C2、C2 が現在のコミット) を持つ単一のブランチがあるとします。そのリポジトリをクローンすると...

git clone git@github.com:example/repo.git

...次の 2 つのことが起こります。

  1. すべてのコミット (C1 と C2) をローカル コンピューターにコピーします。
  2. また、ローカル コンピュータに という新しいブランチを作成しますmaster。このブランチは「追跡ブランチ」であり、その HEAD は C2 にあります。このブランチは「追跡ブランチ」と呼ばれます。

新しいコミット

これまでのところ、特別なことは何もありません。しかし、これらの説明を読んでいる間に、誰かが別のコミット (C3) をコミットし、それをリモート リポジトリにプッシュしました。この新しい素晴らしいコミットについて聞いて、自分でそれを取得しようと決心したとします。

git fetch

これにより、次の 2 つのことが行われます。

  1. 必要な新しいコミット (C3) をローカル コンピューターにコピーします。
  2. master何らかの方法でローカル システムを更新して、Origin のブランチが現在 C3 にあることを知らせます。

masterしかし、ここで問題があります。ローカル システムは、オリジンのブランチが C3 にあることをどのように認識しているのでしょうか。確かにgitにはその情報をローカルに保存する方法がありますか? しかしここで?masterマージする必要があるローカル ブランチに独自のコミットやその他の変更がある可能性があるため、実際にはローカル ブランチに変更を加えることはできません。他の不明なブロブに保存されているだけですか?

答え

結局のところ、git は3 番目のブランチを使用しているだけです。現在、次の 2 つのブランチについてわかっています。

  1. github に物理的に配置されているブランチ。
  2. あなたのコンピュータ上にある「追跡ブランチ」(いわゆるmaster)。

3番目があることがわかりました。おそらく以前に見たことがあるでしょう。それは と呼ばれていorigin/masterます。そして、これら 2 つのブランチのいずれとも同じではありません。これは、「リモート追跡ブランチ」として知られているものです。

masterこれは、ローカルブランチとオリジンのブランチの間にあるブランチと考えることができますmaster。これは、コンピューター上の実際の git ブランチ (のようにmaster) であり、他のブランチ間をジャンプする方法と同じように操作できます。ただし、制限があります。

たとえば、あなたはそれをチェックアウトすることができます...

git checkout origin/master

ただし、おかしなメッセージが表示されます...

Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 12dbe6a... My awesome commit!

このメッセージが表示されるのは、「リモート追跡ブランチ」が読み取り専用であるためです。ユーザーは、できるようにそれらを操作することはできませんmaster。変更を加えることができるのは git システム自体だけです (これはフェッチ中に行われます)。そのため、実装の観点からは、それらを他のブランチと考えることができます。ただし、読み取り専用であるため、通常、他のブランチのように使用することはありません。

つまり、実際には、3 つのブランチが混在しています。

  1. github に物理的に配置されているブランチ。
  2. マシン上に物理的に配置されたorigin/masterブランチ (「リモート トラッキング ブランチ」)。
  3. マシン上に物理的に配置されたmasterブランチ (「追跡ブランチ」)。

質問に答えるには...

したがって、私の推測では、「追跡」ブランチと「リモート追跡」ブランチの間に実際に混乱が生じる可能性があります。誰かがmaster「リモート追跡ブランチ」と混同するのは理にかなっていますが (結局、origin/master! からコミットを取得します)、実際にはそうではありません。それは「追跡ブランチ」であり、追跡するブランチは ですorigin/masterorigin/master「リモート追跡ブランチ」です。

誰かが git branch --track に関して「追跡」について話すとき、彼らはあなたが変更できる「追跡」ブランチについて話しています。

誰かが「リモート追跡ブランチ」について話すとき、彼らはリモートのブランチを追跡する読み取り専用ブランチについて話しています。

于 2012-10-02T22:48:39.200 に答える