在日常工作中,我使用SmartGit
作为选择的客户。然而,我的团队成员坚持使用git native,非商业GUI。我们发现我们的合并提交看起来有些不同。
在下图中,您可以看到我的示例SmartGit图输出,其中包含:
master
分行merge commit
选项simple commit
选项其中一个分支(with_merge_branch
)通过将分支与主要线路连接来可视化合并操作。第二个(normal_commit_branch
)没有。
问题是,如何在本机git命令中强制执行这两种行为?即那两个提交之间的区别是什么?
答案 0 :(得分:19)
两种合并之间的差异仅在提交历史记录中不同(因为您在图表中显示了日志)。
让我们通过图表说明。在合并之前假设提交历史如下:
A---B---C---D master
\
E---F---G develop
使用的命令是git merge branchname
。它是合并两个分支的默认方式。
当您通过SmartGit(develop
)中的合并提交将master
分支合并到git merge develop
分支时,提交历史记录将为:
A---B---C---D---M master
\ /
E---F---G develop
它使用--squash
选项合并两个分支,使用的命令是git merge branchname --squash
。
生成工作树和索引状态,就像发生了真正的合并一样(合并信息除外),但实际上并没有 提交,移动HEAD,或记录$ GIT_DIR / MERGE_HEAD(导致 next git commit命令用来创建合并提交)。这允许你 在当前分支的顶部创建一个提交,其效果是 与合并另一个分支相同(或者在章鱼的情况下更多)。
在SmartGit(develop
)中通过简单提交将master
分支合并到git merge develop --squash
分支时,它会从develop
分支获得更改作为新的普通提交进入master
分支(好像发生了真正的合并),并且提交历史将是:
A---B---C---D---M master
\
E---F---G develop
答案 1 :(得分:0)
merge commits
只是commit
,但区别在于他们有不止一个父母。
如您所知,提交可能有也可能没有父提交,实际上merge commit
是commit
且有多个parent commit
。