为什么我的Git回购进入了一个独立的头部状态?

bwntbbo3  于 2022-09-21  发布在  Git
关注(0)|答案(13)|浏览(129)

今天我得到了一个独立的头,同样的问题描述在:git push says everything up-to-date even though I have local changes

据我所知,我没有做任何不寻常的事情,只是承诺和推动我的本地回购。

那么我怎么会得到一个detached HEAD呢?

kpbpu008

kpbpu0081#

如果提交的名称不是您的某个分支的名称,则会得到一个分离的头部。表示树枝顶端的SHA1仍然提供分离的头部。只有本地分行名称的结账操作才能避免这种模式。

请参见使用分离的头部提交
分离Head时,将像正常一样提交工作,但不会更新任何命名分支。(您可以将其视为匿名分支。)

例如,如果您 checkout 一个“远程分支”而没有首先跟踪它,那么您最终可能会得到一个分离的头。

git: switch branch without detaching head

含义:git checkout origin/main(或origin/master in the old days)将导致:

Note: switching to 'origin/main'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at a1b2c3d My commit message

这就是为什么您不应该再使用git checkout,而应该使用新的git switch命令。

使用git switch,同样的“ checkout ”(切换到)远程分支机构的尝试将立即失败:

git switch origin/main
fatal: a branch is expected, got remote branch 'origin/main'

要在git switch上添加更多信息:

有了Git 2.23(2019年8月),你就不再需要使用confusing git checkout command了。

git switch还可以检出分支,并获得分离头,但以下情况除外:

  • 它有一个明确的--detach选项

要在不创建新分支的情况下 checkout 提交HEAD~3以进行临时检查或试验,请执行以下操作:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • 不能错误地分离远程跟踪分支

请参见:

C:Usersvoncarepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

v.v.使用新的git switch命令:

C:Usersvoncarepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

如果要创建跟踪远程分支机构的新本地分支机构:

git switch <branch>

如果未找到<branch>,但在一个远程(称为<remote>)中确实存在具有匹配名称的跟踪分支,请将其视为等同于

git switch -c <branch> --track <remote>/<branch>

别再犯错误了!
不再有不想要的脱离的脑袋!

如果你用git switch <tag>代替git switch --detach <tag>Git 2.36 will help you to remember the missing --detach option

t2a7ltrp

t2a7ltrp2#

我刚才不小心转载了这个:

1.列出远程分支

git branch -r
      origin/Feature/f1234
      origin/master

1.我想在本地结账,所以我剪了一张:

git checkout origin/Feature/f1234

1.Presto!分离的磁头状态

You are in 'detached HEAD' state. [...])

方案一:

检出分支规范时,请不要在其前面包含origin/

git checkout Feature/f1234

方案二:

添加-b参数,用于从远程创建本地分支

git checkout -b origin/Feature/f1234

git checkout -b Feature/f1234会自动退回原点

h9vpoimq

h9vpoimq3#

试试看

git reflog

这给了你一个历史,你的头和分支指针在过去是如何移动的。

例如:

88ea06b Head@{0}: checkout :从开发转移到远程/Origin/SomeNiceFeature e47bf80 Head@{1}:拉回源开发:快进

这个列表的首位是人们可能会遇到的一个独立的头目状态...正在查看一家远程跟踪分支机构。

dfty9e19

dfty9e194#

Detached HEAD表示当前 checkout 的不是本地分行。

会导致Detached HEAD状态的一些场景:

  • 如果您 checkout 远程分支机构**,则为origin/master。这是一个只读分支。因此,当从origin/master创建提交时,它将是自由浮动的,即不连接到任何分支。
  • 如果您 checkout 特定的标签或提交**。当从这里执行新的提交时,它将再次是自由浮动的,即不连接到任何分支。请注意,当 checkout 分支时,新的提交总是自动放置在提示处。

当您想要返回并 checkout 特定的提交或标记以从那里开始工作时,您可以创建一个源自该提交的新分支,并通过git checkout -b new_branch_name切换到它。这将防止Detached HEAD状态,因为您现在 checkout 了分支,而不是提交。

wswtfjt7

wswtfjt75#

如果您有一个与分支名称相同的标记,则可能会发生这种情况。

示例:如果“Release/0.1”是标记名,则

git checkout release/0.1

在“Release/0.1”时产生分离的头部。如果您期望Release/0.1是分支名称,那么您就会感到困惑。

twh00eeo

twh00eeo6#

如果git将其重命名为detached HEAD,我会将其命名为一个无法被分支识别的头,并且很快就会被遗忘

我们作为人很容易记住分行的名字。我们做git checkout new-button-feature/git checkout mainmainnew-button-feature很容易记住。我们只需执行git branch,即可获得所有分支的列表。但是,要对Just Commits执行相同的操作,您必须执行git reflog,这非常乏味。因为您有数千个提交,但只有很少的分支。

分离提交的标识符只是它的SHA。因此,假设您 checkout 了一个提交(而不是分支),即您执行了git checkout d747dd10e450871928a56c9cb7c6577cf61fdf31,您将得到:
注:正在查看‘d747dd10e450871928a56c9cb7c6577cf61fdf31’。

你正处于“分离的头”状态。

..。

那么,如果您做了一些更改并提交了,您仍然不是在分支上。

你觉得你还会记得那次犯罪吗?你不会的!

Git不希望这种情况发生。因此,它是在通知您的头与分支机构没有关联,因此您更倾向于结帐新的分支机构。因此,在下面的消息中还说:
如果您想要创建一个新的分支来保留您创建的提交,您可以(现在或以后)通过使用-b和check out命令再次执行此操作。示例:

Git结账-b

