我的团队一直在主人的原型分公司工作。我现在想把这项工作分成不同的"功能分支",然后将它们分别合并到master中。我看到了几种方法,我不喜欢这两种方式:
1 - 从主创建一个新分支Feature_1。手动将Prototype中的代码复制到Feature_1。这意味着当我去创作Feature_N并且我失去历史时,我必须记录我已经复制的内容。
2 - 从原型创建一个新分支Feature_1。以某种方式还原不属于Feature_1中第一个功能的代码。这避免说谎git(并保留历史记录),但感觉Feature_N将是一个混乱的合并,因为我会告诉主人,当我推动Feature_1时,更改被还原。
我错过了一个更好的方法吗?
答案 0 :(得分:5)
如果功能更改有时只是组合到提交中并且没有跨功能依赖项,为了让生活更轻松,我的第一次尝试将是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
来创建提交C1
在C12
的地方,然后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_2
和master
,并在相关功能分支中选择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。