不使用 squash 与使用 squash 选项合并提交

Merge commit without squash vs with squash option

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

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

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

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

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

两种合并之间的区别仅提交历史记录不同(如您在图中显示的日志)。

让我们用图表来说明。假设合并前的提交历史如下:

A---B---C---D  master
     \
      E---F---G  develop

合并提交(多个 parents):

使用的命令是git merge branchname。这是合并两个分支的默认方式。

当您在 SmartGit (git merge develop) 中通过 Merge commitdevelop 分支合并到 master 分支时,提交历史将是:

A---B---C---D---M  master
     \         /
      E---F---G    develop

简单提交(一次 parent、"squash"):

--squash选项合并两个分支,使用的命令是git merge branchname --squash.

--squash

Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the HEAD, or record $GIT_DIR/MERGE_HEAD (to cause the next git commit command to create a merge commit). This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).

当您在 SmartGit (git merge develop --squash) 中通过 简单提交 develop 分支合并到 master 分支时,它从 develop 分支到 master 分支作为一个新的普通提交(就像真正的合并发生一样),提交历史将是:

A---B---C---D---M  master
     \                 
      E---F---G    develop

merge commits 只是 commit,但区别在于它们有多个 parent。 如您所知,提交可能有也可能没有 parent 提交,实际上 merge commitcommit 有多个 parent commit.