git pull == git fetch + git merge
git pull --rebase == git fetch + git rebase

拆解来看这两个命令就是在拉取远端代码后,是合并还是进行变基操作。

假设当前有三个提交A,B,C,并且分支feature都与远程代码同步。

Responsive Image

我们在feature上做了一些修改,并产生了E提交,远程也有用户进行了更新到了D提交。

Responsive Image

此时我们需要git fetch获取最新的代码,然后git merge解决冲突后重新git add git commit,得到F提交。最后git push即可成功推送,得到如下的关系

Responsive Image

而使用git rebase将会创建一个新的提交FF的文件内容和上面F的一样,但我们将 E 提交废除,当它不存在(图中用虚线表示)。由于这种删除,避免了菱形的产生,保持提交曲线为直线。

Responsive Image

rebase的过程中,有时也会有冲突,这时 Git 会停止rebase并让用户去解决冲突,解决完冲突后,用git add添加修改的文件,然后不用执行git commit,直接执行git rebase --continue,这样 git 会继续 apply 余下的补丁。