你可能想看看 git 移植。此处提供了一些信息:http://git-scm.com/docs/git-filter-branch
基本上,你想做的就是伪造祖先。
您在两台机器上都进行了初始提交——我们称它们为“baseA”和“baseB”。然后,您在两侧创建了第二次提交——“secondA”和“secondB”。你想要做的是告诉 git 'secondB' 没有 'baseB' 作为祖先,而是有 'baseA' 作为父级。
您可以通过使用移植物来做到这一点。例如,把它放在你的 .git/info/grafts 文件中:
secondB baseA
(但随后使用真正的 SHA)。现在,如果你查看 GitX,你会看到历史是相互关联的。要使更改永久生效,您需要运行 git filter-branch。
从 cmets 更新
我不确定您所做的是否“正确”,尽管它会起作用。如果你做什么
你做了,你会得到历史:
BaseA --- SecondA -- .. - .. - Merge
\ BaseB --- SecondB ... - .. /
哪个会起作用(并且合并将成功而不会出现问题)。然而,什么
这个更好一点:
BaseA --- SecondA -- .. - .. - Merge
\ SecondB ... - .. /
它基本上将“BaseA”作为提交并将“BaseA”设置为父级
第二B。使用我告诉你的嫁接规则应该可以做到这一点。
为了证明这一点,我创建了一个小型存储库,您可以下载here。
如果你查看 GitX 中的历史(“gitx master second_master”),你会
看到历史是断开的。如果你将 .git/info/_grafts 文件移动到 .git/info/grafts,你会得到第二个,好看的历史记录。
我还添加了一个 .git/info/wrong_grafts 文件。如果您使用那个,您将获得您创建的历史记录。
如果你查看 grafts 文件中的 SHA,你会发现 _grafts 文件基本上有这个:
SecondB BaseA
而 wrong_grafts 文件有这个:
BaseB BaseA