以下三个命令序列是否相同:
命令1:
git fetch origin master
git rebase origin master
命令2:
git pull origin master --rebase
命令3:
git fetch origin master
git checkout FETCH_HEAD
我的理解是所有三个命令都是相同的,即:
在你的第一组命令中,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
变化(你在独立的qazxswpoi状态)。