Git:pull vs. fetch→pull

时间:2016-05-20 16:37:48

标签: git

我从来没有能够对这个问题得到明确答案。

很长一段时间,在同事的建议下,我一直这样做:

git fetch origin
git pull origin <mybranch>

我被告知(并且已经看到)git pull如果你没有先行git fetch,行为不一样。你没有得到任何远程更改。

但我在网上看到的是git pull相当于git fetch后跟git merge。如果确实如此,git pull将包含git fetch,我首先不需要明确的git fetch,对吗?但事实似乎并非如此。

所以我正在寻找的是一些描述观察到的git pull行为的明确文档。 (我知道我可能也会提出很多建议来切换到git fetchgit merge;这也很好,但我对{{1}非常感兴趣}。)

3 个答案:

答案 0 :(得分:14)

我们应该把它作为副本关闭,但在此之前,让我看看是否可以挤进去。

虽然git pull确实 git fetch后跟git merge(或git rebase),但精确的区别在于在 git pull如何运行git fetch

具体做法是:

$ git pull

或:

$ git pull remote-name branch-name

运行

(或各种类似的变体),不是git fetch,不是git fetch remote-name,而是git fetch remote-name branch-name

Git version 1.8.4起,

  
      
  • git fetch origin mastergit fetch origingit fetch不同   没有更新refs/remotes/origin/master;这是一个早期的   设计决定保持远程跟踪分支的更新   可预测,但实际上,人们发现它更多   每当我们有一个时,便于机会性地更新它们   机会,当我们运行git push时,我们一直在更新它们   已经破坏了原有的可预测性&#34;反正。
  •   

换句话说,如果git pull决定运行git fetch origin master,这将更新您的存储库中的origin/master - 但只有在您没有运行Git的古老版本时 比如某些未命名的Linux发行版中包含的那些。

如果您运行git fetch origin,您将更新所有远程跟踪分支(前提是您有合理的配置,即使在所述古老版本的Git中也是默认配置)。如果您运行git fetch origin master,则只会更新origin/master,并且只有在您的Git过于荒谬时才会更新。由于git pull运行四字变体,因此它只更新一个甚至没有远程跟踪分支。

答案 1 :(得分:2)

  

我被告知(并且已经看到)如果你不首先进行git fetch,git pull的行为方式不一样。你没有得到任何远程更改。

通常情况下,这不是真的,而git pull会从遥控器中拉出状态。

  

但我在网上看到的只是git pull相当于git fetch后跟git merge。如果这是真的,

是的!

引用git-pull的手册页:

  

将来自远程存储库的更改合并到当前分支中。在默认模式下,git pull是git fetch的简写,后跟git merge FETCH_HEAD。

我认为可以解决它。

  

所以我正在寻找的是一些明确的文档

$ git help pull

答案 2 :(得分:0)

git pull是一个get get,后跟一个git merge。 (或者您可以使用--rebase选项进行rebase)。所以,你不需要做的事情就是去取得&#39; git fetch&#39;在&#39; git pull&#39;

之前

输入&#39; git help fetch&#39;和&#39; git help pull&#39;用于描述

git fetch转到指定的存储库,获取被引用的对象(通常是提交),获取它及其所有依赖对象,并将其存储在指定的远程跟踪分支中。然后你可以从那里合并或改组。 &#39; git merge origin / master&#39;或者您可以使用&#39; git checkout origin / master&#39;

查看它