在Git中将特性分离为新分支

在Git中将特性分离为新分支,git,version-control,branch,Git,Version Control,Branch,下面是一个场景:我为一个代码库创建了一个新的存储库,并做了一些提交,但我决定该代码库的某些部分应该在它自己的分支中,而不是在master上。如何将该代码分离到另一个分支中,以便master“不知道”它?显然,我不能只创建分支,然后从master中删除代码,因为从master到新分支的任何后续合并也会删除分支中的代码 我相信这有一个简单的答案,但我想不出应该怎么做:)如果您可以重新设置master的基础(即,没有其他人拥有您想要移动到分支的更改),我将使用git rebase-I在master中重

下面是一个场景:我为一个代码库创建了一个新的存储库,并做了一些提交,但我决定该代码库的某些部分应该在它自己的分支中,而不是在master上。如何将该代码分离到另一个分支中,以便master“不知道”它?显然,我不能只创建分支,然后从master中删除代码,因为从master到新分支的任何后续合并也会删除分支中的代码

我相信这有一个简单的答案,但我想不出应该怎么做:)

如果您可以重新设置master的基础(即,没有其他人拥有您想要移动到分支的更改),我将使用
git rebase-I
在master中重新安排提交,因此,应该在分支中的所有提交毕竟都是应该留在master中的提交。之后,创建分支并重置主机,使其不包含任何分支提交

例如,如果您有提交(其中
B
表示要移动的提交,而
M
表示应该保留的提交):

将其重定为

M1---M2---M3---B1---B2
创建新分支并将git重置--hardmaster设置为
M3

如果无法重新设置master的基础,请创建分支,
git revert
对master进行不需要的更改,然后执行
git merge-s-ours-master
。这有效地告诉分支您知道恢复,但不希望它出现


在此之后,如果您将master合并到分支中,则可以正确合并master中的更改,但无法恢复。更重要的是,如果您随后决定分支已完成,并且希望合并回主分支,那么它也会正常工作–来自分支的所有更改都会合并,包括那些已还原的更改。

您可以通过在自己的分支中选择所需的提交来完成此操作

在第一次提交之前的第一次提交分支您希望私有:

git checkout -b feature1 sha1^ # sha1 is the hash of the first private commit
现在,选择每个提交

git cherry-pick hash1 hash2 etc
现在移除master中相同的

git checkout master
git rebase -i sha1^ # as in the first checkout
现在删除您选择的提交


希望这有助于签出主机,并编辑工作目录以删除(或隐藏)该功能,然后提交

为“新”特性开发做一个分支(我称之为“dev”,但你应该给它起个有意义的名字)。然后在dev上,恢复(而不是重置!)上一次提交,撤消刚才所做的“删除”(或隐藏)工作。将该恢复提交到dev分支中


第三步,利润。现在,您可以看到一个没有该功能的主分支和一个有该功能的主题分支。

我假设您不能或不想重新设置主分支的基础?对不起,我应该更清楚:我要分离的功能是初始提交的一部分,因此,它不能被隔离为一组提交。然后,您应该首先使用rebase-i将其拆分为第二个提交,然后执行StepPerfect,谢谢!我忘了提到“更改”实际上是初始提交的一部分,因此重定基址不是一个选项,但我使用了第二种方法,即简单地删除master中的相关位,提交,然后与
-s ours
合并到功能分支中,正如您所建议的:)
git checkout master
git rebase -i sha1^ # as in the first checkout