git pull と fetch・merge の違い:混乱しやすいポイントを解説
はじめに
Gitで作業していると、git pull
を使うことが多いと思います。
でも、こんな疑問を抱いたことはありませんか?
「pull したらエラーになった。fetchと何が違うのか?」
自分自身も最初は完全に混乱していました。
pull
さえしておけば大丈夫だと思い込んでいた結果、
コンフリクトが発生してコードの整合性が損なわれる状況に陥りました。
この記事では、git pull
に加えて、fetch
、merge
の違いについて解説していきます。
git pull
、fetch
、merge
の違い
コマンド | 何をしているか? | 特徴・ポイント |
---|---|---|
git fetch |
リモートの変更を取得(ローカルに反映はしない) | まずは状況把握:「様子を見に行く」 |
git merge |
ローカルに取り込む | 自分のタイミングで実行できる安心感 |
git pull |
fetch → merge を一括実行 | 自動で進む分、注意が必要 |
つまり、pull
は便利ですが、裏で何が起きているか知らないと怖いのです。
git pull
でコンフリクトが起きるのか?
なぜ git pull
は便利なコマンドですが、使い方によっては思わぬコンフリクトを引き起こすことがあります。
特に注意したいのが、「同じブランチを複数人で作業している場合」です。
※本来は1つのブランチを複数人で同時に触るのは避けるのが望ましいですが、
運用や事情によってはそうせざるを得ないこともあります。
ありがちなコンフリクト発生場面
実際にチーム開発で以下のような状況だったとします。
- あなたは
feature/update-greeting
ブランチで作業中 - 同じブランチで、別のメンバーが別の内容を変更して push 済み
- あなたはそれに気づかず、自分のローカル変更を保持したまま
git pull
を実行
このとき、Gitは自動的にfetch
とmerge
を同時に実行します。
その結果、ローカルとリモートの変更がバッティングし、マージコンフリクトが発生するのです。
コード例:よくあるコンフリクトシナリオ
以下のような 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