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

问题描述 投票:0回答:1

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

命令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. 将当前分支的提交置于下载提交的“顶部”。
git git-rebase git-checkout git-fetch
1个回答
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变化(你在独立的qazxswpoi状态)。

© www.soinside.com 2019 - 2024. All rights reserved.