情况是我们有两个存储库,parent
和child
。parent
repo将child
repo作为子树:
parent/
child/
一段时间后,child
存储库与它的上游(parent
项目使用了补丁,但没有贡献给child
的上游)。
从child
子树中提取补丁(并且只提取特定的补丁)以便它可以上行的正确Git命令是什么?
为了说明,让我们命名以下分支:
main
是parent
仓库的主要分支(包括我们不想上游的补丁,但不包括我们想上游的补丁),feature
是我们想要上游的补丁所在的分支;feature
基于main
child-main
是child
上游的主要分支(我们想把我们的补丁发送到那里)
我们要创建child-feature
分支,它严格包含feature
分支中的所有修改,而不包含任何来自main
的内容。
我们可以这样做:
git switch -b child-feature feature
git rebase -i -s subtree --onto child-main main
解释:
git switch feature
:切换到feature
分支-b child-feature
:在feature
分支之上创建child-feature
分支
git rebase
:通过复制当前分支包含的所有提交来移动当前分支-i
:交互式的,不是必需的,但方便理解发生了什么-s subtree
:使用subtree
策略,它知道如何处理子树(对父存储库的所有更改都被删除,并且所有更改都被"移动",因此项目根目录是子树目录)--onto child-main
:将结果放在child-main
分支的顶部main
:只考虑在提交main
指向(忽略以前的补丁)之后所做的更改