在您的第一组命令中,rebase 可能不是您想要的; rebase 不接受遥控器作为参数。
(更新:也就是说,在某些情况下,git 会将远程名称解释为 ref,它甚至可能代表您的意思。我自己不会依赖它, 但是:如果有一个符号 ref refs/remotes/origin/HEAD - 可以解释为 origin 的“默认分支”,并且如果您通过克隆原点在其具有有效 @987654326 的时间创建本地,通常会存在@reference - 然后origin 将扩展为refs/remotes/origin/HEAD 指向的任何内容。)
我想你是说
git rebase origin/master master
有一些基于上游配置和已经签出master 的速记方法,但无论如何。我会继续假设这是你的意思。
在这种情况下,您的第二个命令或多或少是您的第一组命令的简写。
但是,第三个命令并不等效。而rebase 创建新的提交并移动引用(似乎“移动”了现有的一组提交),checkout 不做这些事情。 checkout 只是移动当前的HEAD。
为了说明,假设你有
A -- B <--(master)
^HEAD
原产地有
A -- C <--(master)
所以如果你fetch 你会得到
A -- B <--(master)
\ ^(HEAD)
C <--(origin/master)
现在,如果您将rebase 设为
git rebase origin/master master
(或只是
git rebase
在典型的配置中)你最终会得到
B
/
A -- C <--(origin/master)
\
B' <--(master)
^HEAD
我在图中保留了B,以说明为什么master 的提交标记为B'。原始的B 提交仍然存在(目前),B' 是在rebase 中创建的一个新的独立提交。因为B 是“悬空的”,它最终可能会被垃圾回收。
如果您开始使用的是 fetch,这也是您所期望的
git pull --rebase origin master
另一方面,如果你不做一个rebase,而是在fetch之后,说
git checkout FETCH_HEAD
你会得到
A -- B <--(master)
\
C <--(origin/master)
^(HEAD)
没有新的提交,没有移动的参考;只是 HEAD 更改(并且您处于分离的 HEAD 状态)。