我们的团队最近转向git,从svn和hg迁移。因此,当他们检查树的尖端时,根据GUI,他们倾向于检查特定的提交或本地分支而不是新的跟踪分支,而不了解git是如何工作的。
所以我的问题是为什么分离的HEAD甚至存在?
为什么总是检查一个新分支是否违约? (我对git的理解有限)
教育/培训肯定有所帮助,但总有一些人对git感兴趣...... 你们是如何管理它的?
顺便说一下,我知道如何修复它们。我已经阅读了这个网站上的很多帖子 这更适用于知识共享以及您如何预防或管理。
更新
在阅读了下面提供的详细解释后,我现在意识到我的问题应该是"为什么git在签出新的远程分支时会给出一个独立的HEAD?"。无论如何,答案会给你一个很好的理解!
答案 0 :(得分:6)
[...]为什么分离的HEAD甚至存在? 为什么总是检查一个新的分支是否违约?
让我试试下面的比喻。如果您将Git存储库视为记录存储库历史记录的相册...
HEAD
引用视为您的一只手指,让图书在特定网页上保持打开状态。现在,想象一下,只有在已经书签的情况下才允许您打开书籍。这将是非常严格和笨拙的:你必须创建和使用许多书签才能访问你历史的某些页面:
相反,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,并启用跟踪功能。