web-dev-qa-db-ja.com

git merge Origin / masterとgit pullの違い

私はローカルブランチ「BDD-local」に取り組んでおり、他の開発者から変更を取得したいと思っています。他の開発者は独自のブランチを使用しており、ユニットテストに満足したら、変更をリモートリポジトリ(Origin/master)にプッシュします。

ここでいくつかの投稿を行って、矛盾する情報を得ていました。使用について話す人はほとんどいません。

git fetch Origin
git merge Origin/master

「git pull」で変更を取得する必要があると考える人もいます。

開発者の1人が、「git fetch」なしで「git merge Origin/master」を使用するように要求しました

誰がこれらのオプションのどれが優れているか知っていますか?ローカルブランチで「git pull」を試しましたが、うまくいかないようです。しかし、ローカルマスターで「git pull」を行うと、うまく動作します(ただし、ローカルブランチで動作するようにしたい)

42
vijay pujar

フェッチ、マージ、プル

git fetchおよびgit merge Origin/masterは、リモートの変更を取得して統合します。一般的なシナリオを説明しましょう。 Origin/masterはCにあります。誰かがDをプッシュしました。E&Fで作業しました。git fetchを実行するまで、ローカルリポジトリにDは表示されません。

   Origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

次に、git fetchを実行します。これで、Dが表示され、Origin/masterが更新されて、追跡しているリモートリポジトリに一致します。

A-B-C-E-F < master
     \
      D < Origin/master, master on remote

ここでgit mergeを実行して、これを与えます:

A-B-C-E-F
     \   \
      D---G < master
      ^
    Origin/master, master on remote

マスター(E、F)の変更をOrigin/master(D)の新しいコミットに統合しました。

git pullは、上記の手順の単なるショートカットです。

フェッチせずにgit merge

git merge Origin/masterなしでgit fetchを実行しても意味がありません。 git fetchがない場合、ローカルリポジトリはリモートリポジトリの潜在的な変更を認識せず、Origin/masterは移動しません。したがって、Dはリモートにのみ存在し、ローカルには存在しないこの状態になります。

   Origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

ローカルリポジトリにはDがないため、git merge Origin/masterは次のようになります。

Already up-to-date.

なぜなら、ローカルリポジトリに関する限り、masterはすでにOrigin/masterにすべてを持っているからです。

何がベスト?

上記のどれでもない。 :)

git fetch
git rebase Origin/master master

またはショートカットgit pull -rですが、個人的には、リベースする前に変更を確認することを好みます。
これにより、Origin/master(D)の上位にあるmaster(E、F)の変更が、不自然なマージコミットなしでリプレイされます。結果は次のとおりです。

A-B-C-D-E'-F' < master
      ^
   Origin/master, master on remote

すべてが一列に並んでおり、プッシュする準備ができていることに注意してください。履歴は友情のブレスレットのようには見えません。

1つの警告-すでにプッシュされたコミットをリベースしないでください。 E&Fはリベース後にE '&F'になったことに注意してください。コミットは完全に書き直され、新しいSHAおよびすべて。既に公開されているコミットをリベースすると、開発者はプル時に履歴が書き直されます。それはひどく、誰もがあなたに邪悪な目を与え、あなたを避けます。

70
Mike Monkiewicz

git pullgit fetch + git mergeと同じです

コマンド

git pull <remote> <branch>

本当にちょうど同じです

git fetch <remote>
git merge <remote>/<branch>

したがって、実際的な違いはありません

git pull Origin master

そして

git fetch Origin
git merge Origin/master

ドキュメンテーション

公式のLinuxカーネルgit pullドキュメント に記載されているとおり:

デフォルトモードでは、git pullgit fetchの省略形であり、その後にgit mergeFETCH_HEADが続きます。

より正確には、git pullは、指定されたパラメーターと呼び出しでgit fetchを実行しますgit merge取得したブランチヘッドを現在のブランチにマージします。

推奨読書

47
user456814

git pullgit fetchを実行し、次にgit mergeを実行します。実行するリモートリポジトリでローカルリポジトリを高速化する場合。

git fetchは、コミットせずにリモートリポジトリからコミットをインポートするため、統合する前に確認することができます。

6
Peter Foti