今天我得到了一个独立的头,同样的问题描述在:git push says everything up-to-date even though I have local changes
据我所知,我没有做任何不寻常的事情,只是承诺和推动我的本地回购。
那么我怎么会得到一个detached HEAD
呢?
今天我得到了一个独立的头,同样的问题描述在:git push says everything up-to-date even though I have local changes
据我所知,我没有做任何不寻常的事情,只是承诺和推动我的本地回购。
那么我怎么会得到一个detached HEAD
呢?
13条答案
按热度按时间kpbpu0081#
如果提交的名称不是您的某个分支的名称,则会得到一个分离的头部。表示树枝顶端的SHA1仍然提供分离的头部。只有本地分行名称的结账操作才能避免这种模式。
请参见使用分离的头部提交
分离Head时,将像正常一样提交工作,但不会更新任何命名分支。(您可以将其视为匿名分支。)
例如,如果您 checkout 一个“远程分支”而没有首先跟踪它,那么您最终可能会得到一个分离的头。
见git: switch branch without detaching head
含义:
git checkout origin/main
(或origin/master
in the old days)将导致:这就是为什么您不应该再使用
git checkout
,而应该使用新的git switch
命令。使用
git switch
,同样的“ checkout ”(切换到)远程分支机构的尝试将立即失败:要在
git switch
上添加更多信息:有了Git 2.23(2019年8月),你就不再需要使用confusing
git checkout
command了。git switch
还可以检出分支,并获得分离头,但以下情况除外:--detach
选项要在不创建新分支的情况下 checkout 提交
HEAD~3
以进行临时检查或试验,请执行以下操作:请参见:
v.v.使用新的
git switch
命令:如果要创建跟踪远程分支机构的新本地分支机构:
如果未找到
<branch>
,但在一个远程(称为<remote>
)中确实存在具有匹配名称的跟踪分支,请将其视为等同于别再犯错误了!
不再有不想要的脱离的脑袋!
如果你用
git switch <tag>
代替git switch --detach <tag>
,Git 2.36 will help you to remember the missing--detach
option。t2a7ltrp2#
我刚才不小心转载了这个:
1.列出远程分支
1.我想在本地结账,所以我剪了一张:
1.Presto!分离的磁头状态
方案一:
检出分支规范时,请不要在其前面包含
origin/
:方案二:
添加
-b
参数,用于从远程创建本地分支git checkout -b origin/Feature/f1234
或git checkout -b Feature/f1234
会自动退回原点h9vpoimq3#
试试看
这给了你一个历史,你的头和分支指针在过去是如何移动的。
例如:
88ea06b Head@{0}: checkout :从开发转移到远程/Origin/SomeNiceFeature e47bf80 Head@{1}:拉回源开发:快进
这个列表的首位是人们可能会遇到的一个独立的头目状态...正在查看一家远程跟踪分支机构。
dfty9e194#
Detached HEAD
表示当前 checkout 的不是本地分行。会导致
Detached HEAD
状态的一些场景:origin/master
。这是一个只读分支。因此,当从origin/master
创建提交时,它将是自由浮动的,即不连接到任何分支。当您想要返回并 checkout 特定的提交或标记以从那里开始工作时,您可以创建一个源自该提交的新分支,并通过
git checkout -b new_branch_name
切换到它。这将防止Detached HEAD
状态,因为您现在 checkout 了分支,而不是提交。wswtfjt75#
如果您有一个与分支名称相同的标记,则可能会发生这种情况。
示例:如果“Release/0.1”是标记名,则
在“Release/0.1”时产生分离的头部。如果您期望Release/0.1是分支名称,那么您就会感到困惑。
twh00eeo6#
如果git将其重命名为
detached HEAD
,我会将其命名为一个无法被分支识别的头,并且很快就会被遗忘。我们作为人很容易记住分行的名字。我们做
git checkout new-button-feature
/git checkout main
。main
和new-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
,你会得到:然后,如果您执行
cat refs/heads/Your-current-branch-name
,那么您还将看到分支所指向/引用的提交的SHA。然而,如果您是在独立的Head上,您和
cat .git/HEAD
只会得到提交的SHA,其他什么都不会得到:我的意思是,头并没有指向任何树枝。它只是直接指向提交。
作为所有这些的结果,任何时候您 checkout 一个提交(不使用分支名称来 checkout ),即使该提交是您的Main分支的最新提交,您仍然处于分离头中,因为您的头没有指向您的任何本地分支。因此,即使是 checkout 一个标签也会让你处于一种独立的头脑中。此外,即使 checkout 你放入计算机的远程分支,也会导致分离的磁头,即
git checkout origin main
也将最终成为分离的磁头……总结
以下所有情况都会导致机头分离:
如果您已经结清了一家“本地”分支机构,那么您就只是一家附属机构。
特别感谢Josh Caswell和Saagar Jha帮助我解决了这个问题。
lmyy7pcs7#
如果您试图通过重新 checkout 文件并不完全正确的语法来撤消所做的更改,则很容易发生这种情况。
您可以查看
git log
的输出-您可以在此处粘贴上次成功提交以来的日志尾部,我们都可以看到您所做的工作。或者,您可以将其粘贴到bin中,并在Freenode IRC上的#git
中很好地询问。t2a7ltrp8#
一种简单的偶然方法是将
git checkout head
作为HEAD
的拼写错误。试试这个:
这给了我们
slwdgvem9#
进入GIT分离头部状态的另一种方法是尝试提交到远程分支。类似于:
请注意,如果您执行此操作,任何进一步尝试 checkout Origin/Foo的操作都将使您返回到分离的头部状态!
解决方案是创建您自己的本地foo分支来跟踪Origin/Foo,然后选择PUSH。
这可能与你最初的问题无关,但这个页面在谷歌点击率上排名靠前的是“git分离的头”,而这个场景严重缺乏文档记录。
06odsfpq10#
当您 checkout 提交
git checkout <commit-hash>
或远程分支时,您的头将被分离,并尝试在其上创建新的提交。任何分支或标记都无法访问的提交将在30天后被垃圾收集并从存储库中删除。
解决此问题的另一种方法是为新创建的提交和 checkout 分支创建一个新分支。
git checkout -b <branch-name> <commit-hash>
本文说明了如何进入detached HEAD状态。
k5ifujac11#
在Vonc的评论之后,以下是我如何解决同样的“独立的头脑”问题的简短版本。
1.在我的遥控器中创建了一个分支;
origin/feature/dev
1.在我的本地运行
git fetch
中,现在我的本地将知道这个新的远程分支1.现在运行
git switch feature/dev
,我们就完成了!nfg76nw012#
分离头
HEAD
是指向当前 checkout 的分支或提交的指针,它回答了以下问题:我现在在存储库中的什么位置?HEAD
可以处于两种状态之一:附加(默认)或分离,这取决于您是否 checkout 了本地分支。奥普拉:我是怎么得到
detached HEAD
的?操作比机头处于分离状态
最终进入
detached HEAD
状态可能是由于各种原因,以下是5种常见情况(可能是您执行了以下任何操作):在分离状态下,可以在不影响任何现有分支的情况下进行试验性更改。请参阅下面的信息图,说明
committing
在连接状态和断开状态下的区别。一种常见的误解是,消息您处于‘分离磁头’状态是错误的,而实际上它只是描述了
HEAD
是如何引用当前快照的。从脱离状态切换到附加状态
要从分离状态切换到附加状态,您可以从当前位置创建新分支,也可以切换回现有分支。
**注意:**如果您切换到另一个现有分支,而没有首先在新分支中持久化您的更改,则在分离状态下创建的任何提交最终都将被丢弃(垃圾回收后)。
9avjhtql13#
就我的情况而言,事情是这样的:
git fetch
git checkout origin/feb_debugging
这张照片让我去了,现在在……
为了解决问题,我只需要再退一次房。
git checkout feb_debugging