首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这三组git命令也是这样吗?

这三组git命令也是这样吗?
EN

Stack Overflow用户
提问于 2017-12-21 15:09:38
回答 1查看 64关注 0票数 0

执行以下三种命令序列:

命令1:

代码语言:javascript
复制
git fetch origin master
git rebase origin master

命令2:

代码语言:javascript
复制
git pull origin master --rebase

命令3:

代码语言:javascript
复制
git fetch origin master
git checkout FETCH_HEAD

我的理解是,这三个命令都是相同的,即:

  1. 从指定的远程存储库的指定分支“下载”所有提交。
  2. 将当前分支的提交放在下载的提交的“顶部”。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 15:21:06

在第一组命令中,rebase可能不是您想要的;rebase不以远程作为参数。

(UPDATE:也就是说,在某些情况下,git会像ref一样解释远程名称,甚至可能代表您的意思。我自己也不会依赖它,但是:如果有一个符号引用( refs/remotes/origin/HEAD )--它可以被解释为origin的“默认分支”,并且如果您通过克隆原点创建本地的话,那么origin将扩展到refs/remotes/origin/HEAD所指向的任何位置。)

我想你是说

代码语言:javascript
复制
git rebase origin/master master

有一些简单的方法可以根据上游配置编写,并且已经签出了master,但是无论如何。我会继续假设这是你的本意。

在这种情况下,您的第二个命令或多或少是第一组命令的缩写。

然而,第三个命令并不等价。尽管rebase创建了新的提交和移动引用(似乎“移动”了一组现有的提交),但checkout却没有做到这两件事。checkout只是移动当前的HEAD

为了说明,让我们假设您已经

代码语言:javascript
复制
A -- B <--(master)
              ^HEAD

而起源

代码语言:javascript
复制
A -- C <--(master)

所以如果你fetch你会得到

代码语言:javascript
复制
A -- B <--(master)
 \            ^(HEAD)
  C <--(origin/master)

现在,如果您将rebase作为

代码语言:javascript
复制
git rebase origin/master master

(或者只是

代码语言:javascript
复制
git rebase

在一个典型的配置中)

代码语言:javascript
复制
  B
 /
A -- C <--(origin/master)
      \
       B' <--(master)
                 ^HEAD

我在图中保留了B,以说明为什么master的提交被标记为B'。原始的B提交仍然存在(目前),B'是在rebase中创建的一个新的单独提交。因为B“摇摇欲坠”,它最终可能会被垃圾收集。

这也是你所期望的,如果你开始的时候不是fetch,而是

代码语言:javascript
复制
git pull --rebase origin master

另一方面,如果你不做rebase,而是在fetch之后,比如说

代码语言:javascript
复制
git checkout FETCH_HEAD

你会得到

代码语言:javascript
复制
A -- B <--(master)
 \
  C <--(origin/master)
  ^(HEAD)

没有新的提交,没有移动的引用;只有HEAD更改(并且您处于独立的HEAD状态)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47927746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档