这三组 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
我的理解是所有三个命令都做同样的事情,即:
- "Download" 指定远程仓库指定分支的所有提交。
- 将下载提交的当前分支 "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
状态)。
执行以下三个命令序列执行相同的操作:
命令 1:
git fetch origin master
git rebase origin master
命令 2:
git pull origin master --rebase
命令 3:
git fetch origin master
git checkout FETCH_HEAD
我的理解是所有三个命令都做同样的事情,即:
- "Download" 指定远程仓库指定分支的所有提交。
- 将下载提交的当前分支 "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
状态)。