【问题标题】:Do these three sets of git commands do the same?这三组 git 命令做的一样吗?
【发布时间】:2018-06-04 07:05:12
【问题描述】:

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

命令 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 checkout FETCH_HEAD 将检查 FETCH_HEAD 作为分离的头。不会有新的提交放在它上面。
  • 我不明白“git checkout FETCH_HEAD”是做什么的原因是我不明白“检查一个FETCH_HEAD”是什么意思。

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


【解决方案1】:

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

(更新:也就是说,在某些情况下,git 会将远程名称解释为 ref,它甚至可能代表您的意思。我自己不会依赖它, 但是:如果有一个符号 ref refs/remotes/origin/HEAD - 可以解释为 origin 的“默认分支”,并且如果您通过克隆原点在其具有有效 @987654326 的时间创建本地,通常会存在@reference - 然后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 状态)。

【讨论】:

  • 您所说的“或多或少”是指它们不完全相同(或不总是相同)吗?
  • 我不确定我是否理解这句话:“创建新的提交并移动参考(似乎“移动”了现有的一组提交)”。您的意思是否正是我的意思:它从远程存储库复制提交并将本地提交放在它们之上?
  • @Roman - “或多或少”是指有一些配置选项和其他因素可能允许两者行为不同的特殊情况;但在日常使用中,您可以交替使用 pull --rebasefetch 后跟 rebase
  • @Roman:通过“创建新提交并移动参考”:不,我不是指从远程复制提交。像几乎所有 git 命令一样,rebase 在本地运行。 pullfetch 命令是本次讨论中唯一与遥控器交互的命令。 rebase 通过创建新提交来工作,这些新提交在新基础上进行与旧提交在旧基础上所做的相同的更改;这就是rebase 的本质,所以我建议你先阅读rebase 上的文档,然后一旦你了解了这一点,你就可以担心哪些命令是等效的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2016-09-29
  • 2016-02-08
  • 2010-12-13
  • 2018-10-12
  • 2011-04-14
相关资源
最近更新 更多