在Git中合并一个重新分支的影响

时间:2014-08-25 23:08:22

标签: git git-merge git-rebase

背景

我想从我的Git仓库中主动创建一个子项目。

目前,我有类似的东西......

A-B-C (origin/master)

我现在看到这个代码库的一个子集对其他类似的项目很有用,所以我分叉并删除了一堆东西。

A-B-C-D (sub-project/master)

其中commit D删除了一堆特定于original/master项目的代码。

现在我可以从sub-project/master ...

创建其他项目了
A-B-C-D-OP1 (other-project/master)

而且,如果我有通用更新(我想要应用于所有其他项目的提交),我可以将它们转到sub-project/master,然后将它们拉入我所有的其他项目......

A-B-C-D-E (sub-project/master)

A-B-C-D-OP1-E (other-project/master)

我现在要做的是将这些相同的提交从sub-project/master合并回origin/master,但我知道这会导致......

A-B-C-D-E (origin/master)

Dorigin/master删除一堆代码,当我真正想要的是......

A-B-C-E (origin/master)

我的问题

如果我重新定位sub-project/master,请删除提交D

A-B-C-E (sub-project/rebase-branch)

我知道我可以将sub-project/rebase-branch合并到original/master中,以便它看起来也像我想要的那样......

A-B-C-E (origin/master)  

但如果我在sub-project ...

上创建其他提交,会发生什么
A-B-C-E-F (sub-project/rebase-branch)

然后将sub-project/rebase-branch合并到other-project/master

other-project/master会导致这个......?

A-B-C-D-OP1-E-F (other-project/master) 

D留在原地?

或者合并会导致这个......?

A-B-C-OP1-E-F (other-project/master)

在添加D时删除F

如果是前者,那么我很高兴。 如果它是后者,那么我是否有一个可行的解决方案来解决我上面提到的困境? (我是否有可能以这样的方式修改sub-project,然后我可以将添加到sub-project的其他提交合并到origin/masterother-project/master中 - 离开{{1在后者中就位,但在前者中不存在?)

2 个答案:

答案 0 :(得分:1)

由于git具有不可变历史图,当您进行rebase时,只需在不同的基础上重新创建相同的提交。因此,如果您有A-B-C-D-E的历史记录,则在EDC的变身后,您将获得A-B-C-E'。如果您合并它 - 它将同时包含历史记录EE'

所以,有可能这样做,但我觉得你正在尝试使用版本控制系统作为依赖管理系统,这不是最好的事情。尝试重新考虑如何使用组件并将它们分成独立的项目。

答案 1 :(得分:0)

听起来你已经找到了一个项目的子集,可以作为一个库生成。您应该使用完全独立的repos维护单独的项目(READ:彼此之间没有设置遥控器)。定期“发布”您的其他项目可以使用的库项目。您可以使用gradle或maven等工具来帮助您管理对库项目的依赖。就个人而言,我认为这比通过合并提交尝试使用git作为依赖管理工具更好。