"Merge" git 存储库,"linking"提交



我需要"合并";(不是通常意义上的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。

有比以下更好的方法吗:

  1. 在一个存储库中有两个独立的分支(a1…和b1…(
  2. 手动签出a1,将文件A移动到A/fileA,提交a1x
  3. 手动签出b1,将文件B移动到B/文件B,提交b1x
  4. 将b1x和a1x合并到ab1
  5. 手动签出a2,将文件A移动到A/fileA,提交a2x
  6. 手动签出b2,将文件B移动到B/文件B,提交b2x
  7. 将ab1、b2x和a2x合并为ab2
  8. 。。等等

我认为您可以将其作为一系列三向合并来处理。

首先,创建分支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按照你的意愿提交。

最新更新