对比 Git merge 和 Git rebase

什么是 Git merge

Git merge是 git 中的一条用于将在两个分支上所做更改进行合并的命令,该命令将另一分支的所有更改汇总成一条 commit 添加在合并目标分支的尾部。该操作的行为如下图所示:

merge one branch into another branch

什么是 merge conflict

假设一名开发者刚刚开发完一个特性,准备把目前分支合并到 master 分支。

而此时的 master 分支上已经有了其他更改,即在分支创建后又有新的更改被提交到了 master 分支上,使两个分支出现并行开发的情况。这个时候在合并过程中可能遇到修改前的文件版本与当前合并的文件版本不一致的情况。

一种最典型的情况是两个人修改了同一文件的同一行代码或者一个人改动了那些被另一个人删除了的代码

如何解决 merge conflict

首先需要知道的是,当  遇到这种情况时可以随时通过回滚或者撤销返回到冲突发生之前的状态。

方法:键入git merge --abort命令,如果已经解决完冲突,并且在合并完成后发现一个错误,可以键入git reset --hard命令令系统回滚到那个合并开始前的  状态。

除此之外,该问题的解决之道

什么是 Git rebase

Git rebase将一条分支整体移动至另一分支的尾部,具体行为如下图所示:

Rebasing a branch on top of another branch

两者的优缺点和适用场景

  1. Git merge
    • 优点:
      • 不对现有的分支做任何更改,所有合并后的改动被集中在一个 merge commit 里面
    • 缺点:
      • 会对现有分支的提交历史造成一定污染
  2. Git rebase
    • 优点:
      • 保持分支的提交记录为线性
    • 缺点:
      • 造成提交历史的不一致,尤其在多个开发者合作的环境下会对开发流程造成一些不利影响
      • 不能记录下何时特性分支上的改动被整合到当前分支

总结

大体来说,Git merge 与 Git rebase 存在各自合适的使用场景。Git merge 适合用于有多个开发者协同进行开发的场景。Git rebase 则更适合在单一开发者进行开发的场景下使用,典型场景是该开发者希望将提交历史尽可能变得线性、干净

引用来源:

Atlassian - merging vs rebasing