场景

○ 当前 git 分支状态如下示意图,本地 dev 分支从 master 分支的 C2 版本切出并经过 2 次提交到达 C4 版本,远程 master 分支经过 1 次提交到达 C5 版本。
○ 此时要在本地将 dev 分支合并到 master。

git merge与rebase场景图,来自congzhou09.gitlab.io

merge 方式

♂ 直接使用 merge 命令合并 dev 分支到 master 分支,由于 C2 不是 master 最新版本,将把 C2 到 C4 的修改合并到 master 最新版本 C5 并自动生成一条 commit。
♂ 两个分支上的 commit 记录在 log 中的顺序与 pull 与 merge 操作先后有关。先 pull 再 merge 是先合并远程修改再合并本地修改,先 merge 再 pull 是先合并本地修改再合并远程修改,从思路上都说得通。
♂ 本地切到 master 分支后,先 pull master 分支,再 merge dev 分支的 log 结果如下图,其中的 parent1 是 C5。

♂ 本地切到 master 分支后,先 merge dev 分支,再 pull master 分支的 log 结果如下图,远程 master 上的新提交 C5 被显示为被合并分支,其中的 parent1 是 C4。

♂ merge 方式自动生成的那条 commit 记录了合并结果分别与两个分支最新版本的差异。
♂ 使用 merge 方式合并分支,merge 与 pull 顺序只影响两分支 commit 记录的顺序,不影响合并完的代码结果。

rebase 方式

♀ rebase 思路是将 dev 分支上的原先基于的 C2 更新为基于 C5,将对原基准版本后的每个 commit(C3 和 C4)执行更新基准过程,每个 commit 可能都要解决一次冲突,rebase 完成之后分支状态示意图如下,此时再将 dev 分支合并到 master 由于基准版本就是 master 最新版本就只是简单的同步了。

git merge与rebase场景图,来自congzhou09.gitlab.io

♀ “git rebase master”和“git rebase –continue”命令对应在 TortoiseGit 的操作界面如下,其中 Branch 是执行 rebase 的分支,Upstream 是 base 所在分支。

♀ rebase 的 log 结果如下图,经过 rebase 之后,C3 与 C4 的 commit log 记录的修改内容将变成基于 C5 的修改,相应 SHA 码也会更改。

rebase 方式与 merge 方式区别

□ 执行 rebase 期间可能需要解决多次冲突。
□ rebase 的 log 结果中没有单独生成一条记录合并的 commit,log graph 是线性没有分叉的。
□ rebase 的 log 结果中 commit 记录固定按照合并到 master 分支的先后顺序排列。

参考文献

你真的懂 git rebase 吗-简书
git 官方 Reference 手册