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

时间:2014-09-26 02:38:17

标签: git

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

  

[...]为什么分离的HEAD甚至存在?   为什么总是检查一个新的分支是否违约?

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

  • 您可以将分支视为书签;它们标记了您的历史记录中的兴趣点,您可能会在某个阶段重新拍摄的快照......如果只是出于怀旧情绪:)
  • 您可以将HEAD引用视为您的一只手指,让图书在特定网页上保持打开状态。

现在,想象一下,只有在已经书签的情况下才允许您打开书籍。这将是非常严格和笨拙的:你必须创建和使用许多书签才能访问你历史的某些页面:

enter image description here

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

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


  

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

我猜你可能正在运行

git checkout <remote-branch>

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

  • 远程跟踪分支,它们是您的存储库本地的,但仅用于反映远程存储库中的分支看起来像您上次与服务器通信时的内容;你不能在这样的分支上工作;和
  • (纯粹)本地分支,可以继续使用。

如果您只是运行

git checkout <remote-branch>

将不会创建您要玩的本地分支,并且您将最终处于分离 - HEAD状态。您可能想要运行

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

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

答案 1 :(得分:4)

简单地说,一个分离的HEAD是你当前分支尖端以外某处的HEAD参考。

在外行人的术语中,HEAD指向存储库中的最新提交;分离的HEAD指向存储库中最新提交时的某个位置。

它之所以存在是因为回到以前的提交是非常非常方便 - 特别是在运行git bisect时,因为Git必须在历史上回到最早的&#34;好的&#34;报到。能够检查任意提交以对其进行冒烟测试(如果git bisect过于拜占庭),或检查特定的发布版本也很好。

默认创建分支是极其混乱的行为,因为如果您正在自己的存储库中工作,或者如果每个人都在协作并且承诺创建分支,则没有太多理由创建分支同一个分支(尽管这会导致一些心痛)。

要记住的主要事项:

  • 要退出分离的HEAD状态,请检查当前分支(git checkout master)。例如,这会将您的HEAD指针移动到master的尖端。

  • 要创建新分支,请使用git checkout -b <branch-name>。结帐时的-b标志表示您希望创建新分支。

  • 要使用服务器的更改来更新本地存储库,请使用git pull。这将检索任何远程更改,并推进您当地的分支机构&#39;与远程服务器匹配的提示。

答案 2 :(得分:0)

因为他们与术语&#34;结帐&#34;混淆。它们在两个版本控制系统中具有不同的含义。

对于您的特定问题,最简单的信息是,&#34; git pull&#34; =&#34; svn checkout&#34;。因此,他们应该使用&#39; pull&#39;而不是结帐并认为他们正在尝试从服务器获取最新版本。

答案 3 :(得分:0)

结帐命令的另一种常见形式是其他答案没有提及。

表单1 - 这将签出已存在的本地分支

git checkout LOCAL_BRANCH

表格2 - 强制分离的HEAD

git checkout REFERENCE

这里,引用可以是远程分支引用,标记,sha等。一个非常常见的错误是键入git checkout origin/some_branch并且没有意识到将deference origin / some_branch改为SHA,然后把你在独立的头部。

表格3 - 检查远程分支的简单形式

git checkout REMOTE_BRANCH

如果 REMOTE_BRANCH不是本地分支,但它是源上的有效分支,那么Git将创建本地分支和设置跟踪。所以git checkout some_branch如果&#34; origin / some_branch&#34;存在将起作用。

最后,您可以签出任意SHA / Ref并使用git checkout -b LOCAL_BRANCH REF创建分支。如果REF恰好是远程分支引用,Git将自动为您设置跟踪(在这种情况下,您必须明确地将origin /放在ref名称中)。因此git checkout -b my_some_branch origin/somebranch将创建并检查my_some_branch,并启用跟踪功能。