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

Merging part of git branch into master

我有一个带有多个更改的简单分支:

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个分开,和master同步,作为不​​同的分支推送,这样CTO可以稍后将它们合并到Master中。

是这样吗?我该如何正确操作?

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

  1. Split 4 (E,F,G,H) 从 Foo 提交到 2 个分支,Foo 将只有:E,G,但 Bar 将拥有所有 4 个,E -> G -> F -> H。
  2. 删除一些提交:即在 Foo 上,删除提交 F 和 H。
  3. 我不确定你是否想 "Re-order" 在分支 Bar 上提交,即有 E、G、F、H --> 我假设这没有解决任何问题,所以我将保留它在我的回答之外。

有很多方法可以做到这一点,但我会保持我能想到的最简单的流程,因为你是 git 的新手。 所以,让我们看看拆分分支:

从您当前的 Foo (head = H) 执行 git checkout -b Bar 这将创建带有提交 E、F、G、H 的分支 Bar

现在,您可以通过两种方式重置 Foo 分支:
#1 丢弃 Foo 并重新创建它 git branch -D Foo(从本地删除) git push origin :Foo(从远程删除,如果你已经推送了它)

然后你需要从你的主人的提交 "C" 中创建一个新的 Foo:

git checkout -b Foo <CommitIdShaForC>

然后你可以从 git gui 中选择提交 E 和 G,方法是执行 gitk Bar 然后右键单击提交并选择 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' 正在撤消提交 F 添加的内容
  • git revert H 将导致:E -> F -> G -> H -> F' -> H' 其在源代码中的最终结果将是:与仅提交 E 和 G 相同。

或者,您可以在 git 恢复上使用 --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 其中 I 是撤消 F 和 H

的提交

#更新 1 写了一个冗长的答案后,我看到 OP 希望将 "part of the commits" 分成几个分支。对于这种情况,我强烈建议使用交互式变基,以便可以拆分提交。请参考官方documentation about git rebase, in particular the section about "Splitting Commits". Also, I think you will find this question 特别有帮助