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
只有原始二进制文件,B
有 Mod1 Binary
,C
有 Mod1 Text
,D
有 Mod2 Binary
,而 E
有 Mod2 Text
。新提交 F
包含原始二进制文件和文本化版本。
此时你可以再创建两个(或者只是一个,真的)分支,然后 git cherry-pick
将 C
提交到两个新分支之一,切换到另一个分支,git chery-pick
将 E
提交到另一个,并得到这个图形片段:
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])
删除替换。
我正在尝试合并 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
只有原始二进制文件,B
有 Mod1 Binary
,C
有 Mod1 Text
,D
有 Mod2 Binary
,而 E
有 Mod2 Text
。新提交 F
包含原始二进制文件和文本化版本。
此时你可以再创建两个(或者只是一个,真的)分支,然后 git cherry-pick
将 C
提交到两个新分支之一,切换到另一个分支,git chery-pick
将 E
提交到另一个,并得到这个图形片段:
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])
删除替换。