【问题标题】:Undo a git merge, keep commits that came later [duplicate]撤消 git 合并,保留后来的提交 [重复]
【发布时间】:2013-06-10 15:15:45
【问题描述】:

我的 repo 偶然发现了这个问题:

我的分支树结构如下:

(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

在这里,当我创建分支时,我在提交 1 时从 master 分支,然后在提交 5 时将 master 合并到分支中。

问题是:在合并时,我丢弃了一些更改,我想恢复它们,这样我就可以再次将 master 合并到我的分支中,就好像提交 5 的合并从未发生过一样。

换句话说,我如何撤消合并对提交 5(或提交 d)的影响,而不会丢失我在后续提交中的更改? (即e-f-g)

我的目标是能够将 master 合并回分支,但现在我会更加小心我的合并。

谢谢。

【问题讨论】:

  • 您的分支是否已与其他人共享(推送)?或者变基可以吗?
  • 已经上传到服务器了,但是没人动。是的,只要我能够保留更改,就可以重新设置它。所以,比如说,如果你想变基到 c,只要我能保持 e - f - g,但失去 d 就可以了。
  • 这个问题似乎与this question 重复。是吗?
  • 我已经尝试了答案中的方法。但是,这两个分支已经不同步很长时间了,我根本没有在 shell 中看到 commit d。但是,最后一个答案似乎很有希望,我明天试试。

标签: git merge branch undo


【解决方案1】:
(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

git rebase --onto c d g
git checkout -b newbranch

(newbranch)                e' - f' - g'
                          /
(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

如果您对结果满意,则丢弃旧分支并重命名新分支:

git branch -D branch
git branch -m newbranch branch

终于推送新的分支了。

git push -n origin branch # check what you're about to push
git push -f origin branch # -f is required to rewrite history; be careful

【讨论】:

  • 我使用了你创建新分支的想法,但之后我采取了不同的方法。我基本上从分支中挑选提交 e - f - g ... 到新分支。不过,感谢您将我引向正确的轨道!
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2019-11-15
  • 2021-05-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2020-01-06
  • 2019-04-28
相关资源
最近更新 更多