git - 为什么 git detached HEAD 甚至存在?

标签 git

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

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

教育/培训肯定有帮助,但总有新手接触 git...
你们是怎么处理的?

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

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

最佳答案

[...] why does detached HEAD even exist? Why can't it be defaulted to always checking out a new branch?

让我试试下面的比喻。如果您将 Git 存储库视为记录存储库历史的相册...

  • 您可以将分支视为书签;它们标记了您历史上的兴趣点,您可能会在某个阶段返回的快照……如果只是出于怀旧的话:)
  • 您可以将HEAD 引用想象成您的一根手指,让书在特定页面打开。

现在,想象一下,如果您只能在已经有书签的地方打开这本书。这将是非常有限制和笨拙的:你将不得不创建和使用许多书签只是为了访问你的历史的某些页面:

enter image description here

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

简而言之,这就是分离 HEAD 状态有用的原因。它允许您检查任何提交,即使是当前没有分支指向的提交。如果您决定要将全新的工作基于有问题的提交,那么创建一个指向该提交的新分支是有意义的;但是,否则,创建一个新分支就太过分了。


Why does git give a detached HEAD when checking out a new remote branch?

我猜你可能跑了

git checkout <remote-branch>

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

  • 远程跟踪分支,它们在您的存储库本地,但仅用于反射(reflect)远程存储库中的分支在您上次与服务器通信时的样子;您不能在此类分支机构工作;和
  • (纯)本地分支机构,可以继续工作。

如果你只是运行

git checkout <remote-branch>

不会创建供您使用的本地分支,您最终将处于分离的HEAD 状态。你可能想跑

git checkout -b <new-local-branch> <remote-branch>

相反。这将创建并 checkout 一个新的本地分支,该分支指向与远程分支相同的提交。然后没有分离的HEAD

关于git - 为什么 git detached HEAD 甚至存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26051216/

相关文章:

git - 如何设置 Git 以通过代理

git - 在 git push + pull 中强制超时

Git - 忽略特定文件夹中的扩展名

带有中央存储库的 Git

git - 参数列表太长 - lint-staged -> tslint

git - 在主分支上维护数百个定制分支

git - 将所有内容存储在 Git 中,包括所有子模块?

git - 只克隆一个分支

git - 当 get 没有针对远程分支的跟踪信息时,这意味着什么?

git - 如何在 git URL 中转义密码的 `@`