我知道 git rebase
和 git merge
的区别在于,git rebase
将一个分支的开头移动到另一个分支的末尾,而 git merge
则创建一个新的提交,代表从另一个分支合并的提交(即包括或整合)。举个例子:
由于 git pull
等同于 git fetch
+ git merge
,而 git pull --rebase
等同于 git fetch
+ git rebase
,假设你有一个本地主分支和一个远程主分支:
- o - o - o - H - A - B - C (master)
\
P - Q - R (origin/master)
HEAD指向C
如果你执行git pull
,会得到以下结果:
- o - o - o - H - A - B - C - X (master)
\ /
P - Q - R --- (origin/master)
现在,HEAD将会指向远程仓库的提交历史中的R号提交,因为合并提交(X)包含了远程分支的提交历史。
另一方面,如果您执行git pull --rebase
,则最终结果如下:
- o - o - o - H - P - Q - R - A' - B' - C' (master)
|
(origin/master)
正如您所看到的,
git pull
和git pull --rebase
并不相同。因为git pull --rebase
会在本地主分支中生成提交C',即本地主分支上的提交C,而使用git pull
时HEAD位于R。换句话说,通过git pull
获取的提交历史与通过git pull --rebase
获取的提交历史的内容是相同的,但提交历史中的提交顺序是不同的。但是当您从远程分支拉取时,本地主分支上没有进行任何工作会发生什么呢?
本地主分支和远程主分支:
- o - o - o - H (master)
\
P - Q - R (origin/master)
HEAD 在 H 上
如果你执行 git pull
,你会得到这样的结果:
- o - o - o - H - X (master)
\ \
P - Q - R --- (origin/master)
由于合并提交表示已合并的远程分支,因此HEAD现在将位于仓库的提交R处的X位置。
另一方面,如果您执行了git pull --rebase
,您会得到什么结果?
- o - o - o - H - P - Q - R (master)
|
(origin/master)
意思是HEAD位于R,这意味着当本地分支上没有进行任何工作时,
git pull --rebase
与git pull
是相同的。
X
) 代码库在两种情况下都是相同的,但历史遍历不同,因此日志会有所不同。 - Romain Valerigit pull
的例子中的假设是错误的,如果你从远程拉取并且本地分支没有新的提交,那么默认情况下就不会有新的合并提交,但是会有快进。你可以通过添加--no-ff
强制执行合并提交来改变这种行为。回答你的问题,如果没有本地提交,那么 pull 和 pull --rebase 是相同的。 - William Kinaan