git - 撤消Git合并?

  显示原文与译文双语对照的内容

在我的主分支中,我在本地做了一个 git merge some-other-branch,但从未将更改推到原始主机。 我无意合并,所以我想撤销它。 在合并后执行 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 log 检查合并之前哪个提交。 然后你可以使用:


git reset --hard commit_sha

还有另一种方法


git reset --hard HEAD~5

会让你回到 5提交。

就像 @Velmont 在他的回答中所建议的,在这个直接用例中使用:


git reset --merge ORIG_HEAD

可能会产生更好的结果,因为它应该保留你的更改。 在这里ORIG_HEAD应该在合并发生之前直接指向提交。

引用 --merge switch的文档:

--merge

重置索引并更新在 <提交> 和HEAD之间不同的工作树中的文件,但保留索引和工作树之间的差异( 例如 。 具有还没有添加的更改。

假设你的本地主机不是原始的/主控形状,你应该能够


git reset --hard origin/master

那么你的本地 master 分支看起来应该与 origin/master 相同。

在git书由 李纳斯 和最初的日志中看到章 4 linuxtorvalds

要撤消合并 ,它是否已经发布:


git revert -m 1 commit_hash

如果再次提交分支,请务必恢复还原,如 李纳斯 。

奇怪的是,最简单的命令丢失了。 大多数回答你刚才做了一些工作,但这使得撤销合并,这个已经是简单和安全的方式:


git reset --merge ORIG_HEAD

引用 ORIG_HEAD 将指向合并之前的原始提交。

( --merge 选项与合并无关,它就像 git reset --hard ORIG_HEAD 但更安全,因为它不触及未提交的更改

你应该重置为以前的提交,这应该可以:


git reset --hard HEAD^

或者甚至 HEAD^^ 恢复恢复提交。 如果你不确定应该返回多少步,你可以始终给出完整的sha ref 。

如果有问题,并且你的主分支没有任何本地更改,你可以重置为 origin/master

好的,其他人给我的答案是相近的,但没有工作。 这就是我做的。

这样做。。


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 reset 命令。 每次我这么做的时候,消息就会被一个人改变,你可以看到。


> 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 pull,这似乎可以工作:


> 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

最近,我一直在使用 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

第一行表示发生了合并。 2第二行是我合并之前的时间。 我只是 git reset --hard 43b6032 强制这里分支在合并之前跟踪,并且 carry-on 。

你可以使用 git reflog 查找前一个签出。 有时候这是你想要返回的好状态。

具体来说


$ git reflog
$ git reset --hard HEAD@{0}

为了查看一个额外的选项,我一直在遵循下面描述的分支模型: http://nvie.com/posts/a-successful-git-branching-model/ web和 --no-ff ( 没有快进) 通常与合并。

而有标准用于部署释放branch.我只是读取这里页面我就不小心合并一个测试分支,而不是我 测试分支有两个分支合并到它,总共有六个提交。

为了恢复整个提交,我只需要一个 git reset --hard HEAD^ 它恢复了整个合并。 由于合并没有快速转发合并是一个块,一个后退是"分支未合并"。

...