我想将分支A合并到主人,但当我使用" git merge A"在master上它将合并分支,但只记录master上的一个提交,就像我在分支A上提交20一样。我想将所有提交从A合并到master。我怎么能这样做?
答案 0 :(得分:2)
您已将此标记交叉标记为git和github,并且这两种情况的答案不同。
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)
听起来像变身为主人就是你正在寻找的。 p>
尝试:
git checkout A
git rebase master
我建议你在这里阅读合并和重新定位之间的区别https://www.atlassian.com/git/tutorials/merging-vs-rebasing