我有两个具有不同历史记录的 Git 存储库。经过大量研究和大量修改,我最终得到了如下所示的历史(使用
YYYY-DD
作为伪提交哈希):
HEAD---2016-09---2016-08---2016-07---2016-06
\-----2015-10---2015-09
请注意,这段历史似乎有两个“根”,因为
2015-10
序列被合并/嫁接到中间。重要的是,2016-07
历史记录和2015-10
历史记录中的文件包含完全不同的文件,没有任何共同点。
我想将这一历史记录合并到一个完整的提交行中,按照从最旧到最新的原始提交顺序,没有跳过(即稍后重新出现的消失内容)。换句话说,这就是我想要的结果与:
HEAD---2016-09---(2016-08)---2016-07---2016-06---2015-10---2015-09
我将
(2016-08)
放在括号中,因为作为合并提交,如果一切顺利,我什至认为我不需要它。
起初我想做一个
git replace --edit 2016-08
来删除它的 2015-10
父级,然后做一个 git replace --edit 2016-06
将 2015-10
作为它的父级(参见 https://stackoverflow.com/a/37001417/421049 ),果然,在做了 git filter-branch --tag-name-filter cat -- --all
之后,我得到了一个看起来像我想要的序列。
但后来我开始思考:因为两个“尾巴”中的内容完全不同,
2015-10
中的内容会不会在2016-06
中“消失”,然后在2016-08
中“回来”? (我承认我现在无法立即验证它是否确实如此;我删除了该尝试,而且今晚我太累了,无法再做一次。)我怎样才能有效地“合并”(在日常意义上)两条尾巴,就像将 2016-06
中的内容添加到 2015-10
中的内容一样?也就是说,任何替换 2016-06
的提交都将拥有 2015-10
中的所有内容以及 原始 2016-06
中的内容?但是我希望新的 2016-06
具有其原始提交日期、日志消息等。
然后,完成后,如何从历史记录中删除“合并”提交
2016-08
,因为不再需要它了?我假设我可以使用 https://stackoverflow.com/a/3705310/421049中的
git rebase --onto 2016-08~ 2016-08 HEAD
。我在最初的尝试中尝试过,但没有成功 --- 我认为这与 2016-07
和
2016-06
中“消失”的内容有关,因为我只是以不同的顺序重新缝合了尾巴,但我不确定。
git checkout -b middle 2016-07
git rebase 2015-10
这会在 2015-10 的基础上重播您 2016-07 和 2016-06 的提交。
git checkout master
假设你的主人指向2016-09或后代
git rebase middle
在我们刚刚创建的新中间重播 2016-09(或更多,取决于您的大师)。此变基还将丢弃合并提交。如果,正如您所说,“2016-07 历史记录和 2015-10 历史记录中的文件包含完全不同的文件,没有任何共同点”,这应该会给您一个没有冲突的良好历史记录。