Git加入两个不同的线程

时间:2014-09-09 01:50:33

标签: git git-merge git-rebase

我们的回购邮件是从SVN移植的。由于SVN上的一些非标准操作,git-svn生成了不同的线程,如下所示

 C0 <- C1 <- C2 ...
       C1' <- C2' ...

C0和C1&#39;是所有&#34;初始提交&#34;,这意味着所有更改都是&#34;添加文件&#34;。

现在我要做的是,加入C1&#39;到C0以确保它们共享相同的根

C0 <- C1 <- C2 ...
    |<- C1'' <- C2' ...
C1'

这里有C1&#39;&#39;是一个提交,它是C0和C1&#39;的合并,但最终状态相当于C1&#39;。那么后来的链节点可以保持不变。

git命令的组合是否可以执行此操作?

2 个答案:

答案 0 :(得分:2)

请参阅git replace的帮助页面并尝试以下命令

git replace --graft C1&#39; C0

对于早于2.1的Git版本,请使用

NEW_SHA=$(echo "Replacement commit" | git commit-tree -p CO C1'^{tree} -F -)
git replace C1' $NEW_SHA

答案 1 :(得分:1)

字面上的答案是否定的:问题是提交是其所有内容的校验和,包括其父ID,所以如果你有一个C2'指向C1',并且您制作了新副本C1'',您必须制作新副本C2''以指向C1'',依此类推。

也就是说,执行这项工作的明显命令是git filter-branch:您可以使用提交过滤器将C1'复制到以C0作为父项的新提交,然后让更改波动整个提交图的其余部分。但是,如果您要这样做,重做导入可能更有意义。 (我不是SVN进口的专家。我之前做了一些CVS-to-git导入,我做了一些测试导入,然后用更好的选项重新编写它们等等。它非常慢,但是这只是计算机时间,而我做了其他事情。)