繁体   English   中英

没有参数的Git获取和拉取

[英]Git fetch and pull with no arguments

我有一个名为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 fetch的参数,那么git默认会获取(或拉动)我当前检出的分支吗? 也就是说,以下两对命令是否等效?

> git checkout foo
> git pull

> git checkout foo
> git pull origin foo

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

你可以从git pull手册页中找到这个,正如我在下面所描述的那样,但我通常会尽量避免通过这样做来解决这个问题: git fetch origin然后git merge origin/foo (我写了一篇关于此事的博客文章 。)

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

通常人们使用git pull而不给出任何参数。 传统上,这相当于说git pull origin 然而,当配置branch.<name>.remote是在分支存在,而<name> ,则使用该值而不是origin

为了确定要用于获取的URL,请参阅配置remote.<origin>.url值,如果没有任何此类变量,则在$GIT_DIR/remotes/<origin> URL: line上的值文件被使用。

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

refs/heads/*:refs/remotes/origin/*

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

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

如果在git pull的命令行上给出了明确的refspecs,它们都被合并了。

当命令行没有给出$GIT_DIR/remotes/<origin> ,git pull使用配置中的$GIT_DIR/remotes/<origin>$GIT_DIR/remotes/<origin> 在这种情况下,以下规则适用:

  1. If branch.<name>.merge存在当前分支的If branch.<name>.merge配置,那么是合并的远程站点上的分支的名称。

  2. 如果refspec是一个全局的,则不会合并任何内容。

  3. 否则,合并第一个refspec的远程分支。

当您使用以下命令创建分支foo时:

git checkout origin/foo -b foo --track

...它将设置以下配置选项,它们将您的分支fooorigin存储库中的refs/heads/foo相关联:

branch.foo.remote=origin
branch.foo.merge=refs/heads/foo

所以,如果你把它与上面的大胆句子放在一起,答案是“是的,在你描述的这种情况下,当你在分支foo ,命令git pullgit pull origin foo是等价的。”

即使在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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM