「git pullとgit fetch、どっちを使えばいいの?」 「pullしたらコンフリクトが起きて大変なことに…」 「fetchって何のためにあるの?pullだけじゃダメ?」
GitHubやGitLabから最新のコードを取得する時、pullとfetchの2つのコマンドがあって混乱しますよね。実は、この2つには決定的な違いがあり、使い分けることで安全にコードを管理できるんです。
簡単に言うと、fetchは「見るだけ」、pullは「見て、すぐマージ」。この違いを理解すれば、チーム開発でのトラブルが激減します。
この記事では、pullとfetchの違いを完全に理解できるよう解説します。もうコンフリクトに怯える必要はありません!
一言で言うと:fetchは安全、pullは便利

超簡単な違い
git fetch = ダウンロードだけ(安全)
- リモートの変更を取得
- ローカルのコードは変更しない
- 確認してからマージできる
git pull = ダウンロード + マージ(便利だけど注意)
- リモートの変更を取得
- 自動的にローカルにマージ
- 一発で最新化できるが、コンフリクトのリスク
レストランのメニューで例えると
fetch:
- メニューを見せてもらう(確認)
- 気に入ったら注文する(マージ)
- 嫌なら注文しない(マージしない)
pull:
- 「おまかせで!」と注文
- 自動的に料理が出てくる
- 嫌いな食材が入ってても食べるしかない
git fetchの詳細解説
fetchの動作を図解
【fetch実行前】
リモート (origin/main) ローカル (main)
A---B---C A---B
↑ ↑
最新コミット 現在の位置
【fetch実行後】
リモート (origin/main) ローカル
A---B---C A---B (main)
↑ ↑
取得済み 変更なし
A---B---C (origin/main)
↑
取得した内容(未マージ)
fetchの基本的な使い方
すべてのブランチを取得:
git fetch
特定のリモートから取得:
git fetch origin
特定のブランチだけ取得:
git fetch origin main
タグも含めて取得:
git fetch --tags
fetch後の確認方法
取得した内容を確認:
# ログで差分を確認
git log HEAD..origin/main
# より詳細な差分
git diff HEAD origin/main
# ファイル一覧だけ見る
git diff --name-only HEAD origin/main
# 統計情報を見る
git diff --stat HEAD origin/main
fetchのメリット・デメリット
メリット:
- ✅ 安全(ローカルを壊さない)
- ✅ 確認してからマージできる
- ✅ 複数ブランチの状態を一度に取得
- ✅ コンフリクトのリスクなし
デメリット:
- ❌ 手順が1つ多い
- ❌ マージを忘れる可能性
- ❌ 初心者には分かりにくい
git pullの詳細解説
pullの動作を図解
【pull実行前】
リモート (origin/main) ローカル (main)
A---B---C A---B---D
↑ ↑
最新コミット ローカル変更
【pull実行後(成功)】
リモート (origin/main) ローカル (main)
A---B---C A---B---D---M
↑
マージコミット
(CとDを統合)
【pull実行後(コンフリクト)】
CONFLICT! 手動解決が必要
pullの基本的な使い方
基本のpull:
git pull
特定のリモート・ブランチから:
git pull origin main
リベースでpull(履歴をきれいに):
git pull --rebase
強制的にリモートで上書き:
git pull --force
# または
git fetch origin
git reset --hard origin/main # 危険!
pullの内部動作
pullは2つのコマンドの組み合わせ:
git pull = git fetch + git merge
# つまり、以下と同じ
git fetch origin main
git merge origin/main
pullのメリット・デメリット
メリット:
- ✅ 1コマンドで完了
- ✅ 簡単で直感的
- ✅ すぐに最新版で作業開始
デメリット:
- ❌ コンフリクトが突然発生
- ❌ 予期しない変更が入る可能性
- ❌ マージコミットで履歴が汚れる
使い分けの基準

