我不小心在本地主分支上运行了gitmergesome_other_branch。我还没有将更改推送给origin master。如何撤消合并?
合并后,git状态显示:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我如何撤销所有这些提交?
我不小心在本地主分支上运行了gitmergesome_other_branch。我还没有将更改推送给origin master。如何撤消合并?
合并后,git状态显示:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我如何撤销所有这些提交?
当前回答
如果您想要一个命令行解决方案,我建议您只使用MBO的答案。
如果您是新手,您可能会喜欢图形化方法:
启动gitk(从命令行,或在文件浏览器中单击鼠标右键(如果有))您可以很容易地在那里发现合并提交-从顶部开始的第一个节点有两个父节点按照第一个/左侧父级的链接(合并前当前分支上的父级,通常为红色)在所选提交上,右键单击“将分支重置到此处”,选择此处的硬重置
其他回答
使用git reflog检查合并之前的提交(git refog将是比git log更好的选项)。然后,您可以使用以下方法重置它:
git reset --hard commit_sha
还有另一种方法:
git reset --hard HEAD~1
它会让你回到我的承诺。
请注意,任何已修改和未提交/未提交的文件都将重置为其未修改的状态。要保留它们,要么隐藏更改,要么查看下面的--merge选项。
正如@Velmont在下面的回答中所建议的,在这个直接案例中,使用:
git reset --hard ORIG_HEAD
可能会产生更好的结果,因为它应该保留您的更改。ORIG_HEAD将在合并发生之前直接指向提交,因此您不必自己寻找它。
另一个技巧是使用--merge开关而不是--hard,因为它不会不必要地重置文件:
git reset --merge ORIG_HEAD
--合并重置索引并更新<commit>和HEAD之间不同的工作树中的文件,但保留索引和工作树之间不同的文件(即具有尚未添加的更改)。
在这种情况下,您需要使用git-reset--hard<branch_name>重置分支。如果要在重新设置之前保存更改,请确保创建一个新的分支并git checkout<branch_name>。
您也可以使用git-reset--hard<commit_id>将状态重置为特定的提交。
如果已推送更改,则可以改用git-restore<branch_name>。请务必了解如何在其他场景中使用git还原和git签出。
您应该重置为上一次提交。这应该是有效的:
git reset --hard HEAD^
或者甚至HEAD^^还原该还原提交。如果您不确定应该后退多少步,您可以始终提供完整的SHA参考。
如果出现问题,并且主分支没有任何本地更改,则可以重置为原始/主分支。
参见Git书的第4章和Linus Torvalds的原始帖子。
要撤消已推送的合并,请执行以下操作:
git revert -m 1 commit_hash
如果您再次提交分支,请务必还原还原,就像Linus所说的那样。
最简单的机会,比这里说的任何事情都简单得多:
删除本地分支(本地,而不是远程),然后再次拉动它。这样,您将撤消主分支上的更改,任何人都将受到您不想推送的更改的影响。重新开始。