在问题开始之前创建一个新分支(“添加测试文件”),cherry-pick 麻烦的合并提交到它上面,指定-m 1。精心挑选的提交将是正常的提交,因此您最终会得到您所追求的简单直接的历史记录。
我会演示。我们现在的情况很像你:
* 11ef397 (HEAD -> main) Merge branch 'br2'
|\
| * 4d41b17 (br2) f
| * 0486755 e
* | 1283b7e Merge branch 'br'
|\ \
| |/
|/|
| * 85df598 (br) d
| * c7a4077 c
* | 5e70afb b
|/
* 47258d5 a
现在我将从b开始创建一个新分支:
% git switch -c newmain 5e70afb
精选的来了:
% git cherry-pick -m 1 1283b7e
% git cherry-pick -m 1 11ef397
就是这样。 newmain 分支包含您想要的历史记录。
为了完整起见,让我们抹去我们的足迹。我们将删除原来的main,将newmain重命名为main。我还将删除br 和br2,我之前合并它们时忘记删除它们:
% git branch -D main
% git branch -M main
% git branch -D br
% git branch -D br2
这就是剩下的;没有其他提交:
* 339747e (HEAD -> main) Merge branch 'br2'
* 530f9d2 Merge branch 'br'
* 5e70afb b
* 47258d5 a
这正是你所要求的。
(警告:我们刚刚改写了历史。为了将其推送到远程,我们将不得不使用武力,并且必须提前警告所有合作者,以便他们准备好扔掉现有的本地人和之后重新克隆。)