Git术语解释:远程分支是什么意思?

3

我输入

git checkout staging

当创建本地分支分阶段时,在命令提示符中,它说:

分支“staging”已设置为跟踪来自“origin”的远程分支“staging”。

但是,“远程分支”这个术语让我感到有些含糊不清。实际上,所谓的远程分支也在我的本地仓库中,只是追踪了远程Git服务器分支名称“staging”吗?那么那个分支应该叫做“跟踪来自‘origin'的远程分支‘staging’”,而不是我刚签出的分支?

在Git中,当说到“远程分支”时,通常指本地存储库中的远程跟踪分支,而不是实际驻留在远程(另一个位置)Git服务器上的分支?

那么如何称呼(如何描述)实际位于远程(另一个位置)Git服务器上的分支?

enter image description here


远程分支仅指远程存储库中的分支。远程跟踪分支是您本地存储库中跟踪远程分支的分支。 - Erwin Bolwidt
3个回答

4
Git自己的文档和术语用法在这里并不完全一致。然而,一旦您了解Git使用的每个部分,它们都是有意义的。
首先,有一个远程(remote),它是像 "origin" 这样的短名称。该名称提供了几个项目,其中最重要的是一个URL。这个URL允许 "你的" Git(在你的Git存储库上运行的Git软件)与一些其他Git (相同或不同版本的Git软件,在某些其他Git存储库上运行)联系起来。
接下来,还有类似于 "master" 或 "main" 的分支名称以及您创建的任何其他名称。每个名称也提供了几个项目,其中最重要的是为您提供某个特定提交的哈希ID。分支名称中找到的提交哈希ID是定义为某些提交链中的“最后”提交。通常情况下,这使它成为您的“最新”提交;Git将此提交称为分支的“尖端提交”。
由于你的Git与其他Git进行交互,即“远程Git”,或者您想使用的任何短语-有它自己的分支名称。当您的Git调用那个Git时,您的Git可以看到它们的分支名称。某个远程分支名称的逻辑术语是“远程分支”。有时,这就是说“远程分支”的人所指的。
但是,在您的Git与那个Git取得联系并将他们拥有而您尚未拥有的任何提交带过来后(现在您已经拥有它们),您的Git将在您的存储库中创建一些类似的名称。如果他们有一个名为 "main" 的分支,并且您的Git调用它们的Git为 "origin",则您的Git将创建 "origin/main"。如果他们有一个名为 "develop" 的分支,则您的Git将创建 "origin/develop"。
我称这些 "origin/*" 样式的名称为 "remote-tracking names"。Git的某些部分称它们为 "remote-tracking branch names"。Git的其他部分和其他人有时称它们为 "remote branches"。
显然,术语 "remote branches" 是不确定的。有时它意味着 “在远程看到的分支名称”,有时它意味着“在自己的存储库中看到的远程跟踪名称”。通过使用短语 “在命名为____的远程上看到的分支名称”(填空),您可以清楚地了解您在这里所指的内容。

原来,“branch”这个术语也是有歧义的,参见“分支(branch)”具体指什么?我尽可能在必要的时候使用短语“branch name”以更加具体明确。


1由于您控制名称,因此可以在此处使用非常长的名称。那会适得其反,所以我会假设您使用一个短名称。:-)

2这实际上是创建或更新,您可以指示您的Git不要管所有它们的分支名称-但这是默认设置。请注意,默认情况下存在一个小缺陷:如果他们在您自己的Git将其名称复制到您的远程跟踪名称之后删除其中一个分支名称,则您的Git不会删除您的远程跟踪名称。因此,随着时间的推移,您的Git将建立“过时”的远程跟踪名称。


我认为很多不一致性来自于“泄漏的抽象”:从逻辑上讲,git fetch 管理的指针和 git commit 管理的指针是不同的东西,但它们都以相同的方式实现,因此它们最终变得有点可互换。 - IMSoP

3

的确,git并不以术语一致而闻名。

然而,在这种情况下,感知上的歧义来自将git正在做什么git如何做到这一点混为一谈。

你在本地称为origin/staging的ref不是远程分支。它根本不是一个分支,而是一个独立的东西;它是一个远程跟踪引用(有时被称为"远程跟踪分支",这是不幸和令人困惑的)。它是你本地仓库用来跟踪远程分支的工具。

Git的意思并不是设置新的本地分支来跟踪这个远程跟踪引用。它的意思是设置新的本地分支来跟踪远程分支(实际存在于实际另一个repo中的实际分支),它碰巧使用存在于本地的远程跟踪引用origin/staging来执行此操作(因为它必须使用本地内容,而所有本地内容中最准确的是远程跟踪引用,告诉我们远程分支的位置)。

这意味着追踪远程分支的准确性仅限于你最近的获取,但这确实是它的全部意思。一个猎人不会追踪动物的脚印,当他告诉你他在追踪动物时,你也不会说这是有歧义的。


1
我认为理解这个问题的方式是,当你运行git fetch时,某个远程存储库的内容会被缓存以供将来使用,但是git不会把获取的分支视为属于你的存储库。 "真正的"远程分支仍然存在于远程配置了其URL的任何位置。
同样,当您告诉git“跟踪”远程分支时,它将其记录为跟踪存在于其知道URL的其他位置上的分支。使用该关联的主要操作是git pullgit push,它们都会积极地与远程存储库交互,而不仅仅是本地缓存。
有些命令只使用远程存储库的本地缓存,例如您可以运行git log origin/foogit merge origin/foo,它们不会获取任何新数据。但它们不是"远程跟踪"分支,它们只是可能过时的缓存。
最后一个谜题是git checkout具有一些便捷功能,让您在一条命令中:
  • 检出远程分支,基于您当前的缓存
  • 创建具有相同名称的本地分支
  • 通过名称将“跟踪”信息设置为指向远程分支,因此无论您的缓存是否过时都没有关系

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