如何将功能(在主题分支中)移植到另一个分支?

lms*_*lms 4 git version-control

假设我有2个平行的长寿分支:masterexperimental.我做了一些工作中的话题岔开的experimental,我这样做的一对夫妇的功能(feature1,feature2,feature3).我怎么会在移植完成的工作feature2master

我的初始存储库:

  master
    |
A-B-C
 \                              
  D-E       I       L           P
     \     / \     / \         /|
      F-G-H   \   /   \       / |
          |    J-K     \     / experimental
      feature1   |      M-N-O
              feature2      |
                         feature3
Run Code Online (Sandbox Code Playgroud)

我想要的存储库:

                                   master
                                     |
A-B-C-----------------------------J'-K'
 \                              
  D-E       I       L           P
     \     / \     / \         /|
      F-G-H   \   /   \       / |
          |    J-K     \     / experimental
      feature1   |      M-N-O
              feature2      |
                         feature3
Run Code Online (Sandbox Code Playgroud)

我可以想到这样做的一种方式是,git checkout master; git cherry-pick J K但这容易出错,主题分支可能有许多不同的提交.

我希望它的工作有点像git checkout master; git <transplant-commits-in-topic-branch-onto-current-branch> feature2,但所有的垫底命令我熟悉移植都来自共同祖先差异列表(在这种情况下A),我想刚刚移植上比较IK,并与提交哈希不乱.

一点上下文:我正在研究一个原始代码的代码库,但是我想回馈一些特性.我开发了主题分支中的所有新功能,然后将其合并回主人.

Chr*_*her 5

如果你只是想移动feature2master,和"我"和"K"不依赖于制造的变化feature1,你可以用它移植:

git rebase --onto master feature1 feature2
Run Code Online (Sandbox Code Playgroud)

这句法读取,松散,为"衍合feature2master.这是原来的上游是feature1".

然后,如果合并feature2master,这将是一个快进合并.

但是,如果feature2依赖于feature1不会发生的变化master,则整个情况会变得复杂得多,您想要做的事情完全取决于您的工作流程以及您与父项目的关系.采摘樱桃会有效......只要你愿意让你的功能分支的后期合并与原始主人的复杂化.或者你可以改变你所有的分支,以便feature2干净地应用master,或者......大约十几种其他方法.这实际上取决于您对这些分支机构的长期计划.一般情况下,如果可以帮助它,请切断feature2(feature3等等)master.它可以为您节省很多麻烦.