这三组git命令是否也这样做?

时间:2017-12-21 15:09:39

标签: git git-rebase git-checkout git-fetch

以下三个命令序列是否相同:

命令1:

git fetch origin master
git rebase origin master

命令2:

git pull origin master --rebase

命令3:

git fetch origin master
git checkout FETCH_HEAD

我的理解是所有三个命令都是相同的,即:

  1. “下载”指定远程存储库的指定分支的所有提交。
  2. 将当前分支的提交“放在已下载的提交的顶部”。

1 个答案:

答案 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状态)。