执行以下三种命令序列:
命令1:
git fetch origin master
git rebase origin master命令2:
git pull origin master --rebase命令3:
git fetch origin master
git checkout FETCH_HEAD我的理解是,这三个命令都是相同的,即:
发布于 2017-12-21 15:21:06
在第一组命令中,rebase可能不是您想要的;rebase不以远程作为参数。
(UPDATE:也就是说,在某些情况下,git会像ref一样解释远程名称,甚至可能代表您的意思。我自己也不会依赖它,但是:如果有一个符号引用( refs/remotes/origin/HEAD )--它可以被解释为origin的“默认分支”,并且如果您通过克隆原点创建本地的话,那么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状态)。
https://stackoverflow.com/questions/47927746
复制相似问题