![如何将 git 分支重置为给定的先前提交并修复分离的 HEAD?](https://linux22.com/image/79465/%E5%A6%82%E4%BD%95%E5%B0%86%20git%20%E5%88%86%E6%94%AF%E9%87%8D%E7%BD%AE%E4%B8%BA%E7%BB%99%E5%AE%9A%E7%9A%84%E5%85%88%E5%89%8D%E6%8F%90%E4%BA%A4%E5%B9%B6%E4%BF%AE%E5%A4%8D%E5%88%86%E7%A6%BB%E7%9A%84%20HEAD%EF%BC%9F.png)
我需要将我的分支重置为较早的工作状态(提交),所以我这样做了:
git reset --hard c70e611
现在我明白了
HEAD detached at c70e611
nothing to commit, working directory clean
如何修复/理解/绕过分离的头消息并推送,以便 c70e611 现在是我正在使用的最新提交,并代表我正在工作的分支(而不是主分支)的 HEAD。
答案1
HEAD
是您的工作区当前在提交树中的位置git
;detached
表示它不对应于分支。要解决此问题,您应该创建一个新分支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
,同时将你的工作树重写为该状态。
如果你想要某个分支foo
是c70611
,那么:
git checkout foo
git reset --hard c70611
如果这被认为是推向foo
上游的良好状态,那么就可以了git push <remote-name> foo
。
有一种更直接的方法可以强制foo
执行c70611
而不检查它是否是当前分支。也就是说,您可以foo
使用该git update-ref
命令重写指向的内容。
在做上述任何事情之前,我会停下来,试着看看我是如何在没有注意到的情况下陷入分离状态的。也许这是一个未完成的变基或其他什么。第一步是回顾最后几个条目,以git reflog
帮助唤起您的记忆。