在git中“tracking”的含义是什么?

7
在StackOverflow上多次引用的一篇文章(例如1),作者讨论了git pushgit pull之间的不对称性,并提到以下内容:

更新:感谢David Ongaro指出,自从git 1.7.4.2以来,推荐的push.default选项值是upstream而不是tracking,尽管可以将tracking作为弃用的同义词使用。描述该更改的提交消息很好,因为它表明正在努力废除“track”一词,以在远程存储库中设置与上游分支的关联。(在介绍git时,“track”在git branch --track和“remote-tracking分支”中具有完全不同的含义,这长期以来一直使我感到恼火。)

他所指的区别是什么?
  • 跟踪在git branch --track中的含义
  • 跟踪在远程跟踪分支中的含义

最后一句话中的跟踪是什么意思?

2个回答

9

我不能确定,因为我不是那句话的作者。但我猜测作者所描述的混淆是“跟踪”和“远程跟踪”分支之间的普遍混淆。gitguys有一篇很棒的文章介绍了这个问题,你应该去读一下。他们有漂亮的图片和详细的解释。

以下是我的理解...

背景

举个例子,假设我们在github上有一个非常简单的git仓库,只有一个master分支,并有几个提交(C1和C2,其中C2是当前提交)。当你克隆该仓库时...

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

当你执行 git clone 命令时,会发生以下两件事情:

  1. 你会将所有的提交记录(C1 和 C2)复制到你的本地电脑上。
  2. 你还会在本地电脑上创建一个名为 master 的新分支。这个分支是一个“跟踪分支”,它的 HEAD 指向 C2。这个分支被称为“跟踪分支”。

新的提交记录

到目前为止,一切都很正常。但是在你阅读这些说明的同时,有人提交了另一个提交记录(C3)并将其推送到远程仓库。现在想象一下,你听说了这个新的惊人提交记录,并决定自己检索它。

git fetch

这会做两件事情:
  1. 将所需的新提交(C3)复制到您的本地计算机。
  2. 以某种方式更新本地系统,让它们知道 origin 的 master 分支现在在 C3 上。
但问题是:本地系统如何知道 origin 的 master 分支在 C3 上?Git 肯定有一种方法在本地存储该信息,但存储在哪里呢?我们不能实际更改本地 master 分支,因为我们可能在该本地分支上有自己的提交或其他更改需要合并。它只是存储在其他未知的 Blob 中吗?
答案是:Git 实际上使用了第三个分支。目前,我们知道两个分支:
  1. 位于 GitHub 上的物理分支。
  2. 位于您计算机上的“跟踪分支”(您称之为 master)。
原来还有第三个分支。你可能以前见过它:它叫做 origin/master。它与这两个分支都不同。它被称为“远程跟踪分支”。
您可以将其视为位于本地 master 分支和 origin 的 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系统本身可以对其进行更改(在获取时会这样做)。因此,从实现的角度来看,您可以将它们视为任何其他分支。但是,由于它们是只读的,通常不会像使用其他分支一样使用它们。
因此,实际上,我们混合了三个分支:
1. 物理位于github上的分支。 2. 物理位于您的计算机上的origin/master分支(“远程跟踪分支”)。 3. 物理位于您的计算机上的master分支(“跟踪分支”)。
回答问题...
因此,我认为真正的混淆可能在于“跟踪”和“远程跟踪”分支之间。有人会把master误认为是“远程跟踪分支”(毕竟,它确实从origin/master获取提交!),但实际上不是。它是一个“跟踪分支”,而它所跟踪的分支是origin/masterorigin/master是“远程跟踪分支”。
当有人谈论git branch --track中的“跟踪”时,他们谈论的是您可以修改的“跟踪”分支。
当有人谈论“远程跟踪分支”时,他们谈论的是跟踪远程分支的只读分支。

1
请参阅以下链接以了解更多信息:https://dev59.com/CV_Va4cB1Zd3GeqPV7bR、http://alblue.bandlem.com/2011/07/git-tip-of-week-tracking-branches.html和https://dev59.com/5HNA5IYBdhLWcg3wKaYx。 - VonC

0

请注意,Git 2.12.2(2017年3月)正式确定了跟踪的含义。

请参见提交 e4e016f(2017年3月19日),作者为Ævar Arnfjörð Bjarmason(avar
(由Junio C Hamano -- gitster --于{{link4:提交 ce9e617}(2017年3月24日)合并)

push

更改push.tracking=*的文档,重新包含有关“tracking”的说明。

“跟踪(tracking)”选项已于53c4031(2011-02-16)更名为“上游(upstream)”,随后在87a70e4(2013-06-19)中重写此部分以删除对“tracking”的任何提及。

也许如果这个选项在配置文件中,我们现在应该警告或退出,但是我有一些旧的配置使用了这个选项,我忘记了它是一个同义词,并且git文档中没有提到这一点。

文档现在提到

tracking - 这是 upstream 的一个已弃用的同义词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接