在Git中将一个功能分成一个新的分支

时间:2011-06-12 09:56:54

标签: git version-control branch

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

我确信这有一个微不足道的答案,但我想不出应该怎么做:)

3 个答案:

答案 0 :(得分:4)

如果你可以修改master(即没有其他人有你要移动到分支的更改),我会使用git rebase -i重新安排master中的提交,这样所有应该在分支中的提交都是毕竟应该留在主人的承诺。之后,创建分支并重置master,以便它不包含任何分支提交。

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

M1---B1---M2---B2---M3

将它们变成

M1---M2---M3---B1---B2

创建新分支,并将git reset --hard主文件创建为M3

如果你不能修改master,请在master上创建你的分支,git revert你不想要的更改,然后git merge -s ours master。这有效地告诉分支您知道恢复并且您不希望它在那里。

之后,如果将master合并到分支中,master中的更改将正确合并,但revert不会。更重要的是,如果您确定分支已完成并且您想要合并回主数据库,它也可以正常工作 - 合并所有来自分支的更改,包括已还原的更改。

答案 1 :(得分:1)

你可以通过挑选你想要的提交进入它自己的分支来做到这一点。

在第一次提交私有之前,首先从提交分支出来:

git checkout -b feature1 sha1^ # sha1 is the hash of the first private commit

现在挑选每次提交

git cherry-pick hash1 hash2 etc

现在删除主人

中的相同内容
git checkout master
git rebase -i sha1^ # as in the first checkout

现在删除你挑选的提交。

希望这有帮助

答案 2 :(得分:1)

Checkout master,编辑工作目录以删除(或隐藏?)该功能,然后提交。

为“新”功能开发创建一个分支(我将其称为“dev”,但您应该将其命名为有意义的东西)。然后在dev上,恢复(不重置!)之前的提交,撤消你刚才所做的“删除”(或隐藏)工作。将恢复提交到开发分支。

第3步,获利。你现在是一个没有这个功能的主分支,以及一个带有它的主题分支。