git:将一个分支的源树的一部分合并到另一个分支中,而不管各个提交

时间:2009-11-14 02:20:51

标签: git version-control merge branch

我理解如何在git中合并分支,我喜欢它是多么容易。

我有一个看起来像这样的分支:

project/
|--subproj1/
|  |---(files)
|
|--subproj2/
   |---(files)

一位同事的分支机构对这两个子项目进行了重大修改。更具体地说,他将两者都改为依赖于新子项中的常见代码。但是,出于各种原因,我们不会在可预见的未来随时推动他的分支。

我的分支仅在subproj1中与master分开,我正在进行子项目特定的增强。我的子项目不如其他一些项目重要,因此对我们可以推动哪些类型的更改的限制较少。我想合并我的同事的subproj1更改(以及这些更改所依赖的新subproj3),但仅保留现有的subproj2。在未来的某个时候,当他将他的项目完全合并到master时,我希望他的subproj2更改为正常合并。

如何使用git执行此操作?

1 个答案:

答案 0 :(得分:2)

每次提交都是一个逻辑工作单元。不幸的是,这意味着你不能将你的同事对subproj1和subproj2所做的编辑分开,如果他在同一个分支上进行的那样。

但是,要做你要求的事,你会使用git filter-branch。您可以使用它来创建一个新分支,该分支是通过重放所有同事的提交来定义的,但只是将subproj1的更改添加到每个提交。

命令类似于:

git fetch colleague-repo ...
git filter-branch --subdirectory-filter subproj1 -- A..B

(其中A..B是您从其存储库中提取的提交范围)

通过这样做,您创建了一个独特的分支,其工作与您同事的工作完全分开。如果将此新分支和同事的分支合并为master,则subproj1的更改历史将永久地在两个分支之间分配。