再深入一点,分支是以一种智能的方式构建的。当你提交时,它会更新它的头部。另一方面,标签不应该是这样的。如果你 checkout 一个标签,那么你又是在一个独立的头上。主要原因是,如果您从该标记进行新的提交,那么假设该提交没有被任何东西(不是任何分支或标记)引用,那么它仍然被认为是分离头。

只有当你在树枝上时,才会出现连头现象。

有关详细信息,请参阅here
Head是一个指针,它直接或间接地指向特定的提交:

附加的头意味着它连接到某个分支(即,它指向某个分支)。

分离头意味着它没有连接到任何分支,即它直接指向某个提交。

从另一个Angular 看,如果你在树枝上做cat .git/HEAD,你会得到:

ref: refs/heads/Your-current-branch-name

然后,如果您执行cat refs/heads/Your-current-branch-name,那么您还将看到分支所指向/引用的提交的SHA。

然而,如果您是在独立的Head上,您和cat .git/HEAD只会得到提交的SHA,其他什么都不会得到:

639ce5dd952a645b7c3fcbe89e88e3dd081a9912

我的意思是,头并没有指向任何树枝。它只是直接指向提交。

作为所有这些的结果,任何时候您 checkout 一个提交(不使用分支名称来 checkout ),即使该提交是您的Main分支的最新提交,您仍然处于分离头中,因为您的头没有指向您的任何本地分支。因此,即使是 checkout 一个标签也会让你处于一种独立的头脑中。此外,即使 checkout 你放入计算机的远程分支,也会导致分离的磁头,即git checkout origin main也将最终成为分离的磁头……

总结

以下所有情况都会导致机头分离:

  • checkout 任何提交
  • checkout 任何标签
  • checkout 任何远程分支机构

如果您已经结清了一家“本地”分支机构,那么您就只是一家附属机构。

特别感谢Josh CaswellSaagar Jha帮助我解决了这个问题。

lmyy7pcs

lmyy7pcs7#

如果您试图通过重新 checkout 文件并不完全正确的语法来撤消所做的更改,则很容易发生这种情况。

您可以查看git log的输出-您可以在此处粘贴上次成功提交以来的日志尾部,我们都可以看到您所做的工作。或者,您可以将其粘贴到bin中,并在Freenode IRC上的#git中很好地询问。

t2a7ltrp

t2a7ltrp8#

一种简单的偶然方法是将git checkout head作为HEAD的拼写错误。

试试这个:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

这给了我们

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme
slwdgvem

slwdgvem9#

进入GIT分离头部状态的另一种方法是尝试提交到远程分支。类似于:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

请注意,如果您执行此操作,任何进一步尝试 checkout Origin/Foo的操作都将使您返回到分离的头部状态!

解决方案是创建您自己的本地foo分支来跟踪Origin/Foo,然后选择PUSH。

这可能与你最初的问题无关,但这个页面在谷歌点击率上排名靠前的是“git分离的头”,而这个场景严重缺乏文档记录。

06odsfpq

06odsfpq10#

当您 checkout 提交git checkout <commit-hash>或远程分支时,您的头将被分离,并尝试在其上创建新的提交。

任何分支或标记都无法访问的提交将在30天后被垃圾收集并从存储库中删除。

解决此问题的另一种方法是为新创建的提交和 checkout 分支创建一个新分支。git checkout -b <branch-name> <commit-hash>

本文说明了如何进入detached HEAD状态。

k5ifujac

k5ifujac11#

在Vonc的评论之后,以下是我如何解决同样的“独立的头脑”问题的简短版本。

1.在我的遥控器中创建了一个分支;origin/feature/dev
1.在我的本地运行git fetch中,现在我的本地将知道这个新的远程分支
1.现在运行git switch feature/dev,我们就完成了!

nfg76nw0

nfg76nw012#

分离头

HEAD是指向当前 checkout 的分支或提交的指针,它回答了以下问题:我现在在存储库中的什么位置?HEAD可以处于两种状态之一:附加(默认)或分离,这取决于您是否 checkout 了本地分支。
奥普拉:我是怎么得到detached HEAD的?

操作比机头处于分离状态

最终进入detached HEAD状态可能是由于各种原因,以下是5种常见情况(可能是您执行了以下任何操作):

  • 使用散列 checkout 特定提交,即
$ git checkout 14ko3
  • 显式检出远程分支,即
$ git checkout origin/master
  • 使用分离标志(Git 2.23)切换到分支,即
$ git switch master --detached
  • checkout 标签,即
$ git checkout v1.0.1
  • 执行交互式改库(或包含冲突更改的定期改库),即
$ git rebase master feature-1 --interactive

在分离状态下,可以在不影响任何现有分支的情况下进行试验性更改。请参阅下面的信息图,说明committing在连接状态和断开状态下的区别。

一种常见的误解是,消息您处于‘分离磁头’状态是错误的,而实际上它只是描述了HEAD是如何引用当前快照的。

从脱离状态切换到附加状态

要从分离状态切换到附加状态,您可以从当前位置创建新分支,也可以切换回现有分支。

**注意:**如果您切换到另一个现有分支,而没有首先在新分支中持久化您的更改,则在分离状态下创建的任何提交最终都将被丢弃(垃圾回收后)。

9avjhtql

9avjhtql13#

就我的情况而言,事情是这样的:

  • 新建分支(FEB_DEBUGING)。
  • 运行git fetch
  • 我看到新分支(FEB_DEBUGING)被拉出
  • 现在,我使用git checkout origin/feb_debugging

这张照片让我去了,现在在……

为了解决问题,我只需要再退一次房。

  • git checkout feb_debugging
  • 现在GIT说我在FEB_DEBUGING分支。

相关问题