【发布时间】:2018-03-12 21:31:46
【问题描述】:
我想将分支 A 合并到 master,但是当我在 master 上使用“git merge A”时,它会合并分支,但只会在 master 上记录一次提交,而我在分支 A 上提交了 20 次。我想合并从 A 到 master 的所有提交。我该怎么做?
【问题讨论】:
标签: git github git-branch git-merge branching-and-merging
我想将分支 A 合并到 master,但是当我在 master 上使用“git merge A”时,它会合并分支,但只会在 master 上记录一次提交,而我在分支 A 上提交了 20 次。我想合并从 A 到 master 的所有提交。我该怎么做?
【问题讨论】:
标签: git github git-branch git-merge branching-and-merging
听起来像变基到 master 是你正在寻找的。p>
试试:
git checkout A
git rebase master
我建议你在这里阅读合并和变基之间的区别https://www.atlassian.com/git/tutorials/merging-vs-rebasing
【讨论】:
您已将其交叉标记为git 和github,对于这两种不同的情况,答案是不同的。
GitHub 提供了一个标有“合并拉取请求”的按钮,带有一个下拉三角形。单击三角形会提供更多选项(至少通常情况下——the GitHub help page 表示“取决于为您的存储库启用的合并选项”):
Git 命令行是不同的,它既简单又复杂。您可以运行以下任何命令:
git merge 获取取决于情况的默认操作;git merge --ff-only 防止合并,但允许快进操作;git merge --squash 强制执行 squash 操作,而不创建合并;git merge --no-ff 强制合并操作;或git rebase 后跟 git merge --ff-only 复制提交以便可以进行快进(这是默认的变基操作),然后执行快进操作。三个 GitHub 操作中的第一个,“创建合并提交”,就最终结果而言,相当于命令行 git merge --no-ff(不同之处在于,如果有是合并冲突,但see this page 也是如此)。三个 GitHub 操作中的第二个相当于命令行 git merge --squash 并且是您在问题中描述的内容:
... 只会在 master 上记录一次提交,而我在分支 A 上提交了 20 次
请注意,新提交与其他 N 次提交具有相同的效果,但是是普通的、非合并的、单父提交(这在 GitHub 界面中很难看到,因为试图隐藏 Git 提交图的非线性特性)。见this GitHub help page squash diagram。 (请注意,该页面上的普通合并图相当差,但壁球图很不错。)在命令行上使用 --no-ff 进行的真正合并有 两个 父级:第一个parent 是您执行合并的分支上的先前提交(即master),第二个父级是合并分支的提示提交(在您的示例中为分支A)。这意味着所有 N 个单独的提交都保持独立:只添加了一个新的提交,表示组合这些单独的提交的结果。
在许多方面,这是最好的结果:它允许您将功能添加视为单个单元(合并提交)或一系列更改(侧分支上的 N 个单独提交)。但它确实造成了一个更复杂的历史:如果合并的事实预计在未来是无用的或分散注意力的,而 N 个单独的提交预计是有用的(例如,用于调试),它可能是最好使用快进操作。
正如我上面提到的,快进根本不是合并。但是,只有当所有要合并的“新”提交都“领先于”所有当前提交时,才能进行快进。据我所知,在 GitHub 上可视化是否是这种情况是不可能的1。
如果可以进行快进,命令行命令git merge 将默认执行此操作。如果可能,git merge --ff-only 会成功。因此,如果您想尝试快进,但不如果可能不创建实际的合并提交,您可以简单地使用git merge --ff-only并观察它是否成功或失败。
如果当前不能快进,您可以使用git rebase 使其成为可能,之后您可以使用git merge(可选使用--ff-only,或者作为安全检查,或覆盖您使用git config merge.ff 设置的任何配置)。变基有点复杂,至少在出错时是这样,所以正如其他人所说,您应该先阅读它。
1或者至少,太难打扰了。如果有一个显示实际提交图的可点击按钮,那可能会很有趣。
【讨论】: