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

How to merge all commits from one branch to another?

我想将分支 A 合并到 master,但是当我在 master 上使用 "git merge A" 时,它会合并分支,但只会在 master 上记录一次提交,而我在分支 A 上提交了 20 次。我想合并从 A 到 master 的所有提交。我该怎么做?

听起来像变基到 master 是你要找的。

尝试:

git checkout A
git rebase master

我建议你在这里阅读合并和变基的区别https://www.atlassian.com/git/tutorials/merging-vs-rebasing

您已将其交叉标记为 and ,这两种不同情况的答案是不同的。

GitHub 提供一个标记为 "Merge pull request" 的按钮,带有一个下拉三角形。单击三角形会提供更多选项(至少正常情况下——the GitHub help page 说这个 "Depend[s] on the merge options enabled for your repository"):

  • 创建合并提交
  • 压缩并合并
  • 变基并合并

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

  • git merge 获取视情况而定的默认操作;
  • git merge --ff-only 防止合并,但允许快进操作;
  • git merge --squash 强制挤压操作,而不创建合并;
  • git merge --no-ff 强制执行合并操作;或
  • git rebase 后跟 git merge --ff-only 来复制提交以便可以快进——这是默认的 rebase 操作——然后执行快进操作。

三个 GitHub 操作中的第一个 "Create a merge commit",在最终结果方面等同于命令行 git merge --no-ff(区别在于 Git如果存在合并冲突,Hub 根本不会提供此选项,但 see this page 也是如此)。三个 GitHub 操作中的第二个相当于命令行 git merge --squash 并且是您在问题中描述的内容:

... will only record one commit on master where as I committed like 20 on branch A

请注意,新提交与其他 N 次提交具有相同的效果,但它是一个普通的、非合并的、单亲提交(这在GitHub 接口,因为它试图隐藏 Git 提交图的非线性特性)。参见 this GitHub help page squash diagram。 (请注意,该页面上的纯合并图相当差,但壁球图很不错。)真正的合并,在命令行上使用 --no-ff 进行,有 two parents:第一个父级是您执行合并的分支上的先前提交(即master),第二个父级是被合并的分支的尖端提交(分支A在你的例子中)。这意味着所有 N 个单独的提交保持独立:只添加了一个新提交,表示 组合 这些单独提交的结果。

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

正如我上面提到的,快进根本不是合并。但是,仅当要合并的所有 "new" 提交都是 "ahead of" 所有当前提交时,才有可能快进。据我所知,在 GitHub 上可视化是否是这种情况是不可能的1

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

如果当前无法快进,您可以使用git rebase使其成为可能,之后您可以使用git merge(可选择使用 --ff-only,作为安全检查,或覆盖您使用 git config merge.ff 设置的任何配置)。 Rebase 有点复杂,至少当它出错时是这样,所以正如其他人所说,您应该先阅读它。


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