私はローカルブランチ「BDD-local」に取り組んでおり、他の開発者から変更を取得したいと思っています。他の開発者は独自のブランチを使用しており、ユニットテストに満足したら、変更をリモートリポジトリ(Origin/master)にプッシュします。
ここでいくつかの投稿を行って、矛盾する情報を得ていました。使用について話す人はほとんどいません。
git fetch Origin
git merge Origin/master
「git pull」で変更を取得する必要があると考える人もいます。
開発者の1人が、「git fetch」なしで「git merge Origin/master」を使用するように要求しました
誰がこれらのオプションのどれが優れているか知っていますか?ローカルブランチで「git pull」を試しましたが、うまくいかないようです。しかし、ローカルマスターで「git pull」を行うと、うまく動作します(ただし、ローカルブランチで動作するようにしたい)
フェッチ、マージ、プル
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およびすべて。既に公開されているコミットをリベースすると、開発者はプル時に履歴が書き直されます。それはひどく、誰もがあなたに邪悪な目を与え、あなたを避けます。
git pull
はgit 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 pull
はgit fetch
の省略形であり、その後にgit merge
FETCH_HEAD
が続きます。より正確には、git pullは、指定されたパラメーターと呼び出しでgit fetchを実行しますgit merge取得したブランチヘッドを現在のブランチにマージします。
git pull
はgit fetch
を実行し、次にgit merge
を実行します。実行するリモートリポジトリでローカルリポジトリを高速化する場合。
git fetch
は、コミットせずにリモートリポジトリからコミットをインポートするため、統合する前に確認することができます。