Git Merge时选择哪个

项目分支开发提交MR时,会有三个选项,MergeRebaseSquash,这三个选项有何区别,又该如何选择呢。这里Mark下。

https://static.1991421.cn/2024/2024-10-30-190528.jpeg

Merge

Merge本质是创建新的commit节点,同时源分支提交也都会带过去。假如本身有3个commit,那么Merge之后,就会多出4个commmit节点。其中1个是Merge Commit。同时Merge创建的commit还会携带源分支的提交信息。因此在很多Git GUI工具还会根据这些信息形成提交关系图。

Rebase

Rebase的本质是修改commit的parent节点,将源分支的提交都移动到目标分支的后面。假如本身有3个commit,那么Rebase之后,就会多出3个commit节点。与Merge不同不同的是不会创建新的commit节点。因此在很多Git GUI工具里去看就是一条笔直的线。

Squash

Squash的本质是合源分支的提交为1个提交,也重新生成commit message。因此在很多Git GUI工具里去看就是多了一个最新的提交节点。

https://static.1991421.cn/2024/2024-10-30-220556.jpeg

选择?

了解了3者的区别,那么如何选择呢?这里我总结下:

  1. 优先选择Squash,因为Squash可以减少commit数量,同时可以减少commit message的重复,让提交关系更清晰。一个开发在自己的分支下进行提交可能会是多次。如果选择Merge或者Rebase都会使得主干过多的提交。而Squash可以减少提交数量。当然开发也可以在自己的分支下reset再重新commit,但是毕竟繁琐些。
  2. 其次可以选择Rebase,但坏处就是不会保留合并的信息,如果不在乎分支之间的合并关系,而只是在乎提交的内容和提交人的话,这个也不错。
  3. 最后选择Merge,因为Merge是最简单的,而且可以保留分支之间的合并关系。当然坏处就是关系图复杂些。