这三组 git 命令的作用相同吗?

Do these three sets of git commands do the same?

执行以下三个命令序列执行相同的操作:

命令 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. "Download" 指定远程仓库指定分支的所有提交。
  2. 将下载提交的当前分支 "on top" 中的提交放入。

在您的第一组命令中,rebase 可能不是您想要的; rebase 不将遥控器作为参数。

(UPDATE: 也就是说,在某些情况下 git 会将远程名称解释为 ref,甚至可能代表您的意思。我我自己不会依赖它,但是:如果有一个符号引用 refs/remotes/origin/HEAD - 可以解释为 origin 的 "default branch" 并且如果您通过克隆创建本地通常会存在当它有一个有效的 HEAD 引用时的原点 - 然后 origin 将扩展到 refs/remotes/origin/HEAD 指向的任何地方。)

我想你的意思是

git rebase origin/master master

有 shorthand 种方法可以根据上游配置编写,并且已经 master 签出,但无论如何。我会继续假设这就是你想要做的。

在那种情况下,您的第二个命令或多或少是第一个命令集的 shorthand。

然而,第三条命令并不等价。 rebase 创建新的提交并移动引用(出现在 "move" 现有的一组提交中),而 checkout 两者都不做。 checkout 仅移动当前 HEAD.

为了说明,我们假设您有

A -- B <--(master)
              ^HEAD

原点有

A -- C <--(master)

所以如果你fetch你会得到

A -- B <--(master)
 \            ^(HEAD)
  C <--(origin/master)

现在如果你做 rebase as

git rebase origin/master master

(或者只是

git rebase

在典型配置中)你最终会得到

  B
 /
A -- C <--(origin/master)
      \
       B' <--(master)
                 ^HEAD

我在图中保留了 B 以说明为什么 master 处的提交被标记为 B'。最初的 B 提交仍然存在(目前),并且 B' 是在 rebase 中创建的新的独立提交。因为 B 是 "dangling" 它最终可能被垃圾收集。

如果您不是 fetch,而是从

开始,这也是您所期望的
git pull --rebase origin master

另一方面,如果您rebase而是在fetch之后说

git checkout FETCH_HEAD

你会得到

A -- B <--(master)
 \
  C <--(origin/master)
  ^(HEAD)

没有新的提交,没有移动的引用;只是 HEAD 发生了变化(并且您处于分离的 HEAD 状态)。