将Git分支拆分成多个分支以合并到主分支

3
我团队一直在主分支的原型分支上进行开发。现在,我想将这个工作切割成不同的“特性分支”,并将它们单独合并到主分支中。我看到了几种方法,但都不太理想:
1- 从主分支创建一个新的Feature_1分支。手动将原型中的代码复制到Feature_1中。这意味着当我制作Feature_N时必须跟踪已复制的内容,而且我会失去历史记录。
2- 从原型创建一个新的Feature_1分支。以某种方式还原不属于第一个特性的代码。这避免了对git的错误操作(并保留了历史记录),但感觉合并Feature_N会变得混乱,因为我会告诉master在推送Feature_1时将更改还原。
我是否错过了更好的方法?
2个回答

7
如果你的提交只包含单一功能且与其它功能的提交不存在依赖关系,那么@Michael的答案就是正确的。但如果在任何提交中混合了两个功能的工作,你需要使用交互式变基来重新分配更改和提交边界,并且它确实会跟踪哪些更改尚未提交到当前分支。
如果功能更改有时被组合到提交中而且不存在跨功能的依赖关系,为了简化操作,我的第一次尝试将是git rebase -i master prototype,将混合的更改拆分成两个提交,一个用于每个功能,然后再按照Michael的答案进行选择。
A1-B2-C12-D2-E1-F12    prototype

这里的数字表示提交包含代码的哪个功能,对于 `git rebase -i master prototype`,你需要编辑提交 C12 和 F12。

pick A1
pick B2
edit C12
pick D2
pick E1
edit F12

使用每个提交的哈希值代替它的示例标签。

重新基于将在提交C12之后停止,您可以运行git reset HEAD~,然后运行git add --patch 来应用所有feature-1 hunks,git commit来创建提交C1,该提交位于C12之前,接着运行git commit -a以应用所有剩余的hunks并创建紧随其后的提交C2。最终结果如下:

A1-B1-C1-C2-D2-E1-F1-F2

然后你可以执行 git checkout -b feature1 master; git cherry-pick A1 B1 C1 E1 F1,feature2 同理。

在更复杂的情况下,只需要进行微小的更改就可以使用交互式变基方法。交互式变基比上面所述的方法要好得多,但最好的方法是坐下来阅读手册,同时对一些 hunks 进行调整。这样做可能很快就会达到一个点:将其作为预发布仪式通常比尝试在每个小步骤中保持实际工作流程更加方便。


如果你执行 git reset HEAD~,那么之后需要执行普通的 git commit(不带 --amend)来创建一个新的提交 C1。否则,git commit --amend 会编辑(修订)前一个提交(在本例中为 B2),你最终会得到 ...-B12-C2-...。另外,你可以使用 git reset HEAD~ /path/to/file 来重置单个文件,这将保留提交的其余部分,因此你可以使用 git commit --amend 进行修改。 - iliis
1
@iliis,你说得对,应该使用git read-tree @~而不是git reset @~,或者使用普通的git commit而不是git commit --amend。感谢你指出这个问题,已经修复。 - jthill

3
master分支上创建两个分支feature_1feature_2,并在相应的特性分支中挑选prototype的提交记录:
git checkout -b feature_1 master
git cherry-pick <commit>
git cherry-pick <commit>
…

git checkout -b feature_2 master
git cherry feature_1 prototype | grep "^+" | cut -c3- | xargs git cherry-pick

最后一行从prototype中挑选所有不在feature_1中的提交到当前分支,即feature_2

当遇到冲突时,请使用git status查看如何继续操作。

有关详细信息,请参阅git-cherry-pick文档。


我们在这里讨论时想到了“cherry-pick”,我会尝试一下。 - JoeB
如果还没有提交任何更改,有没有办法做到这一点? - Michael
创建一个新分支,使用 git add --patch 命令添加你想要在这个分支中的更改(对于新文件使用 git add),提交更改,将剩余的更改存储起来,基于主分支检出一个新的分支(git checkout -b feature_2 master),添加并提交你的更改。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接