1. ホーム
  2. git

[解決済み] git merge origin/masterとgit pullの違いについて

2022-03-09 06:18:48

質問

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

私はここでいくつかの投稿に目を通し、相反する情報を得ました。 を使うことについて話している人はほとんどいません。

git fetch origin
git merge origin/master

他の人は、'git pull' が変更を取得するはずだと考えています。

ある開発者が、'git fetch' なしで 'git merge origin/master' を使いたいと言ってきました。

どなたか、どちらのオプションが良いかご存知の方はいらっしゃいますか?ローカルブランチで 'git pull' を試しましたが、うまくいかないようです。しかし、ローカルの master で 'git pull' を実行するとうまくいきます (ただし、ローカルブランチで動作するようにしたいのです)。

どうすればいいですか?

フェッチ、マージ、プル

git fetchgit merge origin/master は、リモートの変更を取り込み、統合します。 オリジン/マスターがCにあり、誰かがDをプッシュし、あなたはEとFで作業しました。 git fetch .

   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

これで、master (E, F) での変更と origin/master (D) での新しいコミットの統合が完了しました。

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

フェッチしない git merge

実行中 git merge origin/master を使用せずに git fetch は無意味です。 がなければ git fetch の場合、ローカルリポジトリはリモートリポジトリの変更の可能性に気付かず、オリジン/マスターは移動しません。 つまり、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 しかし、個人的には、リベースの前に変更点を確認する方が好きです。
これは、master (E, F) での変更を origin/master (D) の上で、やばいマージコミットをせずに再生します。 これは、次のような結果をもたらします。

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

すべてが1行にまとめられ、プッシュする準備ができ、履歴が友情のブレスレットのように見えないことに注目してください。

ひとつだけ警告があります。すでにプッシュされているコミットは決してリベースしないでください。 リベースの結果、E & F が E' & F' になったことに注意しましょう。 このコミットは完全に書き直され、新しい SHA も含めてすべてです。 すでに公開されているコミットをリベースすると、開発者がプルしたときに履歴が書き直されることになります。 そしてそれはひどいもので、誰もがあなたに邪悪な目を向け、あなたを敬遠するでしょう。