Git Rebase vs. Merge 哪个更佳?

350 阅读2分钟

Merge vs. Rebase 的异同

二者均是将一个分支的变更整合到另一分支;

不同在于整合过程是如何完成的?

git merge 时, 源分支的历史记录不变, 唯有目标分支的历史记录会发生改变; 保留源分支历史记录不变这也是 git merge 的一个重要优点.

git rebase 会将历史记录扁平化. 一般用于将已完成的变更工作从一个分支转移到另一分支, 优点是消除了这个过程中不必要的历史记录, 简化了历史记录便于回顾.

如何选用mergerebase

Git Rebase 提供了更为简洁的历史记录; Git Merge 简单, 且保留了完整的历史记录以及提交的次序, 维护了分支的上下文.

单独或小团队中, 使用 rebase ; 反之, 使用 merge.

usage demo

01.svg

假设你在一个专属的feature branch上工作, 此时另一个成员提交了变更, 更新了master. 为了将该成员提交的变更合并到你的feature branch, 那么你可以使用git merge/rebase.

使用 git merge

git checkout feature 
git merge master
//one-liner command :  git merge feature master

master 合并到 feature 分支, 会为feature branch创建merge commit, 该commit 捆绑了两个分支的历史, 形如:

Merge branch 'master' into feature

02.svg

merge是非破坏性的操作, 已存在的分支不会被改变, 这可以避免所有rebase潜在的陷阱. 另一方面, 这也意味着每当你需要从其他分支合并变更, 当前的feature分支都会创建一个对应的merge commit.

master非常活跃, 这可能会污染feature分支的历史记录, 这会使得其他开发者较难理清项目的历史记录.

使用 git rebase

git checkout feature
git rebase master

这会将整个feature分支移至master分支的最前端, 从而高效地整合所有新提交到 master. 这会改写项目的历史记录, 通过为原始分支中的每一个commit记录创建对应新的commit记录到 master 的历史记录中.

03.svg

rebase 最大的优点在于你能得到一个较简洁且线性的项目历史记录. 如图所示, 它消除了不必要的git merge提交, 因此不会产生的分叉, 始终是线性的, 你可以一路跟踪feature直到项目的起点. 同时,线性特点使得在使用命令类似git log / git bisect / gitk来定位你的项目时更简单.

rebase的缺点主要两点,

一是使用rebase需要严格遵循黄金规则 , 否则改写项目历史记录可能会对你的协作工作流造成灾难性破坏;

二是rebase丢失了原本可由merge commit提供的上下文, 即你无法看到上游变更何时被合并到功能中.

参考文档: merging vs rebasing