我不小心在本地主分支上运行了git merge some_other_branch
。我还没有将更改推送到origin主分支。如何撤消合并?
合并后,git status
显示:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
如何撤销所有这些提交?
我不小心在本地主分支上运行了git merge some_other_branch
。我还没有将更改推送到origin主分支。如何撤消合并?
合并后,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
它会将您带回到上一个提交。
请注意,任何已更改但未提交/保存的文件都将被重置为其未修改的状态。要保留更改,请隐藏它们或查看下面的--merge
选项。
如@Velmont在他的答案中建议的那样,在这种直接情况下使用:
git reset --hard ORIG_HEAD
使用--merge
开关而不是--hard
可能会产生更好的结果,因为它可以保留您的更改。 ORIG_HEAD
将指向合并之前的提交,因此您无需自行寻找。
另一个提示是使用--merge
开关而不是--hard
,因为它不会不必要地重置文件:
git reset --merge ORIG_HEAD
--merge
该选项会重置索引,并更新工作树中 <commit> 和 HEAD 之间不同的文件,但保留索引和工作树之间不同的文件(即有未添加更改的文件)。
git log
默认选择显示的结果 - 可能有不同输出的git log
或git reflog
可以用于此) - John Bachirgit log
命令的输出中,您需要查看两个父提交记录。其中一个是您所在分支的最新提交,另一个是您合并的分支的最新提交。您需要使用git reset --hard
命令将当前分支重置到您合并的分支的父提交记录上。 - Justingit reset --hard <commit_sha>
。 - Max Williams假设你的本地主分支没有领先于origin/master,那么你应该可以执行以下操作:
git reset --hard origin/<branch-name>
所以假设你在 master
分支上执行了这个操作,那么你本地的 master
分支应该和 origin/master
一模一样。
请参阅Git书籍的第四章和Linus Torvalds的原始帖子。
要撤消已经推送的合并操作:
git revert -m 1 commit_hash
如果你再次提交该分支,请确保撤销还原,就像Linus所说的那样。
git revert -m 1 <commit>
命令。问题在于这样做并不能消除他意外合并的错误提交(但尚未推送)。其他关于硬重置的回答更适合原帖作者的问题。 - user456814最简单的命令竟然失踪了,这很奇怪。大多数答案都可以实现,但撤销你刚刚完成的合并,这是最简单且安全的方法:
git reset --merge ORIG_HEAD
引用 ORIG_HEAD
指向合并之前的原始提交。
(--merge
选项与合并无关。它就像 git reset --hard ORIG_HEAD
,但更安全,因为它不会触及未提交的更改。)
git reset --merge ORIG_HEAD
命令将保留这些更改。 - yingtedgit reset --hard HEAD~5
的命令都只会重置HEAD(可能会删除主分支和分支1中的提交)。只有使用--merge
选项才会删除合并。 - Manu Manjunath如果你使用较新版本的Git,并且你还没有提交合并,同时你遇到了合并冲突,那么可以简单地执行以下操作:
git merge --abort
来自 man git merge
:
[这个命令] 只能在合并产生冲突后运行。
git merge --abort
命令将中止合并过程并尝试重建合并前的状态。
你应该重置到上一个提交。这应该可以工作:
git reset --hard HEAD^
或者甚至使用HEAD^^
来还原该撤销提交。如果不确定应该回退多少步骤,您可以始终给出完整的SHA参考。
如果存在问题且您的主分支没有任何本地更改,则可以重置为origin/master
。
ORIG_HEAD
,为什么不使用它呢? - odinho - Velmont最近,我一直在使用git reflog
来帮助解决这个问题。这主要只适用于刚刚发生合并的情况,并且该合并是在您的计算机上进行的。
git reflog
可能会返回类似以下内容的结果:
fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting
第一行表示发生了合并。第二行是在我合并之前的时间。我只需使用git reset --hard 43b6032
来强制让该分支跟踪合并之前的状态,并继续进行。
reflog
获取 SHA 并将其传递到 git reset
中是可行的。 - user692942如果你正在合并中,你可以随时中止它。
git merge --abort
使用现代 Git,您可以:
git merge --abort
旧的语法:
git reset --merge
老派:
git reset --hard
但实际上值得注意的是,只有在MERGE_HEAD
存在的情况下,git merge --abort
才等同于git reset --merge
。这可以在Git合并命令的帮助文档中阅读到。
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
当合并失败时,如果没有MERGE_HEAD
,可以使用git reset --merge
撤销失败的合并,但不一定能使用git merge --abort
,因此它们不仅是相同事物的旧语法和新语法。
个人认为git reset --merge
在日常工作中更加强大和有用,所以我总是使用它。
git apply --3way
失败后,git reset --merge
帮了我一个大忙,其他答案都没用。这似乎是因为没有 MERGE_HEAD。 - nckturner如果分支已经合并但未推送,那么以下给出的git reset命令可以撤销合并操作:
git reset --merge ORIG_HEAD
例子:
git reset --merge origin/master