2016-05-20 6 views
5

私はこの質問に対して明確な答えを得ることはできませんでした。私があればgit pullは同じように動作しないことが言われてきた(と見ている)Git:プルとフェッチ→プル

git fetch origin 
git pull origin <mybranch> 

長い間

、及び同僚の助言で、私はこれを行ってきましたあなたはまずgit fetchをしないでください。あなたは遠隔の変更を得ることはありません。

しかし、私がオンラインで見ているのは、git pullgit fetchと等価で、その後にはgit mergeが続きます。それが本当なら、git pullにはgit fetchが含まれていて、私は明示的にgit fetchを必要としません。しかし、それはそうではないようです。

私が探しているのは、git pullの観察された動作を説明する明示的なドキュメントです。

+1

[公式文書](https://git-scm.com/docs/git-pull):リモートリポジトリからの変更を現在のブランチに組み込みます。デフォルトモードでは、 'git pull'は' git fetch'の後に 'git merge FETCH_HEAD'を省略したものです。 – PetSerAl

+0

フェッチは、ローカルリポジトリに適用される前に新しい変更を確認するのに適しています。 – SeinopSys

答えて

9

探しているものを私たちは、おそらく重複としてこれを閉じる必要がありますが、それは起こる前に、私はこの中を絞ることができれば、私は見てみましょう。

git pullながら本当にgit merge(またはgit rebase)に続いてgit fetch正確差がにあり、どのようgit pull実行git fetch。具体

$ git pull

または:

$ git pull remote-name branch-name

(または種々の類似の変異体)は、普通ではないgit fetchgit fetch remote-nameないが、git fetch remote-name branch-name走ります。

それはそのバージョン以前よりこれは、Git version 1.8.4以来、少ない違いがあります。git fetch originまたはgit fetch とは異なり

  • git fetch origin masterrefs/remotes/origin/masterを更新しませんでした。これは初期の の意思決定で、リモートトラッキングブランチのアップデートを維持することを約束しました。実際には チャンスがあればいつでも便宜的にアップデートすることが便利です。いずれにしても、git push が既に元の「予測可能性」を破っています。言い換えれば

git pullgit fetch origin masterを実行することを決定した場合、これはあなたがそのような特定の無名のLinuxディストリビューションに含まれるものとして、Gitのの古代のバージョンを実行していない場合にのみ、あなたのリポジトリが、origin/masterを更新します。

git fetch originを実行すると、すべてリモートトラッキングブランチが更新されます(妥当な設定であれば、古くなったGitの場合でもデフォルトです)。 git fetch origin masterを実行した場合、origin/masterが更新され、Gitがあまりにも馬鹿げて古くなっていない場合にのみ再度表示されます。 git pullは4ワードのバリアントを実行するため、リモート追跡ブランチを1つだけ更新するか、または更新しません。

+0

これはそうかもしれません。私はまだ詳細なテストを行うための精神的なスペースを持っていませんが、これは何らかの違いを認めた最初の回答です。 –

0

gitのプルはgitのマージが続くフェッチを取得されます。(それはあまりにも大丈夫ですが、私はgit pull本当に興味が私はおそらくもgit mergegit fetchに切り替えるアドバイスの多くを得るでしょう知っています。)。 (または、--rebaseオプションでリベースすることもできます)。だから、何あなたが取得する、という名前のリポジトリに行く

gitのフェッチの記述のための「gitのプル」

型「gitのフェッチを助ける」と「gitのヘルププル」の前に「gitのフェッチ」を行う必要がありません。参照されているオブジェクト(一般的にはコミット)を取得し、それをすべて取得し、そのオブジェクトを名前付きリモート追跡ブランチに格納します。そこからマージまたはリベースすることができます。 'git merge origin/master'または 'git checkout origin/master'で表示することができます。

2

git pullは同じ方法で動作しないと言われています最初にgit fetchを実行します。あなたは遠隔の変更を得ることはありません。

通常、それは真実ではなく、git pullはリモートから状態を取得します。

しかし、私がオンラインで見るのは、git pullがgit fetchとgit mergeの後に相当するということだけです。それが本当なら、

です! git-pullのマニュアルページを引用

は、現在のブランチにリモートリポジトリから変更を組み込みます。デフォルトモードでは、git pullはgit fetchに続いてgit merge FETCH_HEADを省略したものです。

それは落ち着くと思います。

私はいくつかの明示的な文書である

$ git help pull 
+0

はい、表示されますが、_does_の動作が異なります。私は一日中それを複製することができます。それは私が混乱していることです。 –

+0

どうやって違うのですか? – Gregg

+0

@JohnAlexanderあなたのトラッキング設定はどうですか? 'git branch -avv'が表示されます。たぶんあなたの追跡関係は、ここの人々が期待しているようには見えません。 –