Git 如何为合并插入不同的共同祖先

Git how to insert a different common ancestor for merge

我正在尝试合并 Git 中的两个不同分支,如下所示:

                         [Mod 1 binary] - [Mod 1 Text]
                    /                                 \
[Original(Binary)]                                      [CombinedText]   
                    \                                 /
                         [Mod 2 Binary] - [Mod 2 Text]

问题是我使用的合并工具只能处理文本文件,因此二进制文件不能作为共同祖先。我想用转换工具 ant 从原始二进制文件制作一个文本文件,然后有一个这样的结构,这样我就可以合并:

                                     [Mod 1 Text]
                                   /               \
[OriginalBinary] - [Original Text]                    [Combined Text]
                                   \                /
                                     [Mod 2 Text]

我怎样才能做到这一点?

听起来你应该完全按照你说的去做:"commit on a new branch"。在基于 shell 的会话中,您的任务可能是这样的:

$ git checkout -b work-br <commit-id>

(这里<commit-id>是包含OriginalBinary的commit的ID),那么:

$ tool_cmd [options] binary [> text]  # or however this works
$ git add text
$ git commit

您现在拥有:

    B - C        <-- branch-1
  /
A
 \
 |  D - E        <-- branch-2
 |
 |
  \
    F            <-- work-br

其中提交 A 只有原始二进制文件,BMod1 BinaryCMod1 TextDMod2 Binary,而 EMod2 Text。新提交 F 包含原始二进制文件和文本化版本。

此时你可以再创建两个(或者只是一个,真的)分支,然后 git cherry-pickC 提交到两个新分支之一,切换到另一个分支,git chery-pickE 提交到另一个,并得到这个图形片段:

    B - C        <-- branch-1
  /
A
 \
 |  D - E        <-- branch-2
 |
 |      C'       <-- work-branch-1
  \   /
    F
      \
        E'       <-- work-branch-2

现在您可以合并文本文件(如果需要,忽略甚至删除二进制文件)以获得合并结果,然后您可以将其导入回您想要的任何原始分支,或者甚至直接从这里使用新的一组分支。

之后

$git replace --graft hash([Mod 1 Text]) hash([Original text])
$git replace --graft hash([Mod 2 Text]) hash([Original text])

git 将合并 [Mod 1 Text] [Mod 2 Text],就好像 [Original text] 是它们的共同父级一样。如果您愿意,可以稍后使用 git replace -d hash([Mod 1 Text]) hash([Mod 2 Text]) 删除替换。

详情见https://git-scm.com/docs/git-replace