合并提交与正常提交

Tom*_*mas 17 git version-control merge smartgit

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

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

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

  • master
  • 一个分支合并为master并带有merge commit选项
  • 一个分支与simple commit选项合并

其中一个branches(with_merge_branch)通过连接分支与主线路来实现合并操作.第二个(normal_commit_branch)没有.

git树

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

Mar*_*Liu 27

两种合并之间的区别仅在提交历史记录中有所不同(因为您在图中显示了日志).

让我们用图表说明.在合并之前假设提交历史如下:

A---B---C---D  master
     \
      E---F---G  develop
Run Code Online (Sandbox Code Playgroud)

合并提交(多个父级):

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

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

A---B---C---D---M  master
     \         /
      E---F---G    develop
Run Code Online (Sandbox Code Playgroud)

简单提交(一个父母,"壁球"):

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

- 壁球

生成工作树和索引状态,好像发生了真正的合并(合并信息除外),但实际上没有提交,移动HEAD或记录$ GIT_DIR/MERGE_HEAD(以使下一个git commit命令创建一个合并提交).这允许您在当前分支之上创建单个提交,其效果与合并另一个分支(或章鱼的情况下更多)相同.

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

A---B---C---D---M  master
     \                 
      E---F---G    develop
Run Code Online (Sandbox Code Playgroud)

  • 我认为,警告是这样的:**Squash 提交会丢失历史记录!** 如果合并,“git”将知道导致功能集成的所有中间步骤,并且“git bisect”将能够查明任何回归到这些中间步骤之一。如果你挤压,你的功能分支就变成了 git 的黑匣子,而“git bisect”将只能指出包含整个功能开发的一个挤压提交。最好全心全意地拥抱“git”的 DAG 历史模型,它会为你省去很多麻烦。 (2认同)