13

我运行'git branch -r'并得到

起源/分支1

起源/分支2

在手册页中,-r 选项将“列出或删除(如果与 -d 一起使用)远程跟踪分支”。所以 origin/branch1 和 origin/branch2 被称为远程跟踪分支。但是,您不能直接提交到远程跟踪分支(将创建一个匿名分支)。远程跟踪分支仅在运行“git fetch”时跟踪远程分支。

这是语义对我来说有点模糊的地方。如果我那时

git checkout -b 分支 1 原点/分支 1

我得到以下输出:“分支分支 1 设置为从源跟踪远程分支分支 1。切换到新分支 'branch1'”

这是我的问题,尽可能详细地澄清什么让我感到困惑......由于设置了 branch1 以从源跟踪远程分支 branch1,因此“branch1”是否被视为远程跟踪分支?如果是这样,这是否与运行 'git branch -r' 时'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”?

4

1 回答 1

14

这是一个关于一个特别烦人的 git 术语的好问题,尽管该项目似乎正在慢慢修复。

branch1基本上,“跟踪”在表达式(a)“远程跟踪分支”和(b)“设置为branch1从“跟踪远程分支”中表示非常不同的东西origin。这是一个快速的总结:

  1. “远程跟踪分支”:远程跟踪分支是通常由 更新的分支git fetch,因此,git pull。¹您可以将这些视为远程存储库中分支状态的缓存。你可以合并它们,检查它们的历史,等等,但你不能直接处理它们。该短语中的“跟踪”表示远程跟踪分支表示远程存储库中上次更新远程跟踪分支时分支的状态。
  2. 分支foo设置为从origin跟踪远程分支:在这句话中,您被告知 git 已经设置了将您的本地分支foo与远程跟踪分支相关联的配置变量origin/bar。这启用了一些不错的功能,例如能够git pull在您在分支上时键入foo以便获取然后从origin/bar. 这也是您如何获得有关您的分支相对于远程跟踪分支的状态的消息的方式,例如“您的分支foo提前 24 次提交origin/bar可以快速转发”。你被告知你当地的分支机构正在跟踪 已与远程跟踪分支相关联。您还听说这被称为origin/bar相对于的上游foo

所以,这些跟踪/跟踪的感觉是完全不同的,可悲的是,这是一个常见的混淆来源。

然而,第二种意义似乎正在慢慢被弃用 - 例如,曾经是的可能选项之一push.defaulttracking但现在已被弃用,取而代之的是选项 name upstream


所以,直接回答你的问题:

由于将 branch1 设置为从源跟踪远程分支 branch1,因此是否将“branch1”视为远程跟踪分支?

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

运行“git checkout -b branch1 origin/branch1”时,我是否创建了一个本地(主题)分支(我可以在其上添加提交),它通过获取来跟踪远程分支?

好吧,有点——它正在跟踪(意义 2)一个远程跟踪分支,后者是通过 fetches 从远程存储库中的一个分支更新的。(就我个人而言,我尽量避免使用“远程分支”一词,而倾向于使用“远程存储库中的分支”,以防人们认为您指的是远程跟踪分支。)

运行“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¹ 当您成功访问远程存储库中的相应分支时,它们也会更新。

于 2011-07-08T23:18:01.403 回答