没有参数的Git获取和拉取

时间:2011-07-28 14:44:31

标签: git git-pull git-fetch

我签出了一个名为foo的git分支。

> git status
# On branch foo
nothing to commit (working directory clean)

最初使用此命令检出:

> git checkout origin/foo -b foo --track

我想从远程存储库获取此分支的更新。我知道这些命令中的任何一个都足够了:

> git fetch origin foo # ignore the lack of merging
> git pull origin foo

如果我省略了fetchpull的参数,git会默认提取(或拉动)我目前已检出的分支吗?即是以下几对命令等同于什么?

> git checkout foo
> git pull

> git checkout foo
> git pull origin foo

3 个答案:

答案 0 :(得分:21)

不幸的是,它们是否相同或者一般取决于你所在的分支,你的配置,月相等等。

您可以在git pull手册页中找到这一点,正如我在下面所述,但我通常会尽量避免这样做:git fetch origin然后{{1 }}。 (我写了somewhat rambling blog post about this。)

但是,当您未指定远程或refspec时,您的问题实际上是关于git merge origin/foo的默认行为。我们可以从git pull man page中找出这一点,特别是DEFAULT BEHAVIOUR section。这有点难以弄清楚,所以我给出了大胆的唯一真正适用于你的问题的部分给出了(a)你在分支git pull上,(b)你创建了那个分支作为你在问题中描述,以及(c)您没有改变您的配置。

  

人们经常使用git pull而不给出任何参数。传统上,这相当于说foo但是,当在分支git pull origin上显示配置branch.<name>.remote时,将使用该值而不是<name>

     

为了确定要用于提取的网址,请参阅配置origin的值,如果没有任何此类变量,则remote.<origin>.url中的值URL:使用了文件。

     

为了确定在命令行上运行命令时没有任何refspec参数的远程分支(以及可选地存储在远程跟踪分支中),请参阅配置变量$GIT_DIR/remotes/<origin>的值,如果没有,则查询remote.<origin>.fetch文件并使用其$GIT_DIR/remotes/<origin>行。除了OPTIONS部分中描述的refspec格式之外,您还可以使用如下所示的globbing refspec:

     

Pull:

     

globbing refspec必须具有非空RHS(即必须存储在远程跟踪分支中获取的内容),并且其LHS和RHS必须以refs/heads/*:refs/remotes/origin/*结尾。以上规定使用同名的/*层次结构中的远程跟踪分支跟踪所有远程分支。

     

在获取之后确定合并哪个远程分支的规则有点涉及,以免破坏向后兼容性。

     

如果在git pull的命令行上给出了显式的refspec,它们都被合并了。

     

当命令行没有给出refspec时,git pull使用配置中的refspec或refs/remotes/origin/。在这种情况下,适用以下规则:

     
      当前分支的
  1. $GIT_DIR/remotes/<origin>配置存在,即合并的远程站点的分支名称。

  2.   
  3. 如果refspec是一个全局的,则不会合并。

  4.   
  5. 否则将合并第一个refspec的远程分支。

  6.   

使用以下内容创建分支If branch.<name>.merge

foo

...它将设置以下配置选项,将您的分支git checkout origin/foo -b foo --track foo存储库中的refs/heads/foo相关联:

origin

所以,如果你把它与上面的大胆句子放在一起,答案就是“是的,在这种情况下,当你在分支branch.foo.remote=origin branch.foo.merge=refs/heads/foo 上时,你会描述命令foo和{{ 1}}是等价的。“

答案 1 :(得分:4)

即使在Mark描述的条件下,当它们看起来相同时,仍然存在细微差别 - git pull origin foo不会更新远程跟踪分支,而git pull会更新。这在git-pull的联机帮助页中有记录:

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

因此,在您的情况下,对于git pull的真实等价物,您需要执行git pull origin foo:refs/remotes/origin/foo

答案 2 :(得分:1)

是的,他们是。跟踪信息保存在.git/config