在git中,“tracking”这个概念有不同的含义吗?

13

我运行了'git branch -r'并获得了以下结果:

origin/branch1

origin/branch2

从官方手册中可以得知,使用-r选项将“列出或删除(如果与-d一起使用)远程跟踪分支”。 因此,origin/branch1和origin/branch2被称为远程跟踪分支。 然而,您不能直接提交到远程跟踪分支(会创建一个匿名分支)。 远程跟踪分支仅在运行'git fetch'时跟踪远程分支。

这就是我感到困惑的地方。 如果我然后运行了:

git checkout -b branch1 origin/branch1

我将得到以下输出:

"分支branch1已设置为跟踪来自origin的远程分支branch1。 切换到了新分支'branch1'"

我的问题如下,为了澄清困扰我的问题:

通过设置branch1跟踪来自origin的远程分支branch1,'branch1'是否因此被视为远程跟踪分支? 如果是,这难道不与在运行'git branch -r'时已经列出的'remote-tracking branch' 'origin/branch1'相冲突吗? 我理解的是,存在本地(主题)分支或远程跟踪分支。 当运行'git checkout -b branch1 origin/branch1'时,我是否正在创建一个本地(主题)分支(可以在其中添加提交),该分支通过获取跟踪远程分支? 运行'git branch'现在给出'* branch1',而运行'git branch -r'仍然给出'origin/branch1'和'origin/branch2'。 我创建了branch1以添加提交并跟踪origin/branch1。 哪个被视为远程跟踪分支,是'git branch'输出的'branch1'还是'git branch -r'的 'origin/branch1'?


相关问题:https://dev59.com/wGQn5IYBdhLWcg3w_LTx - Flimm
1个回答

14

这是一个关于git术语的好问题,尽管该项目似乎正在慢慢解决它的问题。

基本上,“track”在以下两种表述中(a)“remote-tracking branch”和(b)“从origin设置跟踪到branch1branch1分支”中意义截然不同。以下是一个快速总结:

  1. “remote-tracking branch”:远程跟踪分支是通常由git fetchgit pull更新的分支。因此,您可以将其视为远程存储库中分支状态的缓存。您可以从这些分支进行合并、查看历史记录等,但不能直接在其上工作。“Track”在这个短语中的意思是远程跟踪分支表示远程存储库上的分支在上次更新远程跟踪分支时的状态。
  2. origin设置跟踪到barfoo分支:在这个表述中,你被告知git设置了配置变量,将你的本地分支foo与远程跟踪分支origin/bar关联。这使得你可以在foo分支上只键入git pull来获取并从origin/bar合并。这也是您获得有关本地分支相对于远程跟踪分支状态的有用信息,例如“你的foo分支领先于origin/bar 24个提交,可以快进合并”。你被告知你的本地分支正在跟踪已与一个远程跟踪分支相关联。你还会听到它被称为相对于fooorigin/bar处于上游。

因此,这些track/tracking的意义是完全不同的,很遗憾,这是普遍的困惑来源。

第二个意义似乎正在逐渐被弃用,例如,在push.default的可能选项之一曾经是tracking,但现在已被弃用,改用选项名upstream

因为将branch1设置为跟踪来自origin的远程分支branch1,所以“branch1”是否被认为是远程跟踪分支?

没有,branch1不是远程跟踪分支。

运行'git checkout -b branch1 origin/branch1'时,我是在创建一个本地(主题)分支(可以添加提交)来通过获取追踪一个远程分支吗?

嗯,有点儿像——它正在追踪(第2个意义)一个远程跟踪分支,并且后者通过获取从远程存储库中的分支进行更新。(就个人而言,我会避免使用术语“远程分支”,而使用“远程存储库中的分支”这个说法,以防万一别人误认为您指的是远程跟踪分支。)

现在运行'git branch'显示:'* branch1',而运行'git branch -r'仍然显示'origin/branch1'和'origin/branch2'。我创建了branch1来添加提交并跟踪origin/branch1。从'git branch'的输出中,哪一个被认为是远程跟踪分支?是'branch1'还是'git branch -r'的'origin/branch1'?

远程跟踪分支是origin/branch1


¹ 当您成功执行git push到相应的远程存储库中的分支时,它们也会被更新。


1
这确实有助于澄清问题,谢谢马克!所以诀窍在于将本地可编辑分支创建视为“跟踪”(或更恰当地说是“关联”)远程存储库的分支,并且远程跟踪分支仅反映远程端上的内容,_不能_进行编辑。感谢您帮助确认我的怀疑,即git中“跟踪”一词确实有两个含义。 - Phillip
我们在本地仓库中得到的是“远程(跟踪)分支”,而“远程仓库中的分支”则是指远程仓库中的某个分支,尽管前者本质上是跟踪后者。因此:(A)我认为我们不应该混淆它们;(B)在“远程(跟踪)分支”的名称中,不应使用“跟踪”一词,以避免与本地跟踪分支混淆。 - ryenus

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