git pullとgit fetchの違い|安全に最新コードを取得する方法

git

「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:

  1. ソース管理パネル(Ctrl + Shift + G)
  2. 「…」メニュー
  3. 「フェッチ」を選択

VSCodeでpull:

  1. ソース管理パネル
  2. 「…」メニュー
  3. 「プル」を選択

同期ボタンの動作

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つのポイント:

  1. 🟢 fetch = 安全
    • 取得だけ、確認してからマージ
    • コンフリクトのリスクなし
  2. 🔵 pull = fetch + merge
    • 便利だけど自動マージに注意
    • コンフリクトの可能性あり
  3. 🟡 使い分けが大事
    • 不安ならfetch
    • 確実ならpull
    • チーム開発はfetch推奨

初心者へのアドバイス: 最初はfetchを使う癖をつけましょう。慣れてきたら、状況に応じてpullも使い分ける。これが安全なGit生活の第一歩です。

「とりあえずpull」は危険です。「まずfetchで確認」を習慣にすれば、チーム開発でのトラブルが激減します。

今日からfetch派になって、安全なGitライフを送りましょう!

コメント

タイトルとURLをコピーしました