【问题标题】:Git fetch and pull with no argumentsGit fetch 和 pull 没有参数
【发布时间】:2011-10-15 05:02:42
【问题描述】:

我有一个名为 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

【问题讨论】:

    标签: git git-pull git-fetch


    【解决方案1】:

    不幸的是,它们是否等效通常取决于您所在的分支、您的配置、月相等。

    您可以从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>。在这种情况下,适用以下规则:

    1. 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 的命令是等效的。 "

    【讨论】:

    • 它们并不完全等价——详情请参阅我的回答。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-22
        • 2022-06-14
        • 2017-06-30
        • 2021-08-17
        • 2018-03-05
        • 1970-01-01
        • 2011-09-11
        相关资源
        最近更新 更多