我有一个简单的分支,其中包含multiplpe更改:
Master ---A---B---C
\
Foo E---F---G---H
现在我只需要将一部分变更合并到Master中。我是git的新手(目前在Windows上使用SourceCode),并且正在考虑这样做:
Master ---A---B---C---?---J---?---?---
\ /
Foo E---G'
\
Bar F'---H'---
我只需要分支机构的某些部分。我一直在研究4种不同的制造商API来实现。现在,只有1个需要投入生产,其余的都处于暂停状态。让我们说总共修改了19个文件,但我只需要其中的7个。现在,我需要将这7个分开,与主机同步并作为不同的分支推送,以便CTO可以在以后将它们合并到Master中。
那是这样做的吗?我该如何正确地做到这一点?
答案 0 :(得分:1)
如果我们分解您的问题,您需要:
有很多方法可以做到这一点,但我会将它保持在我能想到的最简单的流程中,因为你是git的新手。 那么,让我们看一下拆分分支:
从你当前的Foo(head = H)做git checkout -b Bar
这将创建一个提交E,F,G,H的分支栏
现在,有两种方法可以重置你的Foo分支:
#1弃掉Foo并重新创建
git branch -D Foo
(从本地删除)
git push origin :Foo
(要从远程删除,如果你已经推过它)
然后你需要从提交创建一个新的Foo" C"你的主人:
git checkout -b Foo <CommitIdShaForC>
然后你可以通过执行gitk Bar
从git gui选择提交E和G,然后右键单击提交并选择cherry-pick,或者从控制台执行:
git cherry-pick <Commit Id for E> <Commit Id for G>
如果出现合并问题,请查看此answer
#2从Foo恢复提交 如果你不介意在你的foo中有F和H的历史,你可以简单地用git恢复它们,本质上git创建你的提交F和H的反向补丁并将它们作为新的提交应用:
Foo
,并且E -> F -> G -> H
git revert F
E -> F -> G -> H -> F'
其中F&#39;正在撤消提交F添加的内容git revert H
将导致:E -> F -> G -> H -> F' -> H'
,其源代码的最终结果为:与仅提交E和G相同。或者,您可以在git revert上使用--no-commit标志在1次提交中恢复F和H:
git revert --no-commit F
git revert --no-commit H
git commit -a -m "reverting commits F and H"
这将导致:
E -> F -> G -> H -> I
其中我是撤销F和H的提交
#Update 1 在写了一个冗长的答案之后,我看到OP想要提交&#34;部分提交&#34;分成几个分支。对于这种情况,我强烈建议使用交互式rebase,以便可以拆分提交。请参阅官方documentation关于git rebase,特别是关于&#34; Splitting Commits&#34;的部分。此外,我认为您会发现此question特别有用