症状

git fetchgit pullの違いがわからず、どちらを使えばいいか迷っている

結論:まずこれを確認

  • git fetch = リモートの情報を取得するだけ(ローカルのファイルは変わらない)
  • git pull = git fetch + git merge(ローカルのファイルが変更される
  • 迷ったらgit fetchを使う(安全)

操作フロー

    flowchart TD
    A[リモートの変更を確認したい] --> B{ローカルに未コミットの変更がある?}
    B -->|Yes| C[git stash で退避]
    B -->|No| D{すぐにマージしたい?}
    C --> D
    D -->|Yes| E[git pull]
    D -->|No| F[git fetch]
    F --> G[git log origin/main で差分確認]
    G --> H{マージする?}
    H -->|Yes| I[git merge origin/main]
    H -->|No| J[作業継続]
    E --> K[完了]
    I --> K
  

よくある原因

  • fetchpullの違いを知らずにpullを使い、意図しないマージが発生した
  • fetchだけしてマージを忘れ、ローカルが古いままになっていた
  • pullしたらコンフリクトが発生してパニックになった
  • リモートの変更を確認せずにpullして、作業中のコードが上書きされた
  • fetch後にorigin/mainmainの違いを理解していなかった

操作手順

ステップ1: 現在の状態を確認する

    git status
  

🔍 チェックポイント: 未コミットの変更がある場合は、先にgit stashで退避するか、コミットしておく

ステップ2: git fetch でリモートの情報を取得する

    git fetch origin
  

このコマンドは、リモートリポジトリ(origin)の最新情報をローカルにダウンロードする。ただし、作業中のファイルは一切変更されない

🔍 チェックポイント: エラーが出なければ取得成功。ローカルのファイルは変わっていないことを確認

ステップ3: リモートとの差分を確認する

    # リモートのmainブランチのログを確認
git log origin/main

# ローカルとリモートの差分を確認
git log main..origin/main --oneline
  

🔍 チェックポイント: 差分がなければ「Already up to date」に相当する状態。差分があれば、どんな変更が来るか確認できる

ステップ4: マージするかどうかを判断する

差分を確認した上で、マージする場合:

    git merge origin/main
  

または、最初からfetchmergeを同時に行う場合(= git pull):

    git pull origin main
  

🔍 チェックポイント: コンフリクトが発生した場合は、git statusで競合ファイルを確認し、手動で解決する

ステップ5: git pull を使う場合の手順

git pullfetch + mergeを一度に行うコマンド:

    # 現在のブランチにリモートの変更をマージ
git pull

# ブランチを指定する場合
git pull origin main
  

🔍 チェックポイント: pull後にgit log --oneline -5で最新のコミットを確認し、意図した変更が取り込まれたか確認する

fetch と pull の比較表

項目 git fetch git pull
リモート情報の取得
ローカルファイルの変更 ×
マージの実行 ×
コンフリクトの可能性 ×
安全性 高い やや低い
使うタイミング 確認してからマージしたい すぐにマージしたい

NG行動

  • git pullを未コミットの変更がある状態で実行する

    • コンフリクトが発生しやすく、変更が失われる可能性がある
  • git fetchだけして満足する

    • ローカルのブランチは更新されないため、古いコードのまま作業を続けてしまう
  • 差分を確認せずにgit pullする

    • 意図しない変更がマージされ、バグの原因になることがある
  • git pull --forceを使う

    • ローカルの変更が強制的に上書きされ、データが消失する

よくある質問(FAQ)

Q1: git fetchしても何も変わらないように見えるのはなぜ?

A: git fetchはリモート追跡ブランチ(origin/mainなど)を更新するだけで、ローカルブランチ(main)は変更しない。変更を反映するにはgit merge origin/mainが必要。

Q2: git pullgit pull --rebaseの違いは?

A: git pullはマージコミットを作成する。git pull --rebaseはマージコミットを作らず、ローカルのコミットをリモートの後ろに移動する。履歴をきれいに保ちたい場合は--rebaseを使うことがある。

Q3: 「Already up to date」と表示されたのに、リモートには新しいコミットがあるようだが?

A: git fetchを先に実行していない可能性がある。git fetchでリモートの最新情報を取得してから、再度確認する。

関連するトラブル

準備中

解決しない場合