我签出了一个名为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
如果我省略了fetch
或pull
的参数,git会默认提取(或拉动)我目前已检出的分支吗?即是以下几对命令等同于什么?
> git checkout foo
> git pull
和
> git checkout foo
> git pull origin foo
答案 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/
。在这种情况下,适用以下规则:当前分支的
$GIT_DIR/remotes/<origin>
配置存在,即合并的远程站点的分支名称。如果refspec是一个全局的,则不会合并。
- 醇>
否则将合并第一个refspec的远程分支。
使用以下内容创建分支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
。