Last updated on Oct 16, 2022

同一分支 git pull 使用 rebase

示例的提交线路,想从中看出一条清晰的提交线几乎是不可能的,充满了 Merge remote-tracking branch 'origin/xxx' into xxx 这样的提交记录,同时也将提交线弄成了交错纵横的图,没有了可读性。

原因在于默认的 git pull 使用的是 merge 行为,当更新代码时,如果本地存在未推送到远程的提交,就会产生一个这样的 merge 提交记录。因此在同一个分支上更新代码时推荐使用 git pull --rebase

Untitled

默认的 git pull 和 git pull --rebase 的结果差异,使用 git pull --rebase 目的是修整提交线图,使其形成一条直线。

Untitled

默认的 git pull 行为是 merge,如果想修改默认的 git pull 行为:

# 为某个分支单独设置,这里是设置 dev 分支
git config branch.dev.rebase true
# 全局设置,所有的分支 git pull 均使用 --rebase
git config --global pull.rebase true
git config --global branch.autoSetupRebase always

分支合并使用 --no-ff

Git fast-forward

main 分支新建一个 feature 分支进行开发和提交。

main 分支在新建 feature 分支之后没有产生任何的提交。

feature 合并到 main 分支就叫做 fast-forward

fast-forward 合并的结果如图所示,merge 的结果就是一条直线了,无法明确哪些提交是属于新建 feature 分支的

Untitled

所以这种情况比较推荐使用 git merge --no-ff

Untitled

进阶操作

个人习惯,在合并分支之前(例如:feature 分支合并到 dev 分支),会先检查 feature 分支是否落后于 dev 分支:

# feature
$ git checkout dev

# dev
# 更新 dev 分支
$ git pull
# 检查 dev 比 feature 多提交了哪些内容
# 无输出 feature 对 dev 是 up-to-date
$ git log feature..dev

如果有输出的话,说明 feature 分支落后于 dev 分支。通常在合并前,会先执行:

# dev
$ git checkout feature
$ git rebase dev 

这样可以将 feature 分支重新拼接到更新的 dev 之后,然后就可以合并了,最终得到一个干净舒服的提交线图。