假设我有2个并行的长寿分支:master
和experimental
。我在experimental
的主题分支中做了一些工作,我为一些功能(feature1
,feature2
,feature3
)执行此操作。我如何将feature2
中完成的工作移植到master
?
我的初始存储库:
master
|
A-B-C
\
D-E I L P
\ / \ / \ /|
F-G-H \ / \ / |
| J-K \ / experimental
feature1 | M-N-O
feature2 |
feature3
我想要的存储库:
master
|
A-B-C-----------------------------J'-K'
\
D-E I L P
\ / \ / \ /|
F-G-H \ / \ / |
| J-K \ / experimental
feature1 | M-N-O
feature2 |
feature3
我能想到的一种方法是git checkout master; git cherry-pick J K
,但这很容易出错,主题分支可能有很多不同的提交。
我希望它的工作方式类似于git checkout master; git <transplant-commits-in-topic-branch-onto-current-branch> feature2
,但我熟悉的所有重定位命令都移植了共同祖先的所有差异(在本例中为A
),我想只移植I
和K
之间的差异,而不是混乱提交哈希。
一些上下文:我正在研究一个原始代码的代码库,但是我想提供某些功能。我开发了主题分支中的所有新功能,然后将其合并回主人。
答案 0 :(得分:5)
如果您只是想将feature2
移到master
上,并且'我'和'K'不依赖于feature1
中所做的更改,您可以将其移植到:
git rebase --onto master feature1 feature2
该语法松散地读作“Rebase feature2
到master
。它的原始上游是feature1
。”
然后,如果您将feature2
合并到master
,那么它将是一个快进合并。
但是,如果feature2
取决于feature1
中不会出现master
的变化,则整个情况会变得复杂得多,而您想要做的事情完全取决于您的工作流程以及您与父项目的关联方式。采摘樱桃会有效......只要你愿意让你的功能分支的后期合并与原始主人的复杂化。或者你可以改变你所有的分支,以便feature2
完全适用于master
,或者......大约适用于其他十几种方法。这实际上取决于您对这些分支机构的长期计划。一般情况下,如果您可以提供帮助,请将feature2
(以及feature3
等)关闭master
。它可以为您节省很多麻烦。