撤消 Git 中的合并,以便不存在来自其他分支的提交

Undoing the merge in Git so that no commits from the other branch exist

我有两个分支:developmentbug_fixes,不小心合并了development 两到三周前在 bug_fixes 分支,从那以后一直致力于 bug_fixes ,我已经推送了 bug_fixes.

中的更改

现在,我需要取消合并 development 分支。我想要一个没有提交形式的纯 bug_fixes 分支 development 分支。通过谷歌搜索,我想到了以下场景:

1) 还原合并 development 分支到 bug_fixes 分支的提交,但它部分完成了工作。 development 分支的提交仍然可以在 bug_fixes 分支中看到,这不是必需的。

2) 变基,并删除进行合并的提交,但它仍然存在第 1 点中描述的相同问题。bug_fixes 分支仍然包含提交来自 发展 分支。

有没有一种方法可以删除合并提交,以及 bug_fixes 分支形式 development[=38= 中的所有提交] 分支,也会被删除?或者,这不可能?

如果您知道哪些提交来自开发分支(除了合并提交),您可以从最后一次良好的错误修复提交中执行 git rebase -i (interactive rebase)

 b--b--(B)--M--d--b--d--b--b (bugfix)
           /
    d--d--d  (devel)

git checkout bugfix
git rebase -i (B)
# drop M, d, and d

 b--b--(B)--b'--b'--b' (bugfix)

    d--d--d  (devel)

更复杂的替代方案是 git filter-branch,但希望交互式变基就足够了。

OP's 中,完整的命令是:

git rebase -p -i (b)

-p 允许保留合并提交。

我会尝试以下方法:

首先,列出两个分支中的提交列表:

git checkout development
git log --oneline > log-devel.txt

git checkout bug_fixing
git log --oneline > log-bugfixing.txt

其次,在执行合并之前在每个分支中识别最后一次提交的 id。让我们将这些提交命名为 devel-0bugfixing-0 然后,将您的分支恢复到意外合并之前的状态:

git checkout development
git reset --hard <devel-0-hash>

git checkout bug_fixing
git reset --hard <bugfixin-0-hash>

此时你有两个干净但过时的 git 分支。现在,您应该从 log-devel.txtlog-bugfixing.txt 中取出所有未包含在当前分支中的提交,并将它们添加到相应的分支中。要将 ID 为 abc0123 的提交添加到您的分支 development,您可以使用 cherry pick:

git checkout development
git cherry-pick `abc0123`

考虑到提交最好按照它们添加到 bug 修复分支的相同顺序添加到干净分支,以最大程度地减少出现的冲突数量。

merge 之前,您需要知道 bug_fixes 的最新提交消息,如果您知道 sha 哈希,那么 evne更好。

现在您首先需要使用命令

找到 sha 哈希

$ git reflog

输出类似于

1fb5738 HEAD@{10}: commit...

4d47df6 HEAD@{11}: commit...

5f32c4b HEAD@{12}: merge...

428f91d HEAD@{13}: checkout...

5f32c4b HEAD@{14}: checkout...

第一部分是 sha 哈希。在这种情况下,合并前的状态具有哈希值 428f91d

所以现在,在 bug_fixes 分支中我们重置为这个哈希值

git reset --hard 428f91d

现在取消了

让我用下面的例子来描述这个场景

错误修复分支:修订版 10

合并开发分支:修订版 11

合并后的多项更改:修订版 12 - 修订版 15

-

现在需要完成 2 个步骤(没有 git 本机命令的简单方法)

  1. 返回修订版 10

    将最新代码克隆到名为 "latest"

    的文件夹中

    将修订版 10 克隆到名为 "rev10"

    的文件夹中

    删除最新文件夹中的所有内容(.git 文件夹除外)

    将 rev10 文件夹中的所有内容(.git 文件夹除外)复制到最新文件夹

    正在检查最新的文件夹内容

现在,Bug 修复分支的内容将与修订版 10 相同,而无需任何开发人员分支更改

  1. 可选 - 将修订版 12 - 修订版 15 合并到 bug_fix 分支

    因为我们已经恢复到旧版本,最新提交到 bugfix 分支的也不见了 此修订需要手动一一合并回bug fix branch