2016-03-07 28 views
0
不同的共同祖先

我想在Git的合并两个不同的分支这样的:Git是如何来插入合并

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

的问题是,我使用只能处理文本文件,这样的合并工具二进制文件不能用作共同的祖先。我想要从一个转换工具蚂蚁那么原来的二进制文件的文本文件中有这样的结构,使我可以合并:

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

我怎样才能做到这一点?

+1

在你的上图中没有'Original Text',那么它如何神奇地插入底部图? – torek

+0

我会签出'[Original Binary]'提交,通过一个转换工具运行它,然后提交一个新的分支。我将编辑问题 – fdsa

回答

0

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

混帐将合并双方[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了解详情。

+0

完成手动合并,但这是我寻找的东西。 – fdsa

0

听起来像你应该做的就是你所说的:“在一个新的分支上承诺”。在基于壳会话你的任务可能是这样的:

​​

(这里<commit-id>是提交包含OriginalBinary的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 Binary,CMod1 TextDMod2 BinaryEMod2 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 

现在,您可以合并文本文件(忽略甚至删除二进制文件,如果需要的话),以获得合并结果,然后你就可以导入回任何你想要的原分公司,甚至只是直接从这组新分支中使用。

+0

我曾尝试类似这种方法。问题是,例如,当我尝试将'C'选择为'C''时,这会失败,因为共同的祖先是'A',它是一个二进制文件。这就是为什么我试图建立一个除A和C之外的共同祖先,因为A是一个二进制文件。 – fdsa

+0

正如我所说,*忽略**甚至删除**二进制文件,如果需要的话*:关于在第二组侧分支上做这件事的好处是,你可以放弃任何阻碍。不管你喜欢什么,解决二进制文件之间的冲突,因为你不会使用它们。(实际上,您可能只需从路径中的每个提交中完全删除二进制文件,即从'F','C''和'E'':请注意'cherry-pick -n'为您提供了一个在提交cherry-pick结果之前有机会修改提交。) – torek

+0

我想我没有解释得很清楚:二进制文件已转换为文本文件,但常见的是二进制文件。我仍然需要合并来自普通二进制文件的文本文件。 – fdsa