这两种合并方式的区别仅在于它们的提交历史不同(就像您展示的图表日志中一样)。
让我们通过图形来说明。 假设合并之前的提交历史如下:
A---B---C---D master
\
E---F---G develop
使用的命令是git merge branchname
。这是将两个分支合并的默认方法。
当你在 SmartGit 中通过合并提交(git merge develop
)将develop
分支合并到master
分支时,提交历史记录将会变成:
A---B---C---D---M master
\ /
E---F---G develop
使用--squash
选项合并两个分支,命令为git merge branchname --squash
。
生成工作树和索引状态,就像真正的合并发生了一样(除了合并信息),但实际上不会进行提交、移动HEAD 或记录$GIT_DIR/MERGE_HEAD(以使下一个git commit命令创建合并提交)。这允许您在当前分支之上创建一个单独的提交,其效果与合并另一个分支相同(或在八爪鱼情况下更多)。
当您在SmartGit中使用简单提交(git merge develop --squash
)将develop
分支合并到master
分支时,它会将来自develop
分支的更改作为新的普通提交(就像真正的合并发生了一样)带入到master
分支,并且提交历史将如下所示:
A---B---C---D---M master
\
E---F---G develop
git
将知道导致功能集成的所有中间步骤,而git bisect
将能够将任何回归定位到这些中间步骤之一。如果你压缩,你的功能分支对于git
来说就变成了一个黑匣子,git bisect
只能指出包含整个功能开发的一个压缩提交。最好全心全意地拥抱git
的DAG历史模型,这将在未来为你节省许多麻烦。 - cmaster - reinstate monica合并提交
只是普通的提交(commit)
,但不同之处在于它们具有多个父级。
正如您所知,提交可能有也可能没有父提交,实际上合并提交
是具有多个父提交(parent commit)
的提交(commit)
。
git merge
的默认行为。 - Tim Biegeleisen