协慌网

登录 贡献 社区

撤消尚未推送的 Git 合并

在我的主分支中,我在本地做了一个git merge some-other-branch ,但从未将更改推送到 origin master。我不是故意合并,所以我想撤消它。合并后执行git status ,我收到此消息:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

根据我发现的一些说明 ,我试着跑步

git revert HEAD -m 1

但现在我收到git status消息:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

我不希望我的分支机构通过任意数量的提交来领先。我该如何回到这一点?

答案

使用git reflog检查哪个提交是合并之前的一个(git reflog 将是比 git log 更好的选项)。然后你可以使用以下方法重置它

git reset --hard commit_sha

还有另一种方式

git reset --hard HEAD~1

会让你回来 1 提交。

请注意,任何已修改和未提交 / 未缓存的文件都将重置为未修改状态 。要保持它们--merge更改或查看下面的--merge选项。


正如 @Velmont 在他的回答中所建议的那样,在这个直接案例中使用:

git reset --hard ORIG_HEAD

可能会产生更好的结果,因为它应该保留您的更改。 ORIG_HEAD将在合并发生之前直接指向提交,因此您不必自己寻找它。


另一个提示是使用--merge开关而不是--hard因为它不会不必要地重置文件:

- 合并

重置索引并更新工作树中 和 HEAD 之间不同的文件,但保留索引和工作树之间不同的文件(即哪些文件尚未添加更改)。

假设您的本地主人不在原点 / 主人之前,您应该能够做到

git reset --hard origin/master

然后您的本地master分支看起来应该与origin/master相同。

请参阅Git 书中的第 4 章和 Linus Torvalds 的原始帖子

要撤消已推送的合并:

git revert -m 1 commit_hash

如果你再次提交分支,请确保恢复恢复,如 Linus 所说。