在Git中,“refs/heads/master”和“refs/remotes/origin/master”是否相同?

41
问题很简单:是 refs/heads/masterrefs/remotes/origin/master 相同吗?如果在某些情况下不相同,我该如何知道它们不相同,并了解它们的区别是什么?

如果我错了,请有人纠正我,但是你不应该有一个 refs/origin/master。它应该是 refs/remotes/origin/master - user229044
3个回答

44

它们是两个不同的符号名称,可以指向不同的内容。 refs/heads/master 是您的工作副本中名为 master 的分支。通常,它是 refs/remotes/origin/master 的跟踪分支,因为 origin 是由 git clone 创建的远程的默认名称,其主要分支通常也被命名为 master

您可以使用 git rev-list refs/heads/master..refs/remotes/origin/master 查看它们之间的差异。如果它们相同,则该命令将为空;否则,它将列出它们之间的提交。


感谢澄清 :) - Niraj Trivedi
1
当我尝试使用git for-each-ref列出所有分支时,它会列出许多带有refs/remotes/origin/<branch name>的分支。但是当我转到我们的github.com存储库时,我在下拉菜单或其他任何地方都看不到这些分支。为什么会有这种差异? - Farhad

36
理解的关键差异在于位于refs/heads/下的分支是当你有一个分支被检出时,可以通过创建新的提交来推进。 refs/remotes/下的分支则称为“远程跟踪分支”,这些引用只是指向最后一次使用git fetch <name-of-remote>或成功的git push到该远程存储库相应分支时该存储库所处的提交。(我在这里写了一篇博客文章详细讨论了这个差异here)。

3
我仍然感到阅读这里的帖子时感到困惑。因此,也许这会澄清事情并提供更好的答案。简短的答案是不,你列出的这两个引用不同。一个存储本地repo主参考提交,另一个存储远程repo参考提交。但请继续阅读...
首先,Git文档如下所述:
引用是一种文件,在其中将SHA-1值存储在简单名称下,以便您可以使用该简单名称而不是原始SHA-1值。
Git中的分支是:指向工作线路头部的简单指针或引用。
那么,Git中这些奇怪的路径是什么?
refs/ - 这只是Git系统中引用的文件夹,用于将用户友好的名称分配给本地repo中哈希的SHA-1分支。
refs/heads/ - 这是存储一组用户友好分配的分支名称的文件夹,这些名称映射回Git提交哈希值。这些提交值表示本地repo中的分支,并且是每个分支中保存一些代码的最后提交点。您经常会看到此文件夹中具有repo中每个分支的名称和连接到该分支的最后提交的SHA-1哈希值的文件。"head"意味着它是HEAD的列表,或者是分支中的最后提交引用。因此,这个文件夹中的文件将列出项目中所有分支的名称,并在分支的一系列提交末尾附上到达最后已知提交的哈希。
refs/heads/master - 这实际上是对称为"master"的单个分支文件的文件引用,并保存了Git为您创建的每个Git repo分配的默认或主分支引用的哈希。由于该"master"文件位于"head"引用文件夹中,这意味着它存储了您的项目中主分支的最后已知提交。
refs/remotes/ - 这只是与您的本地repo关联的远程存储库列表(如果存在)。这是一个更多文件夹和文件的文件夹。
refs/remotes/origin - 这只是与您的本地repo关联的默认远程参考。这是指向您的远程repo分支的文件夹,并且可能具有不同于通用名称的唯一名称。 "origin"是第一次克隆远程repo时创建的远程repo名称。
refs/remotes/origin/master - 这指向包含哈希并指示与您的项目关联的默认或"origin"远程repo及其"master"或默认分支的文件。如上所述,Master会在该master文件中存储最后的提交哈希,指示在远程repo上的最后提交位置。

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