git - 撤消 git merge ,保留后来的提交

标签 git merge branch undo

<分区>

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

我的分支树结构如下:

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

在这里,我在创建分支时在提交 1 时从 master 分支出来,然后在提交 5 时将 master merge 到分支中。

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

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

我的目标是能够将 master merge 回 branch,但现在我会更小心地 merge 。

谢谢。

最佳答案

(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

关于git - 撤消 git merge ,保留后来的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17100576/

相关文章:

git - Dockerfile git克隆文件权限

php - 对数据行进行分组,在组内维护一个id的子数组,只呈现每组中最低的id作为一级key

audio - 使用 ffmpeg 合并多个视频和一个音频。在音频未结束时循环播放所有视频

linux - 如何列出 Mercurial 中属于不同分支的所有文件?

Mercurial 分支和书签

python - GitPython 标签排序

git - 如何备份本地 Git 存储库?

Git 与 SVN 主干和分支

c# - 合并两个 SQLite 数据库文件 (C# .NET)

git - 我如何发布到 <me>.github.com?