如何将 git 分支重置为给定的先前提交并修复分离的 HEAD?

Mic*_*ant 4 git

我需要将我的分支重置为早期的工作状态(提交),所以我做了:

git reset --hard c70e611
Run Code Online (Sandbox Code Playgroud)

现在我明白了

HEAD detached at c70e611
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)

如何修复/理解/绕过分离的头部消息并推送,以便 c70e611 现在是我正在使用的最新提交,并代表我正在工作的分支(不是主)的 HEAD。

Ste*_*itt 6

HEAD是您的工作区当前在git提交树中的位置;detached意味着它不对应于一个分支。要解决此问题,您应该创建一个新分支git checkout -b branch(替换branch为您想要为新分支提供的名称)。

如果您想删除重置后的提交,您可以删除 master 分支并重新创建它:

git branch -D master
git checkout -b master
Run Code Online (Sandbox Code Playgroud)

如果您正在处理一个推送到其他地方的存储库,您需要做更多的工作来修复问题,可能会强制推送(并告诉其他人重新克隆他们的工作区)。如果你有共享状态,你真的应该创建一个还原提交;看一下git revert(从master以下提交开始并恢复所有提交c70e611)。


Kaz*_*Kaz 2

HEAD detached at c70e611

这是因为当您执行 时git reset --hard,您当时不在任何分支上。你有一个分离的HEAD,并且那个分离的头随着命令而移动git reset --hard,同时将你的工作树重写为该状态。

如果你想要某个分支fooc70611,那么:

git checkout foo
git reset --hard c70611
Run Code Online (Sandbox Code Playgroud)

如果这被认为是推向foo上游的良好状态,那么就可以了git push <remote-name> foo

有一种更直接的方法可以强制foo执行c70611而不检查它是否是当前分支。也就是说,您可以foo使用该git update-ref命令重写指向的内容。

在做上述任何事情之前,我会停下来,试着看看我是如何在没有注意到的情况下陷入分离状态的。也许这是一个未完成的变基或其他什么。第一步是回顾最后几个条目,以git reflog帮助唤起您的记忆。