撤销一个还未推送的 git 合并操作

58

我刚刚提交了一些更改到我的一个功能分支("feedback_tab"),然后切换到"master"分支并将它们合并到了那里。事实上,我是想将它们合并到我的"development"分支中。

现在,master分支比其远程分支'origin/master'领先17个提交 - 我还没有推送这个合并(很显然也不想)。我该如何将master分支恢复到意外合并之前的状态?在这方面,我在使用git revertgit reset时感到困惑。

我查看了我的git日志,没有记录将feedback_tab合并到master分支。我本以为它会是顶部记录?

有点困惑:/ 欢迎任何帮助!max


@myself:哦,亲爱的,应该读一下常见程序员使用的软件工具的FAQ。 - orlp
4个回答

94

要撤销尚未推送的合并:

git reset --merge ORIG_HEAD

如果在合并过程中遇到冲突,撤销合并的最佳方法是:

git merge --abort

谢谢,这非常清晰并且直接回答了问题。它也有效。=) - David Lay
这很有帮助!谢谢。 - Prem Raj
4
这个命令 git reset --merge HEAD~1 对我很有帮助。 - Woland

37

git reset --hard HEAD~17 将您带回到当前主分支的头部之前 17 次提交。 git rebase -i HEAD~17 很可能也会消除多余的提交。


26
你可以尝试使用 reset --merge 命令。如果只进行了合并操作,那么该命令与 --hard 命令的效果相同,但是如果你在合并之前对某些文件进行了修改,reset --merge 会将这些文件保留下来,而不像 --hard 命令那样将其删除。 - Cascabel
17
也可以执行git reset --hard origin/master命令。 - Karl
@Jefromi - 啊,好的,下次会记住的。谢谢! - Max Williams
@Karl - 我理解这句话就是“将当前分支复制为origin/master的副本”,对吗? - Max Williams
@Max:我会说“将当前分支指向与origin/master相同的提交(并将索引和工作树一起拖动)”。但是,是的,这基本上是一份副本。 - Cascabel
@Jefromi 非常感谢。你是救命恩人! - Ujjwal Ojha

12

来自git reset

Undo a merge or pull

    $ git pull                         <1>
    Auto-merging nitfol
    CONFLICT (content): Merge conflict in nitfol
    Automatic merge failed; fix conflicts and then commit the result.
    $ git reset --hard                 <2>
    $ git pull . topic/branch          <3>
    Updating from 41223... to 13134...
    Fast-forward
    $ git reset --hard ORIG_HEAD       <4>

6
这个一定能行!
git reset --hard HEAD~1 
git init

第一个命令将撤销您最近所做的更改(合并);第二个命令将初始化存储库到最新状态(因此将快进到原始版本库的最新状态)。

我已经尝试过。

git reset --merge

但它并没有起到作用。


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