【问题标题】:The meaning of tracking in gitgit中跟踪的意义
【发布时间】:2012-09-23 18:55:33
【问题描述】:

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

更新:感谢 David Ongaro,他在 git 之后指出了这一点 1.7.4.2,push.default 选项的推荐值是上游而不是跟踪,尽管跟踪仍然可以用作 弃用的同义词。描述该更改的提交消息是 很好,因为它表明正在努力弃用 在设置这种关联的上下文中,术语“轨道”与 远程存储库中的上游分支。 (完全不同的 git branch --track 和“remote-tracking”中“track”的含义 分支”在尝试将 git 引入到 人。)

他指的到底是什么区别:

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

最后一句话?

【问题讨论】:

    标签: git


    【解决方案1】:

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

    这是我的看法...

    设置

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

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

    ...发生了两件事:

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

    新的提交

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

    git fetch
    

    这做了两件事:

    1. 将所需的新提交 (C3) 复制到您的本地计算机。
    2. 以某种方式更新本地系统,让他们知道 origin 的 master 分支现在在 C3 上启用。

    但问题是:本地系统如何知道源的master 分支在C3 上? git 肯定有某种方法可以在本地存储这些信息吗?但是哪里?我们实际上无法对本地 master 分支进行更改,因为我们可能需要合并该本地分支上的自己的提交或其他更改。它只是存储在其他一些未知的 blob 中吗?

    答案

    事实证明,git 只使用了一个 third 分支。目前,我们知道两个分支:

    1. 物理上位于 github 上的分支。
    2. “跟踪分支”,位于您的计算机上(您可以称之为master)。

    原来还有第三个。你可能以前见过它:它叫做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!
    

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

    所以,实际上,我们有三个分支:

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

    回答问题...

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

    当有人在 git branch --track 中谈论“跟踪”时,他们谈论的是您可以修改的“跟踪”分支。

    当有人谈论“远程跟踪分支”时,他们指的是跟踪远程分支的只读分支。

    【解决方案2】:

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

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

    push:在文档中提及“push.default=tracking

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

    “跟踪”选项已重命名为“上游” 53c4031 ("push.default: Rename 'tracking' to 'upstream'", 2011-02-16), 随后在87a70e4 ("config doc: rewrite push.default section ", 2013-06-19) 删除任何提及“tracking”。

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

    doc now mentions:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2017-03-15
      • 2011-10-01
      • 1970-01-01
      • 2016-01-01
      • 2019-09-09
      相关资源
      最近更新 更多