Merge vs. Rebase 的异同
二者均是将一个分支的变更整合到另一分支;
不同在于整合过程是如何完成的?
当 git merge
时, 源分支的历史记录不变, 唯有目标分支的历史记录会发生改变; 保留源分支历史记录不变这也是 git merge
的一个重要优点.
git rebase
会将历史记录扁平化. 一般用于将已完成的变更工作从一个分支转移到另一分支, 优点是消除了这个过程中不必要的历史记录, 简化了历史记录便于回顾.
如何选用merge
与rebase
Git Rebase
提供了更为简洁的历史记录;
Git Merge
简单, 且保留了完整的历史记录以及提交的次序, 维护了分支的上下文.
单独或小团队中, 使用 rebase ; 反之, 使用 merge.
usage demo
假设你在一个专属的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
merge
是非破坏性的操作, 已存在的分支不会被改变, 这可以避免所有rebase
潜在的陷阱.
另一方面, 这也意味着每当你需要从其他分支合并变更, 当前的feature
分支都会创建一个对应的merge commit
.
若master
非常活跃, 这可能会污染feature
分支的历史记录, 这会使得其他开发者较难理清项目的历史记录.
使用 git rebase
git checkout feature
git rebase master
这会将整个feature
分支移至master
分支的最前端, 从而高效地整合所有新提交到 master
.
这会改写项目的历史记录, 通过为原始分支中的每一个commit
记录创建对应新的commit
记录到 master
的历史记录中.
rebase
最大的优点在于你能得到一个较简洁且线性的项目历史记录.
如图所示, 它消除了不必要的git merge
提交, 因此不会产生的分叉, 始终是线性的, 你可以一路跟踪feature
直到项目的起点.
同时,线性特点使得在使用命令类似git log / git bisect / gitk
来定位你的项目时更简单.
rebase
的缺点主要两点,
一是使用rebase
需要严格遵循黄金规则 , 否则改写项目历史记录可能会对你的协作工作流造成灾难性破坏;
二是rebase
丢失了原本可由merge commit
提供的上下文, 即你无法看到上游变更何时被合并到功能中.