将git分支分成多个分支以合并为master

时间:2014-10-30 15:38:54

标签: git branch branching-and-merging

我的团队一直在主人的原型分公司工作。我现在想把这项工作分成不同的"功能分支",然后将它们分别合并到master中。我看到了几种方法,我不喜欢这两种方式:

1 - 从创建一个新分支Feature_1。手动将Prototype中的代码复制到Feature_1。这意味着当我去创作Feature_N并且我失去历史时,我必须记录我已经复制的内容。

2 - 从原型创建一个新分支Feature_1。以某种方式还原不属于Feature_1中第一个功能的代码。这避免说谎git(并保留历史记录),但感觉Feature_N将是一个混乱的合并,因为我会告诉主人,当我推动Feature_1时,更改被还原。

我错过了一个更好的方法吗?

2 个答案:

答案 0 :(得分:5)

如果您的提交是单一功能提交,而不与任何其他功能的提交共享依赖关系,那么@ Michael的答案就是好东西。但是,如果您在任何提交中混合了两个功能,那么您需要interactive rebase。它允许您任意重新分配变更优势和提交边界,并且它确实跟踪哪些尚未提交给当前分支。

如果功能更改有时只是组合到提交中并且没有跨功能依赖项,为了让生活更轻松,我的第一次尝试将是git rebase -i master prototype,将具有混合功能的提交分成两个提交,一个用于每一个,然后像迈克尔的回答一样完成樱桃选秀。给定

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

(在这里使用每个提交的哈希而不是其说明性标记)。

Rebase将在提交C12后停止,您可以git reset HEAD~然后git add --patch应用所有功能1帅哥git commit --amend来创建提交C1C12的地方,然后git add -A; git commit`` to apply all the remaining hunks and create commit C2`跟随它。你最终会得到

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

然后您可以git checkout -b feature1 master; git cherry-pick A1 B1 C1 E1 F1,类似于feature2。

在更复杂的情况下,此方法仍然只能进行非常小的更改。互动式篮板比上面的东西要好得多让你相信,但到目前为止,找到这个的最好方法就是坐在the manpage的同时进入那里并争抢一些好玩的东西。这样做,它可能很快就会达到这样的程度,即作为一个预发布仪式这样做通常比试图让你的实际工作流程在每一个小步骤都可以发布更方便。

答案 1 :(得分:3)

feature_1创建两个分支feature_2master,并在相关功能分支中选择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