合并提交与正常提交

时间:2017-11-03 06:43:32

标签: git merge version-control smartgit

在日常工作中,我使用SmartGit作为选择的客户。然而,我的团队成员坚持使用git native,非商业GUI。我们发现我们的合并提交看起来有些不同。

这些是SmartGit在请求合并分支时给出的选项: SmartGit commits type

在下图中,您可以看到我的示例SmartGit图输出,其中包含:

  • master分行
  • 使用merge commit选项
  • 将一个分支合并为主分支
  • 一个分支与simple commit选项
  • 合并

其中一个分支(with_merge_branch)通过将分支与主要线路连接来可视化合并操作。第二个(normal_commit_branch)没有。

git tree

问题是,如何在本机git命令中强制执行这两种行为?即那两个提交之间的区别是什么?

2 个答案:

答案 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

  

--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 commitcommit且有多个parent commit