git checkout my_branch 与 git checkout origin/my_branch 的区别

32

当我使用以下命令(两个分支均已存在)切换到branch2时,我正在branch1上:

git checkout origin/branch2

然后我遇到了一个分离头错误:

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.

然后我只是检出 branch2 (不带 origin),然后它就可以正常工作:

git checkout branch2

那么使用 git checkout 时带上和不带上 origin/ 的区别是什么?为什么在使用 origin/ 时会出现 detached HEAD 错误?


问:在我的情况下,“git checkout branch2”和“git checkout origin/branch2”有什么区别?答:如何将分离的HEAD与主/源进行协调? - paulsm4
https://dev59.com/CG865IYBdhLWcg3wIrFg - sfletche
相关:https://dev59.com/_F8e5IYBdhLWcg3wEXBi - jub0bs
2个回答

28

"Detached HEAD"提示信息是一个警告,而不是错误。

其原因很简单。Git有两种关于分支的状态:

  • 在一个分支上,或者
  • 不在任何分支上。

当你在一个分支上并创建新提交时,该分支会自动向前移动以包括新的提交。

当你不在任何分支上并创建新提交时,非分支也会向前移动,但这就是警告出现的原因——如果你之后切换到另一个分支(以此进入新的分支),Git 忘记了你之前的位置1。当你在一个分支上时,分支名会记住新的提交记录;当你没有使用分支时,没有东西来记住它们。

你不能在一个远程跟踪分支上

分支origin/branch2是一个远程跟踪分支:它记住了“我们(git和origin的git)最后一次讨论分支时branch2origin上的位置”。由于这个跟踪目的是跟踪他们的位置,Git不允许你“进入”该分支并创建新提交(这样会记住你的位置而不是他们的位置)。

因为你不能在上面,检出它将使你进入“detached HEAD”状态。

但你可以在普通(本地)分支上

分支branch2是一个普通、正常的、本地分支。它属于你,你可以随意使用。你可以进入它并创建新提交。

本地分支还可以记住远程跟踪分支,通常称为upstream。Git对此的术语有些混淆,即您的本地分支随后“跟踪”远程跟踪分支。这里出现了太多次“跟踪”和“分支”这两个词,都有不同的含义。


1实际上,它会在HEADreflog中保存一段时间,默认情况下只能保留30天。


1
谢谢 - 我们总是应该git checkout whatever_branch(不带origin),然后git push origin whatever_branch,这样说是否合理?我知道origin表示远程跟踪,但我不确定我是否理解了“我们的git和远程git之间关于branch2上次在origin上的位置的对话”的含义。 - artm
1
注释答案分为两部分,先说第二部分:这里的origin是git称之为远程的东西。它基本上是一个短名称,git可以在其中存储另一个git的url,并为该其他git存储库的远程跟踪分支设置前缀。 "对话"发生在获取和推送时:另一个git列出所有它们的分支,您的git将所有信息保存为远程跟踪分支。 这也是它们如何更新的方式:您的git与其git通信并获取任何新提交并更新您的远程跟踪分支。 - torek
1
至于你应该git checkout什么,那就取决于你自己了,但如果你想添加新的好(我们希望是好的)提交,那么是的,请给git checkout一个本地分支名称。如果你还没有一个名为braX的分支,但有一个origin/braX,你的git将为你创建一个与origin/braX链接的braX,因此适合于git push origin,是的。 - torek

4

您应该使用 git checkout --track origin/branch2 命令来创建一个本地分支 branch2,该分支跟踪远程分支 origin/branch2


我必须点赞,因为这解决了我的奇怪问题:我有两个远程仓库1)remotes/origin/MyProject,2)remotes/origin/origin/MyProject。我可以checkout MyProject,但无法使用“git chekcout origin/MyProject”检出第二个分支... - ulyssis2

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