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

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

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

git reset --hard c70e611

现在我明白了

HEAD detached at c70e611
nothing to commit, working directory clean

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

答案1

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

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

git branch -D master
git checkout -b master

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

答案2

HEAD detached at c70e611

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

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

git checkout foo
git reset --hard c70611

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

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

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

相关内容