代码之家  ›  专栏  ›  技术社区  ›  Cory Petosky

git:将一个分支的源树的一部分合并到另一个分支中,而不考虑单个提交。

  •  1
  • Cory Petosky  · 技术社区  · 15 年前

    我知道如何在Git中将分支合并在一起,我喜欢它的简单性。

    我有一个像这样的分支:

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

    一个同事有一个对两个子项目都进行了重大更改的分支。更具体地说,他修改了它们,使它们都依赖于新的子项目3中的一个公共代码位。然而,出于各种原因,我们不会在未来的任何时候推动他的分支机构。

    我的分支只与子项目1中的master不同,我在那里进行子项目特定的增强。我的子项目比其他一些项目不那么重要,因此对我们可以推动哪些类型的变更有较少的限制。我想合并我同事的子项目1更改(以及这些更改所依赖的新子项目3),但不要再使用我现有的子项目2。将来的某个时候,当他将整个项目合并为master时,我希望他的子项目2更改能正常合并。

    我该如何处理Git?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Stephen Jennings    15 年前

    每个提交都是一个逻辑工作单元。不幸的是,这意味着如果同事在同一个分支上进行了编辑,则无法将他对Subproj1和Subproj2所做的编辑分开。

    但是,要做你要求的事情,你需要 git filter-branch . 您可以使用它来创建一个新的分支,该分支通过重放同事的所有提交来定义,但只向每个提交添加对子项目1的更改。

    命令的内容如下:

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

    (其中a..b是您从他的存储库中获取的提交范围)

    通过这样做,您将创建一个独特的分支,其工作与同事的工作完全分离。如果将此新分支和同事的分支合并为master,则子项目1的更改历史记录将在两个分支之间永久拆分。