将git分支的一部分合并到主

时间:2016-05-23 09:36:40

标签: git merge repository branch

我有一个简单的分支,其中包含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中。

那是这样做的吗?我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

如果我们分解您的问题,您需要:

  1. 分裂4(E,F,G,H)从Foo提交到2个分支,Foo将只有:E,G,但Bar将拥有全部4,E - > G - > F - >小时。
  2. 删除一些提交:即在Foo上,删除提交F和H.
  3. 我不确定你是否想要"重新订购"分支栏上的提交,即具有E,G,F,H - >我假设这没有任何目的,所以我会把它从我的答案中删除。
  4. 有很多方法可以做到这一点,但我会将它保持在我能想到的最简单的流程中,因为你是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特别有用