以下三个命令序列是否相同:
命令1:
git fetch origin master
git rebase origin master
命令2:
git pull origin master --rebase
命令3:
git fetch origin master
git checkout FETCH_HEAD
我的理解是所有三个命令都是相同的,即:
答案 0 :(得分:4)
在你的第一组命令中,rebase
可能不是你想要的; rebase
不会将遥控器作为参数。
(更新:那就是说,在某些情况下git
会像ref一样解释一个远程名称,它甚至可能代表你的意思。我不会依赖我自己,但是:如果有一个符号引用refs/remotes/origin/HEAD
- 可以解释为origin
的“默认分支”,如果你通过克隆原点来创建本地时通常会存在它有一个有效的HEAD
引用 - 然后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
状态)。