Git: 如何在合并后进行重置?

13

我已经使用以下命令将来自朋友存储库的主分支合并到我的工作目录中的branch_a:

git pull my_friend master

我发现合并后的版本有错误。为了继续开发,我想回退到合并之前的最后一次提交。
我尝试过:

git reset --hard HEAD

但这把我带回到了合并后的状态。(pull命令会提交吗?!)
我还尝试过:

git revert HEAD

但是收到了以下错误:

致命错误:提交2d72d8f367b987d8c16f5cb1a543a6886acdcf83是一个合并,但未给出-m选项。

我该怎么办?


我将您标题中的“revert”更改为“reset”,因为重置是您想要实现的目标。 - Ben James
3个回答

33

HEAD指的是当前提交(通常是当前检出分支的顶端)。您已经提交了合并,因此HEAD指向合并提交。如果您想返回到它之前的提交,请使用:

git reset --hard HEAD^
^ 表示“第一个父提交”; 对于普通的提交,它是唯一的父提交,对于合并提交,它是你在合并时检出的提交(即你合并到的分支之前的末端)。如果迷失方向,可以打开 gitk,复制要重置的提交的 SHA1(git reset --hard SHA1),或者右键单击该提交并在 gitk 中进行重置。此外,revert 并不意味着你想象的那样(听起来你可能是以 svn 的方式使用它?但我从未使用过 svn)。git revert 用于创建一个提交,通过应用反向差异来取消(还原)先前的提交。当你想撤销已经发布的单个先前提交时,就可以使用它。

对于不想进行硬重置的人,可以像@Jefromi所说的那样使用git revert来“撤消”最后一次提交,从而保留两个事件的历史记录。有关git revert的更多信息,请参见:此答案 - dav_i

2
在拉取之后,HEAD已经移动到最新的提交,即合并两个分支的合并提交,而不是您上次工作的提交。所以这就是为什么reset HEAD不会改变任何东西的原因。 revert HEAD也不是您想要做的操作,因为它试图创建一个撤销合并提交更改的新提交。(这就是为什么您会看到错误;在不告诉git要返回哪个父提交的情况下,您无法撤销合并提交。)
我认为您想要的是:
git reset [--hard] HEAD^

这将会重置到合并提交之前的提交。


2

pull 命令会提交吗?

会的。Pull 命令是 fetch 和 merge 的包装器。如果你想在合并之前查看别人的更改,只需执行 fetch 命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接