Git: 如何修改旧合并(在一系列合并中)?

Git: how to amend an old merge (in a series of merges)?

我的情况是这样的:

(branch 1) A -- B -- C
                      \
(dev br)     E -- F -- G -- H
                 /         /
(branch 2) I -- J -- K -- L

一切正常。不幸的是,我发现我需要对 F 进行更改(post 在 J 和 E 之间提交),所以我试图完成以下操作:

(branch 1) A -- B -- C
                      \
(dev br)     E -- F' -- G -- H
                 /         /
(branch 2) I -- J -- K -- L

我最初的方法是再次提交 dev br 上的修复并进行变基并将其压缩为 F。但是,这使我解决了 C-G 合并和 L-H 合并的所有合并冲突再次,这是相当复杂的,我不想做。

下一次尝试,我基本上检查了 F,进行了更改,然后在上面挑选了 G。这做出了正确的更改,我不必解决太多问题。但是,现在 git 不认为这是合并(因为我猜它是精心挑选的,尽管我提供了 -m 命令)。有没有办法不丢失合并信息?

我也用 rebase 尝试过,运行 它作为 git rebase --onto F' C G,但这也让我经历了所有以前的提交(A-C,但实际上还有更多)并解决了他们再次发生冲突。

我该怎么做才不会发疯?我敢肯定一定有一个正确的方法来做到这一点。

I'll give it until tomorrow to see if anyone knows any sweet git tricks.

好的:给你一个"Git trick"。
根据您的描述,cherry-pick 是最有前途的方法。

"However, now Git doesn't think that this is a merge".

但它可以。

F修改为F'后:

  • 让你的选择 无需 立即提交:

    git cherry-pick --no-commit -m 1 vG
    git stash
    
  • 添加合并信息(不重做任何合并,采用ours策略)

    git merge -s ours -m "Gp" branch1
    git stash pop
    git commit --amend --no-edit
    

这将创建一个 G'G 素数,或 Gp),它记录来自 branch1 的合并,同时保留 cherry-pick 的结果完好无损。

您可能需要为 H 重复该操作,您就完成了。

OP Catsunami mentioned below 需要 git stash 才能允许合并继续进行)