我需要"合并";(不是通常意义上的git(两个存储库。在这样做的同时,我需要";链接";(谢天谢地,只有少数(一起提交,以便它们留在最终存储库中(使用相同的哈希(。图形时间:
现在的状态:
project A has fileA, and commits:
a1 -> a2 -> a3
project B has fileB, and commits:
b1 -> b2 -> b3
我需要:
projectAB with files A/fileA and B/fileB (so in subdirectories)
commits:
a1 -----> a2 -----> a3
| | |
|-> ab1 ->|-> ab2 ->|-> ab3 -> (development continues here)
| | |
b1 -----> b2 -----> b3
我该怎么做?我知道提交可以有3个(或更多(父级,我也知道git subtree
。
重要的一点是,最终存储库需要包含项目A的状态(例如,提交a1、a2、a3,只有文件A(和项目B的状态(如提交b1、b2、b3(,其哈希值与现在相同(以避免混淆对这些提交的引用(。此外,我需要";状态";正如ab1、ab2、ab3,而不仅仅是ab3。
有比以下更好的方法吗:
- 在一个存储库中有两个独立的分支(a1…和b1…(
- 手动签出a1,将文件A移动到A/fileA,提交a1x
- 手动签出b1,将文件B移动到B/文件B,提交b1x
- 将b1x和a1x合并到ab1
- 手动签出a2,将文件A移动到A/fileA,提交a2x
- 手动签出b2,将文件B移动到B/文件B,提交b2x
- 将ab1、b2x和a2x合并为ab2
- 。。等等
我认为您可以将其作为一系列三向合并来处理。
首先,创建分支dev.ab
,在其中构建ab系列提交,并使用a1和b1:的合并对其进行初始化
git checkout a1
git checkout -b dev.ab
git merge --allow-unrelated-histories b1
现在,dev.ab
应该指向您想要的ab1
状态,除非它没有指定的A/
和B/
目录中的文件。这可能需要一些git mv
操作。
然后,进行三种方式的合并以引入下一个提交:
git merge a2 b2
解决您在这里遇到的任何冲突,并根据需要移动文件,以构建ab2
。
然后迭代:
git merge a3 b3
你现在应该有你想要的状态,有父母关系,a和b按照你的意愿提交。