git merge和rebase两个存储库

时间:2016-04-15 16:58:31

标签: git github version-control merge rebase

我需要通过将第二个存储库的根目录重新绑定到第一个存储库的头部来合并两个git存储库。
在这样做时,它应该保持:

  • 提交历史记录
  • 所有作者日期+姓名
  • 所有标签
  • unmerged(feature)branches
  • 合并分支机构
  • 这两个存储库具有公共文件(相同的文件名),并且在两个存储库中都更改了内容

我怎样才能做到这一点?

这只需要完成一次,我不需要在合并后保留第二个存储库。

注意:您可以使用链接的存储库来测试您的解决方案。

以下是一个例子:

合并 - 测试 - 第一

我的第一个(示例)存储库看起来像这样(https://github.com/Pro/merge-test-first):

* fcc6649 (HEAD -> master) J1
| * ba0ecb9 (branch_I1) K1
|/  
* 91bf6a4 I1
* acacd68 (tag: tag_H1) H1
|\  
| * 40bf845 (branch_B1) F1
| * 3ea2925 D1
* | 3780004 G1
| | * f7a61eb (branch_D1) E1
| |/  
| * aae948d C1
|/  
* 739d400 B1
* 6717e64 A1

git log --oneline --abbrev-commit --all --graph --decorate --color的输出)

Graph for first repo

它包含一个分支(branch_B1),其基数为B1,然后合并为主H1和两个分支branch_D1branch_I1

合并 - 测试 - 第二

第二个存储库应该合并然后重新绑定到merge-test-first/master/HEAD具有一些类似的结构(https://github.com/Pro/merge-test-second):

*   28e726a (HEAD -> master) I2
|\  
| * 46f9d71 (branch_D2) G2
* | 2ae8b4d H2
| | * 606a346 (branch_E2, tag: tag_F2) F2
| |/  
| * bed8db1 E2
|/  
* e94c6d7 (tag: tag_D2) D2
| * 8a98058 (branch_B2) C2
|/  
* 82cb3ee B2
* 1b12fdf A2

Graph for second repo

最终结果应为:

来自第二个仓库的

A2应该从第一个仓库重新定位到J1,包括所有提交,作者日期和分支以及合并:

*   (HEAD -> master) I2
|\  
| * (branch_D2) G2
* | H2
| | * (branch_E2, tag: tag_F2) F2
| |/  
| * E2
|/  
* (tag: tag_D2) D2
| * (branch_B2) C2
|/  
* B2
* A2    
|   
* J1
| * (branch_I1) K1
|/  
* I1
* (tag: tag_H1) H1
|\  
| * (branch_B1) F1
| * D1
* | G1
| | * (branch_D1) E1
| |/  
| * C1
|/  
* B1
* A1

所以我需要以某种方式添加红色边缘(注意:此图中的标签不可见,但也应该重新标记):

final graph

到目前为止我尝试了什么:

  1. 简单的变形:
    git rebase test-first/master test-second/master
    这不会保留合并和作者日期,也不会保留第二个仓库中的其他分支
  2. 保留作者日期和合并的解决方案:
    http://axiac.ro/blog/2014/11/merging-git-repositories/
    摘要:它使用--preserve-merges然后使用一些git magic(git filter-branch ...)来重写作者日期。
    该解决方案也不会复制第二个回购的所有未合并分支。
  3. How do you merge two Git repositories?
    仅合并单个分支
  4. Setting git parent pointer to a different parent
    Git grafs只会更改父级,但如果两个文件在两个repos中都已更改并且应该合并,则不要考虑差异。

0 个答案:

没有答案