你可能想看看 git 移植。一些信息可以在这里找到:http://git-scm.com/docs/git-filter-branch 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。
根据评论更新
我不确定你所做的是否“正确”,尽管它会起作用。如果你做什么
你这样做了,你将得到历史:
BaseA --- SecondA -- .. - .. - Merge
\ BaseB --- SecondB ... - .. /
这将起作用(并且合并将成功而不会出现问题)。然而,什么是
更好一点的是:
BaseA --- SecondA -- .. - .. - Merge
\ SecondB ... - .. /
这基本上会删除“BaseA”作为提交并将“BaseA”设置为父级
第二 B.使用我告诉过你的嫁接规则这应该是可能的。
为了演示这一点,我创建了一个小型存储库,您可以下载here http://frim.frim.nl/grafts_example.tar.gz.
如果你查看 GitX 中的历史记录(“gitx master secondary_master”),你会
看到历史是断开的。如果将 .git/info/_grafts 文件移动到 .git/info/grafts,您将获得第二个漂亮的历史记录。
我还添加了一个 .git/info/wrong_grafts 文件。如果您使用它,您将获得您创建的历史记录。
如果您查看移植文件中的 SHA,您会发现 _grafts 文件基本上包含以下内容:
SecondB BaseA
错误的_grafts 文件有这样的内容:
BaseB BaseA