我不小心在本地主分支上运行了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.
我如何撤销所有这些提交?
当前回答
暂存gitbranch-d the_local_branchgit checkout-t<远程名称>应用git存储
这对我有用。。!!
其他回答
策略:在一切都很好的地方创建一个新的分支。
理由:恢复合并很难。有太多的解决方案,这取决于许多因素,例如您是否提交或推动了合并,或者自合并以来是否有新的提交。此外,您还需要对git有相对深入的了解,以使这些解决方案适应您的情况。如果你盲目地遵循一些指令,你可能会得到一个“空合并”,没有任何东西会被合并,进一步的合并尝试会让Git告诉你“已经是最新的”。
解决方案:
假设您想将dev合并到feature-1中。
查找要接收合并的修订:git log--单行功能-1a1b2c3d4将分支“dev”合并到“feature-1”<--要撤消的合并e5f6g7h8修复零点模块中的NPE<--合并前的NPE,您可能需要这个查看(及时返回):数字结账e5f6g7h8从那里创建一个新分支并签出:git签出-b功能-1
现在您可以重新启动合并:
合并:gitmerge-dev修复合并冲突。提交:gitcommit当您对结果满意时,删除旧分支:gitbranch--delete feature-1
好吧,这里的其他人给我的答案很接近,但没用。这是我所做的。
正在执行此操作。。。
git reset --hard HEAD^
git status
…给了我以下状态。
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
然后,我不得不多次输入相同的git重置命令。每次我这样做时,信息都会改变一个,如下所示。
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
此时,我看到状态消息发生了变化,所以我尝试进行git拉动,这似乎奏效了:
> git pull
Updating 2df6af4..12bbd2f
Fast forward
app/views/truncated | 9 ++++++---
app/views/truncated | 13 +++++++++++++
app/views/truncated | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master
长话短说,我的命令归结为:
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
如果您想要一个命令行解决方案,我建议您只使用MBO的答案。
如果您是新手,您可能会喜欢图形化方法:
启动gitk(从命令行,或在文件浏览器中单击鼠标右键(如果有))您可以很容易地在那里发现合并提交-从顶部开始的第一个节点有两个父节点按照第一个/左侧父级的链接(合并前当前分支上的父级,通常为红色)在所选提交上,右键单击“将分支重置到此处”,选择此处的硬重置
参见Git书的第4章和Linus Torvalds的原始帖子。
要撤消已推送的合并,请执行以下操作:
git revert -m 1 commit_hash
如果您再次提交分支,请务必还原还原,就像Linus所说的那样。
使用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之间不同的工作树中的文件,但保留索引和工作树之间不同的文件(即具有尚未添加的更改)。