Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么git分离头会存在?_Git - Fatal编程技术网

为什么git分离头会存在?

为什么git分离头会存在?,git,Git,我们的团队最近从svn和hg迁移到git。因此,当他们根据GUI签出树梢时,他们倾向于签出特定的提交或本地分支,而不是新的跟踪分支,而不了解git的实际工作方式 所以我的问题是为什么会有分离的头部 为什么不能默认总是签出一个新分支?(我对git的理解有限) 教育/培训确实有所帮助,但git总有新人…… 你们是怎么做到的 顺便说一下,我知道如何修理它们。我在这个网站上读了很多帖子。 这更多是为了知识共享以及如何预防或管理 更新: 在阅读了下面提供的详细解释之后,我现在意识到我的问题应该是“为什么g

我们的团队最近从svn和hg迁移到git。因此,当他们根据GUI签出树梢时,他们倾向于签出特定的提交或本地分支,而不是新的跟踪分支,而不了解git的实际工作方式

所以我的问题是为什么会有分离的头部
为什么不能默认总是签出一个新分支?(我对git的理解有限)

教育/培训确实有所帮助,但git总有新人……
你们是怎么做到的

顺便说一下,我知道如何修理它们。我在这个网站上读了很多帖子。
这更多是为了知识共享以及如何预防或管理

更新:

在阅读了下面提供的详细解释之后,我现在意识到我的问题应该是“为什么git在签出一个新的远程分支时会给出一个分离的头部?”。不管怎样,答案会给你一个很好的理解

因为它们与术语“结帐”混淆了。它们在两个版本的控制系统中具有不同的含义


对于您的特定问题,最简单的消息是,“git pull”=“svn checkout”。因此,与其进行签出并认为他们正在尝试从服务器获取最新版本,他们应该使用“拉”

简单地说,分离的头部是您当前分支尖端以外的其他位置的头部参考

用外行的话说,HEAD指向存储库中的最新提交;分离的头指向存储库中不是最新提交的位置

它的存在是因为返回到以前的提交非常方便——特别是在运行时,因为Git必须回到历史上最早的“良好”签入。能够签出任意提交以在其上运行冒烟测试(如果
git bisect
过于拜占庭式),或者签出特定的发布版本,也很好

默认创建分支是一种非常令人困惑的行为,因为如果您在自己的存储库上工作,或者如果每个人都在协作并一直致力于同一个分支(尽管这可能会导致一些心痛),那么就没有太多理由创建分支

要记住的主要事情:

  • 要摆脱分离头状态,请签出当前分支(
    git checkout master
    )。例如,这会将您的头部指针移动到
    master
    的顶端

  • 要创建新分支,请使用git checkout-b。签出时的
    -b
    标志表示您希望创建新分支

  • 要使用服务器的更改更新本地存储库,请使用
    git pull
    。这将检索任何远程更改,并使本地分支的提示与远程服务器的提示相匹配

[…]为什么会存在分离的头部? 为什么不能默认总是签出一个新分支

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

  • 你可以把树枝想象成书签;它们标志着你的历史中的兴趣点,在某个阶段你可能会回到的快照。。。如果只是出于怀旧:)
  • 你可以把
    参照物想象成你的一根手指,让书在某一页打开
现在,想象一下,如果你被允许只在已经有书签的地方打开这本书。这将是非常限制性和笨拙的:您必须创建和使用许多书签才能访问您的历史记录的某些页面:

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

简而言之,这就是为什么分离的头部状态是有用的。它允许您签出任何提交,即使是当前没有分支指向的提交。如果您决定将全新的工作建立在所讨论的提交上,那么创建一个指向该提交的新分支是有意义的;但是,否则,创建一个新分支就太过了


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

我猜你可能会逃跑

git checkout <remote-branch>
将不会创建供您使用的本地分支,并且您将最终处于分离-
HEAD
状态。你可能想跑步

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

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

还有另一种常见的签出命令形式,其他答案没有提到

表格1-这将签出已存在的本地分支机构

git checkout LOCAL_BRANCH
表2-强制分离头

git checkout REFERENCE
在这里,引用可以是远程分支引用、标记、sha等。一个非常常见的错误是键入
git checkout origin/some_branch
,但没有意识到这将使origin/some_branch服从sha,然后将您置于分离的头部

表单3-签出远程分支的简单表单

git checkout REMOTE_BRANCH
如果远程分支不是本地分支,但它是origin上的有效分支,那么Git将创建本地分支并设置跟踪。因此,git签出一些分支如果“origin/some\u branch”存在将起作用


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

感谢您的详细解释。
git checkout REMOTE_BRANCH