将 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中。
是这样吗?我该如何正确操作?
如果我们分解您的问题,您需要:
- Split 4 (E,F,G,H) 从 Foo 提交到 2 个分支,Foo 将只有:E,G,但 Bar 将拥有所有 4 个,E -> G -> F -> H。
- 删除一些提交:即在 Foo 上,删除提交 F 和 H。
- 我不确定你是否想 "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 特别有帮助
我有一个带有多个更改的简单分支:
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中。
是这样吗?我该如何正确操作?
如果我们分解您的问题,您需要:
- Split 4 (E,F,G,H) 从 Foo 提交到 2 个分支,Foo 将只有:E,G,但 Bar 将拥有所有 4 个,E -> G -> F -> H。
- 删除一些提交:即在 Foo 上,删除提交 F 和 H。
- 我不确定你是否想 "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 特别有帮助