如何将所有提交从一个分支合并到另一个分支?

时间:2017-10-01 17:18:19

标签: git github git-branch git-merge branching-and-merging

我想将分支A合并到主人,但当我使用" git merge A"在master上它将合并分支,但只记录master上的一个提交,就像我在分支A上提交20一样。我想将所有提交从A合并到master。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您已将此标记交叉标记为,并且这两种情况的答案不同。

GitHub提供了一个标有“Merge pull request”的单个按钮,带有一个下拉三角形。单击三角形提供了更多选项(至少通常情况下,the GitHub help page表示“为您的存储库启用的合并选项依赖[s]”:)

  • 创建合并提交
  • 壁球并合并
  • 重新基础和合并

Git命令行不同,同时更简单,更复杂。您可以运行以下任何命令:

  • git merge获取与情境有关的默认操作;
  • git merge --ff-only以阻止合并,但允许快进行动;
  • git merge --squash强制进行压缩操作,而不创建合并;
  • git merge --no-ff强制合并行动;或
  • git rebase后跟git merge --ff-only复制提交,以便可以进行快速转发 - 这是默认的rebase操作 - 然后执行快进操作。

根据最终结果,三个GitHub操作中的第一个“创建合并提交”等同于命令行git merge --no-ff(区别在于GitHub根本不提供此选项如果存在合并冲突,但see this page也是如此。三个GitHub操作中的第二个等同于命令行git merge --squash,并且是您在问题中描述的内容:

  

...只会在master上记录一次提交,就像我在分支A上提交20一样

请注意,新提交与其他N提交具有相同的效果,但是是普通的,非合并的单父提交(这在GitHub接口中很难看到,因为它试图隐藏Git提交图的非线性特性)。见this GitHub help page squash diagram。 (请注意,该页面上的普通合并图表相当差,但是壁球是合适的。)在命令行上使用--no-ff进行的实际合并具有两个父项:第一个父级是您执行合并的分支上的上一次提交(即master),第二个父级是已合并的分支的提示提交(示例中的分支A )。这意味着所有N个单独的提交保持独立:只添加了一个新提交,表示组合这些单独提交的结果。

在许多方面,这是最好的结果:它允许您将功能添加视为单个单元(合并提交),或作为一系列更改(侧分支上的N个单独提交)。但它确实会产生一个更纠结的历史:如果合并的事实预计将来会无用或分散注意力,而N个单独的提交预计会有用(例如,用于调试),它可能是最好使用快进操作。

正如我上面提到的,快进不是合并。但是,只有当要合并的所有“新”提交都“超过”所有当前提交时,才能进行快进。据我所知,可视化是否是这种情况,GitHub上不可能 1

如果快进,则默认情况下命令行命令git merge将执行此操作。如果可能,git merge --ff-only将成功。因此,如果你想尝试快进,但是创建一个实际的合并提交,如果可能,你可以简单地使用git merge --ff-only并观察它是否成功还是失败。

如果快进当前,您可以使用git rebase使其成为可能,之后您可以使用git merge(可选{{1}无论是作为安全检查,还是覆盖使用--ff-only设置的任何配置。重新定位有点复杂,至少在它出错时,所以其他人说你应该首先阅读它。

1 或者至少,太难打扰了。如果有一个显示实际提交图的clicky按钮,那可能会很有趣。

答案 1 :(得分:0)

听起来像变身为主人就是你正在寻找的。

尝试:

git checkout A
git rebase master

我建议你在这里阅读合并和重新定位之间的区别https://www.atlassian.com/git/tutorials/merging-vs-rebasing