在 Git 中混合基于合并的两个历史尾部

问题描述 投票:0回答:1

我有两个具有不同历史记录的 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 merge rebase git-rewrite-history
1个回答
2
投票
在一个简化的例子中,我能够

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 历史记录中的文件包含完全不同的文件,没有任何共同点”,这应该会给您一个没有冲突的良好历史记录。

© www.soinside.com 2019 - 2024. All rights reserved.