こんな時はfetch
安全重視の場面:
- 本番環境のコード更新
- 大規模な変更が予想される時
- 他の人の作業を確認したい時
- コンフリクトが心配な時
複数ブランチを扱う時:
# すべてのブランチの状態を取得
git fetch --all
# 状態を確認
git branch -vv
# 必要なものだけマージ
git merge origin/feature-x
こんな時はpull
スピード重視の場面:
- 個人開発
- 小さな変更の取り込み
- 自分しか触らないブランチ
- masterから最新を取り込む時
朝一番の定型作業:
# 朝のルーティン
git pull origin main
git checkout -b feature/today-work
チーム開発での推奨パターン
安全なワークフロー:
# 1. まずfetchで確認
git fetch origin
# 2. 差分を確認
git log HEAD..origin/main --oneline
# 3. 問題なければマージ
git merge origin/main
# または、問題があれば準備してからマージ
git stash # 作業を退避
git merge origin/main
git stash pop # 作業を戻す
実践的な使用例
シナリオ1:朝一番の作業開始
fetchを使った安全な方法:
# 1. リモートの状態を取得
git fetch origin
# 2. 更新内容を確認
git log main..origin/main --oneline
# 3. 自分の作業を確認
git status
# 4. 問題なければマージ
git merge origin/main
pullを使った高速な方法:
# すぐに最新化(自分だけのブランチなら)
git pull origin main
シナリオ2:プルリクエスト前の最新化
# feature/my-featureで作業中
git checkout feature/my-feature
# 方法1: fetch & merge(推奨)
git fetch origin
git merge origin/main
# 方法2: pull --rebase(履歴をきれいに)
git pull --rebase origin main
シナリオ3:他の人のブランチを確認
# fetchで全ブランチ取得
git fetch --all
# リモートブランチ一覧
git branch -r
# 特定のブランチを確認(チェックアウトせずに)
git log origin/feature/colleague-work
# 必要ならローカルにチェックアウト
git checkout -b colleague-work origin/feature/colleague-work
pullとfetchのオプション詳解
fetchの便利なオプション
# すべてのリモートから取得
git fetch --all
# 削除されたリモートブランチも反映
git fetch --prune
# または
git fetch -p
# 浅いクローンを深くする
git fetch --depth=10
# ドライラン(実行せずに確認)
git fetch --dry-run
# 強制的に更新
git fetch --force
pullの便利なオプション
# リベースでpull(マージコミットを作らない)
git pull --rebase
# 自動スタッシュ(作業を自動退避)
git pull --autostash
# Fast-forwardのみ許可(マージコミット禁止)
git pull --ff-only
# 詳細な情報を表示
git pull --verbose
# タグも一緒に取得
git pull --tags
コンフリクトが起きた時の対処法
pull時のコンフリクト
# pullでコンフリクト発生
$ git pull origin main
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
# 1. 状態確認
git status
# 2. コンフリクトファイルを編集
# <<<<<<< HEAD
# 自分の変更
# =======
# リモートの変更
# >>>>>>> origin/main
# 3. 解決後、add
git add file.txt
# 4. コミット
git commit -m "Resolve conflict"
fetchなら事前に回避可能
# 1. fetchで取得
git fetch origin
# 2. 差分を確認
git diff main origin/main
# 3. コンフリクトしそうな箇所を発見!
# 4. 事前に調整してからマージ
# - 作業を整理
# - 必要ならチームメンバーと相談
# - 準備ができたらマージ
設定とカスタマイズ
pull戦略の設定
# デフォルトをrebaseに設定
git config --global pull.rebase true
# 特定のリポジトリだけ
git config pull.rebase false
# Fast-forwardのみに制限
git config --global pull.ff only
fetchの自動化
# 定期的にfetchするエイリアス
git config --global alias.f 'fetch --all --prune'
# 使い方
git f
便利なエイリアス設定
# よく使うコマンドをエイリアスに
git config --global alias.pf 'pull --ff-only'
git config --global alias.pr 'pull --rebase'
git config --global alias.fa 'fetch --all'
git config --global alias.sync '!git fetch --all --prune && git merge --ff-only origin/main'
VSCodeでのfetchとpull

GUI操作
VSCodeでfetch:
- ソース管理パネル(Ctrl + Shift + G)
- 「…」メニュー
- 「フェッチ」を選択
VSCodeでpull:
- ソース管理パネル
- 「…」メニュー
- 「プル」を選択
同期ボタンの動作
VSCodeの同期ボタン(🔄)は:
git pull
+git push
を実行- 便利だが、コンフリクトのリスクあり
- 設定で動作をカスタマイズ可能
よくある質問
Q1:fetchしたけど何も変わらない
A: fetchは取得だけです。マージが必要:
# fetchした内容を確認
git log HEAD..origin/main
# マージする
git merge origin/main
Q2:pull –rebaseと普通のpullの違いは?
A: 履歴の作り方が違います:
- 通常のpull:マージコミットを作成
- pull –rebase:コミットを積み上げ直す(履歴が一直線)
# マージ(デフォルト)
A---B---C---M (マージコミット)
\ /
D---E
# リベース
A---B---C---D'---E' (一直線)
Q3:fetchは何回やっても大丈夫?
A: はい!fetchは何回実行しても安全です。最新の状態を取得するだけで、ローカルに影響しません。
Q4:間違ってpullしてしまった
A: 元に戻せます:
# 直前の状態に戻す
git reset --hard HEAD@{1}
# または、reflogで確認してから
git reflog
git reset --hard <commit-hash>
Q5:fetchとpullどっちが推奨?
A: 状況によりますが、安全性重視ならfetch + merge:
- 個人開発:pullでOK
- チーム開発:fetch → 確認 → merge
- 初心者:fetchから始めることを推奨
ベストプラクティス
朝のルーティン
# 推奨される朝の作業フロー
# 1. 昨日の作業を確認
git status
# 2. リモートの更新を取得
git fetch --all --prune
# 3. mainブランチを更新
git checkout main
git merge --ff-only origin/main
# 4. 作業ブランチに戻る
git checkout feature/my-work
# 5. 必要ならmainの変更を取り込む
git merge main
プルリクエスト前
# PRを出す前の最新化
git fetch origin
git rebase origin/main # 履歴をきれいに
# コンフリクトがあれば解決
git push --force-with-lease origin feature/my-branch
金曜日の終業前
# 週末前の整理
git fetch --all --prune # 最新を取得
git branch -vv # ブランチの状態確認
git stash list # 退避した作業の確認
まとめ
git fetchとgit pullの違い、しっかり理解できましたか?
覚えておくべき3つのポイント:
- 🟢 fetch = 安全
- 取得だけ、確認してからマージ
- コンフリクトのリスクなし
- 🔵 pull = fetch + merge
- 便利だけど自動マージに注意
- コンフリクトの可能性あり
- 🟡 使い分けが大事
- 不安ならfetch
- 確実ならpull
- チーム開発はfetch推奨
初心者へのアドバイス: 最初はfetchを使う癖をつけましょう。慣れてきたら、状況に応じてpullも使い分ける。これが安全なGit生活の第一歩です。
「とりあえずpull」は危険です。「まずfetchで確認」を習慣にすれば、チーム開発でのトラブルが激減します。
今日からfetch派になって、安全なGitライフを送りましょう!
コメント