为什么git脱离HEAD甚至存在?

Ste*_* Xu 2 git

我们的团队最近转向git,从svn和hg迁移.因此,当他们检查树的尖端时,根据GUI,他们倾向于检查特定的提交或本地分支而不是新的跟踪分支,而不了解git是如何工作的.

所以我的问题是为什么分离的HEAD甚至存在?
为什么总是检查一个新分支不能默认?(我对git的理解有限)

教育/培训肯定有所帮助,但总会有人对git感兴趣......
你们如何管理呢?

顺便说一句,我知道如何修复它们.我已经阅读了这个网站上的很多帖子.
这更适用于知识共享以及您如何预防或管理.

更新:
在阅读下面提供的详细解释后,我现在意识到我的问题应该是"为什么git在签出新的远程分支时会给出一个独立的HEAD?".无论如何,答案会给你一个很好的理解!

jub*_*0bs 6

[...]为什么分离的HEAD甚至存在?为什么总是检查一个新分支不能默认?

让我尝试以下比喻.如果您认为您的Git存储库是一个记录您的存储库历史的相册...

  • 您可以将分支视为书签 ; 它们标记了您的历史记录中的兴趣点,您可能会回到的快照,在某个阶段...如果只是出于怀旧情绪:)
  • 您可以将该HEAD引用视为您的一个手指,从而使该书在特定页面处保持打开状态.

现在,假设你被允许只在已有书签的地方打开书.这将是非常严格和笨拙的:你必须创建和使用许多书签才能访问你历史的某些页面:

在此输入图像描述

相反,Git允许您浏览书籍并在您喜欢的任何页面上打开它.然后,如果您注意到您感兴趣的特定快照,则可以随时为其创建新书签(分支).

简而言之,这就是为什么detached-HEAD状态很有用.它允许您检查任何提交,甚至是没有分支当前指向的提交.如果您决定在有问题的提交上建立全新的工作,那么创建一个指向该提交的新分支是有意义的; 但是,否则,创建一个新的分支将是过度的.


为什么git在签出新的远程分支时会给出一个独立的HEAD?

我猜你可能会跑

git checkout <remote-branch>
Run Code Online (Sandbox Code Playgroud)

并且惊讶于它分离了HEAD.你需要知道Git的区别

  • 远程跟踪分支,它们是存储库的本地分支,但仅用于反映远程存储库中的分支与上次与服务器通信时的情况; 你不能在这样的分支上工作; 和
  • (纯粹)本地分支,可以工作.

如果你只是跑

git checkout <remote-branch>
Run Code Online (Sandbox Code Playgroud)

将不会创建您玩的本地分支,并且您将最终处于分离HEAD状态.你可能想跑

git checkout -b <new-local-branch> <remote-branch>
Run Code Online (Sandbox Code Playgroud)

代替.这将创建并检出指向与远程分支相同的提交的新本地分支.HEAD那时没有超然.