不幸的是,它们是否等效通常取决于您所在的分支、您的配置、月相等。
您可以从git pull 手册页中解决这个问题,如下所述,但我通常会尽量避免必须通过以下方式解决这个问题:git fetch origin,然后是git merge origin/foo。 (我写了somewhat rambling blog post about this。)
但是,您的问题实际上是关于git pull 的默认行为,当您未指定远程或参考规范时。我们可以从git pull man page,尤其是DEFAULT BEHAVIOUR section 中弄清楚这一点。这有点难以弄清楚,所以我用粗体表示了唯一真正适用于您的问题的部分,因为(a)您在分支 foo,(b)您按照问题中的描述创建了该分支,并且 (c) 你没有改变你的配置。
人们经常在不提供任何参数的情况下使用 git pull。传统上,这相当于说git pull origin。 但是,当在分支 <name> 上存在配置 branch.<name>.remote 时,将使用该值而不是 origin。
为了确定要从哪个 URL 获取,请参考配置 remote.<origin>.url 的值,如果没有任何此类变量,则使用 $GIT_DIR/remotes/<origin> 文件中 URL: 行上的值。
为了确定在命令行上没有任何 refspec 参数的情况下运行命令时要获取哪些远程分支(并可选择存储在远程跟踪分支中),请参考配置变量 remote.<origin>.fetch 的值,如果没有,$GIT_DIR/remotes/<origin> 文件被咨询并使用它的Pull: 行。除了 OPTIONS 部分中描述的 refspec 格式之外,您还可以使用如下所示的 globbing refspec:
refs/heads/*:refs/remotes/origin/*
全局引用规范必须有一个非空的 RHS(即必须存储在远程跟踪分支中获取的内容),并且它的 LHS 和 RHS 必须以 /* 结尾。上面指定使用refs/remotes/origin/层次结构中的远程跟踪分支以相同的名称跟踪所有远程分支。
为了不破坏向后兼容性,在获取后确定要合并哪个远程分支的规则有点涉及。
如果在 git pull 的命令行中给出了明确的 refspecs,它们都会被合并。
当命令行上没有给出 refspec 时,git pull 使用配置中的 refspec 或 $GIT_DIR/remotes/<origin>。在这种情况下,适用以下规则:
-
If branch.<name>.merge当前分支的配置存在,即被合并的远程站点的分支名称。
-
如果 refspec 是通配符,则不会合并任何内容。
-
否则第一个 refspec 的远程分支会被合并。
当您创建分支 foo 时:
git checkout origin/foo -b foo --track
...它将设置以下配置选项,将您的分支foo 与origin 存储库中的refs/heads/foo 相关联:
branch.foo.remote=origin
branch.foo.merge=refs/heads/foo
所以,如果你把它和上面加粗的句子放在一起,答案是“是的,在你描述的这种情况下,当你在分支 foo 上时,git pull 和 git pull origin foo 的命令是等效的。 "