在git中跟踪的含义

时间:2012-10-02 21:16:50

标签: git

在StackOverflow中多次引用的an article(例如1)中,作者讨论了git pushgit pull之间的不对称性,并提到了以下内容:

  

更新:感谢David Ongaro,自从git以来,他指出了以下内容   1.7.4.2,push.default选项的建议值是上游而不是跟踪,尽管跟踪仍可用作a   弃用的同义词。描述该更改的提交消息是   很好,因为它表明正在努力弃用   在设置此关联的上下文中的术语“跟踪”   远程存储库中的上游分支。 (完全不同   git branch中的“track”的意思 - 跟踪和“远程跟踪”   分支“在试图引入git时长期激怒了我   人。)

他指的是什么区别:

  • git branch --track
  • 中“跟踪”的概念
  • 远程跟踪分支机构中跟踪“的概念

在最后一句话中?

2 个答案:

答案 0 :(得分:6)

我无法确定,因为我不是那句话的作者。我会拍摄一下,作者描述的混乱是“跟踪”和“远程跟踪”分支之间的常见混淆。 gitguys有一篇很棒的文章,所以,你应该读一下。他们有漂亮的照片和一切。

这是我对它的看法......

设置

作为一个例子,假设我们在github上有一个非常简单的git存储库,它有一个master分支,有一些提交(C1和C2,其中C2是当前提交)。克隆该存储库时...

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

......发生了两件事:

  1. 将所有提交(C1和C2)复制到本地计算机。
  2. 您还在本地计算机上创建了一个名为master的新分支。该分支是“跟踪分支”,其HEAD在C2上。该分支被称为“跟踪分支”。
  3. 新提交

    到目前为止,没什么特别的。但是在您阅读这些解释时,有人提交了另一个提交(C3)并将其推送到远程存储库。现在假设你听到了这个新的惊人提交,并决定自己检索它。

    git fetch
    

    这有两件事:

    1. 将所需的新提交(C3)复制到本地计算机。
    2. 以某种方式更新本地系统,让他们知道原来的master分支现在在C3上。
    3. 但问题是:本地系统如何知道原点的master分支在C3上?当然git有一些方法可以在本地存储这些信息吗?但是哪里?我们实际上无法对本地master分支进行更改,因为我们可能在我们需要合并的本地分支上拥有自己的提交或其他更改。它只是存储在其他一些未知的blob中吗?

      答案

      事实证明,git只使用第三个​​分支。现在,我们知道了两个分支:

      1. 分支机构位于github上。
      2. 位于您计算机上的“跟踪分支”(您可以称之为master)。
      3. 事实证明还有第三个。您之前可能已经看过它:它被称为origin/master。它与这两个分支中的任何一个都不一样。它就是所谓的“远程跟踪分支”。

        您可以将其视为位于本地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!
        

        显示此消息是因为“远程跟踪分支”是READ-ONLY。用户无法像master那样操纵它们,只允许git系统本身对其进行更改(在获取期间它将执行更改)。因此,从实现的角度来看,您可以将它们视为任何其他分支。但是,由于它们的只读性质,您通常不会像任何其他分支一样使用它们。

        所以,实际上,我们在混合中有三个分支:

        1. 分支机构位于github上。
        2. 物理上位于您机器上的origin/master分支(“远程跟踪分支”)。
        3. master分支机构位于您的计算机上(“跟踪分支”)。
        4. 回答问题......

          因此,我的假设是,“跟踪”和“远程跟踪”分支之间真的存在混淆。有人会将master混淆为“远程跟踪分支”(毕竟,它确实从origin/master获得提交!),但事实上并非如此。它是一个“跟踪分支”,它跟踪的分支是origin/masterorigin/master是“远程跟踪分支”。

          当有人谈论git branch --track方面的“跟踪”时,他们正在谈论你可以修改的“跟踪”分支。

          当有人谈到“远程跟踪分支”时,他们正在讨论跟踪远程分支的只读分支。

答案 1 :(得分:0)

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

commit e4e016fÆvar Arnfjörð Bjarmason (avar)(2017年3月19日) Junio C Hamano -- gitster --于2017年3月24日commit ce9e617合并)

  

push:在文档

中提及“push.default=tracking”      

更改push.tracking=*的文档以重新提及   “tracking”的作用。

     

“追踪”选项重新命名为“上游”   53c4031(“push.default:将”tracking“重命名为”upstream“,2011-02-16),随后在87a70e4中重写了此部分(“config doc:rewrite push.default section”,2013-06-19)删除对“tracking”的任何提及。

     

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

doc now mentions

  

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