🔖

git pull と fetch・merge の違い:混乱しやすいポイントを解説

に公開

はじめに

Gitで作業していると、git pull を使うことが多いと思います。
でも、こんな疑問を抱いたことはありませんか?

「pull したらエラーになった。fetchと何が違うのか?」

自分自身も最初は完全に混乱していました。
pullさえしておけば大丈夫だと思い込んでいた結果、
コンフリクトが発生してコードの整合性が損なわれる状況に陥りました。

この記事では、git pullに加えて、fetchmerge の違いについて解説していきます。

git pullfetchmerge の違い

コマンド 何をしているか? 特徴・ポイント
git fetch リモートの変更を取得(ローカルに反映はしない) まずは状況把握:「様子を見に行く」
git merge ローカルに取り込む 自分のタイミングで実行できる安心感
git pull fetch → merge を一括実行 自動で進む分、注意が必要

つまり、pullは便利ですが、裏で何が起きているか知らないと怖いのです。

なぜ git pull でコンフリクトが起きるのか?

git pull は便利なコマンドですが、使い方によっては思わぬコンフリクトを引き起こすことがあります。
特に注意したいのが、「同じブランチを複数人で作業している場合」です。

※本来は1つのブランチを複数人で同時に触るのは避けるのが望ましいですが、
 運用や事情によってはそうせざるを得ないこともあります。

ありがちなコンフリクト発生場面

実際にチーム開発で以下のような状況だったとします。

  • あなたは feature/update-greeting ブランチで作業中
  • 同じブランチで、別のメンバーが別の内容を変更して push 済み
  • あなたはそれに気づかず、自分のローカル変更を保持したまま git pull を実行

このとき、Gitは自動的にfetchmergeを同時に実行します。
その結果、ローカルとリモートの変更がバッティングし、マージコンフリクトが発生するのです。

コード例:よくあるコンフリクトシナリオ

以下のような main.py があったとします。

# main.py(初期状態)
def greet():
    print("Hello!")

あなたは feature/update-greeting ブランチで次のように変更しました。

# main.py(ローカル)
def greet():
    print("Hello, world!")

一方で、チームメンバーが同じfeature/update-greeting ブランチ上で、
次のような変更をリモートにpushしていました。

# main.py(リモート)
def greet():
    print("Hi!")

この状態で、あなたが git pull origin feature/update-greeting を実行すると、

$ git pull origin feature/update-greeting
Auto-merging main.py
CONFLICT (content): Merge conflict in main.py
Automatic merge failed; fix conflicts and then commit the result.

⚠️ マージコンフリクト発生

Git は同じ行に対して別々の変更があると、
「どちらを正とすべきか」が判断できず、手動での解決を求めてきます。

対処方法

エディタでファイルを開くと、以下のような表示になります。

<<<<<<< HEAD
def greet():
    print("Hello, world!")
=======
def greet():
    print("Hi!")
>>>>>>> origin/feature/update-greeting

この中から自分の意図した内容だけを残して保存し、次のコマンドで解決します。

git add main.py
git commit

安全に進めるには

慣れないうちは、以下のように手順を分けて実行するのがおすすめです。

git fetch
git diff origin/feature/update-greeting
git merge origin/feature/update-greeting
  • fetch:まずはリモートの状況を確認
  • diff:差分をチェック
  • merge:自分のタイミングでマージ

これで「どこが変わったのか」を確認してからマージできるので、
トラブルを未然に防ぎやすくなります

まとめ

  • git pullは「fetchしてmergeする」という一括コマンド
  • 確認せずにマージするので、コンフリクトの原因になることも
  • 慣れないうちは fetch → diff → merge の3ステップがおすすめ

Gitは慣れるまでは難しいですが、ひとつずつ理解すれば怖くありません。

本記事が一助となれば幸いです。

Discussion