git fetch コマンドは、リモートリポジトリの最新の変更をローカルに取得するためのコマンドです。
ただし 作業ブランチや作業ディレクトリのファイルは一切変更されず、リモート追跡ブランチ(origin/main など)に更新内容がダウンロードされるだけです。git fetch を実行した直後に git status や git diff を見ても、実行前と同じ内容のままであることが確認できます。
git fetchとは?なぜ使うのか
チームで開発していると、他のメンバーがリモートリポジトリに変更をプッシュしている場合があります。git fetch は、そのリモートの変更を「まずダウンロードするだけ」にして、自分の作業ブランチには影響を与えません。
これが git pull との最大の違いです。git pull はダウンロードと同時に現在のブランチへのマージも実行するため、思わぬコンフリクトが起きることがあります。git fetch なら取得後に差分を確認してから、自分のタイミングでマージできます。
リモート追跡ブランチとは
git fetch でダウンロードした情報は、リモート追跡ブランチ(例:origin/main、origin/develop)に保存されます。これはリモートの状態を反映したローカルの読み取り専用ブランチです。
# fetch前
git branch -r
# origin/main
# fetchでリモートの新しいブランチも取得される
git fetch
git branch -r
# origin/main
# origin/feature-new
リモート追跡ブランチは自動的に更新され、git log origin/main でリモートの最新コミット履歴を確認できます。作業ブランチ(main)には影響しません。図で表すと次のようになります。
fetch前
main (自分の作業ブランチ) ── commit A
origin/main (リモート追跡ブランチ) ── commit A
git fetch 実行後
main (自分の作業ブランチ) ── commit A ← 変化なし
origin/main (リモート追跡ブランチ) ── commit A ── commit B ← リモートの最新に更新
※ commit B を main に取り込むには git merge origin/main か git rebase origin/main が必要
構文(Syntax)
git fetch [リモート名] [ブランチ名]
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | すべてのリモートから更新を取得 | git fetch |
<リモート名> | 指定したリモートから取得 | git fetch origin |
<リモート> <ブランチ> | 特定ブランチのみ取得 | git fetch origin main |
--all | 登録されているすべてのリモートから取得 | git fetch --all |
--tags | タグ情報をすべて明示的に取得 | git fetch --tags |
-p, --prune | リモートで削除されたブランチをローカルからも削除 | git fetch -p |
--dry-run | 実際には取得せず更新内容を確認 | git fetch --dry-run |
実行例
すべての更新を取得
git fetch
特定リモートの更新を取得(origin指定)
git fetch origin
origin はリモートリポジトリのデフォルト名です。git fetch origin を実行すると、origin のすべてのブランチ情報がローカルのリモート追跡ブランチ(origin/main など)に反映されます。
fetch 後にリモートブランチを確認
git fetch origin
git branch -r
出力例:
origin/HEAD -> origin/main
origin/develop
origin/feature-x
origin/main
取得した変更の差分を確認するには git log や git diff を使います:
git log origin/main --oneline
git diff HEAD origin/main
特定ブランチを取得
git fetch origin develop
すべてのリモートから更新を取得
git fetch --all
タグ情報のみを取得
git fetch --tags
通常の git fetch でも到達可能なコミットに付いたタグは取得されますが、--tags を付けるとリモートに存在するすべてのタグを明示的に取得できます。リリースタグの一覧を最新化したいときに使います。
削除されたリモートブランチを整理
git fetch -p
出力例:
x [deleted] (none) -> origin/old-feature
dry-run で確認
git fetch --dry-run
出力例:
From https://github.com/user/repo
* [new branch] feature-x -> origin/feature-x
エラー例(存在しないリモート)
git fetch notfound
出力例:
fatal: 'notfound' does not appear to be a git repository
fatal: Could not read from remote repository.
git fetch と git pull・git clone・git remote update の違い
git fetch 以外にも、リモートの情報を取得・同期する操作として git pull、git clone、git remote update があります。それぞれ使う場面が異なります。
| コマンド | 動作 | 作業ブランチへの影響 |
|---|---|---|
git fetch | リモートの変更をリモート追跡ブランチに取得する | 影響なし(自動マージしない) |
git pull | git fetch + git merge を実行する | 現在のブランチにマージされる |
git clone | リモートリポジトリ全体を新規に複製する(初回のみ) | 新しい作業ディレクトリが作成される |
git remote update | 登録済みの全リモートの追跡ブランチをまとめて更新する(git fetch --allに近い) | 影響なし(自動マージしない) |
git clone は既にリポジトリを持っている場合には使いません。すでにクローン済みのリポジトリで複数リモートを一括更新したい場合は、git fetch --all と同等の git remote update が便利です。
git fetch は取得のみで作業ブランチを変更しないため、リモートの状態を確認してから手動でマージするかどうかを判断できます。予期しない変更の混入を防ぎたい場合や、チームの変更内容をレビューしてから取り込みたい場合に有効です。
# git fetch の場合:取得後に手動でマージ
git fetch origin
git merge origin/main
# git pull の場合:取得+マージを一括実行(上記と同等)
git pull origin main
詳細は git pull – リモートの変更を取得して統合するコマンド も参照してください。
fetch後の典型的なワークフロー
git fetch した後は、差分を確認してからマージまたはリベースで自分のブランチに取り込みます。
fetch → 差分確認 → merge
# 1. リモートの変更を取得(作業ブランチには影響しない)
git fetch origin
# 2. リモートとの差分を確認する
git log HEAD..origin/main --oneline
git diff HEAD origin/main
# 3. 問題なければマージして取り込む
git merge origin/main
fetch → 差分確認 → rebase
コミット履歴をきれいに保ちたい場合は git rebase を使います。
# 1. リモートの変更を取得
git fetch origin
# 2. リベースで取り込む(コミット履歴が一直線になる)
git rebase origin/main
リモートの新しいブランチをローカルで作業する
# fetch でリモートの新しいブランチを取得
git fetch origin
# リモートブランチを確認
git branch -r
# origin/feature-login
# ローカルブランチとして作成して切り替え
git switch -c feature-login origin/feature-login
git fetchを使うタイミング
以下の場面では git pull より git fetch を使うほうが安全です。
| 場面 | 理由 |
|---|---|
| 作業中のブランチに影響を与えたくない | fetchは作業ブランチを変更しないため安全 |
| リモートの変更内容を確認してから取り込む | 差分確認後にマージかリベースか選べる |
| 他メンバーのブランチの進捗を確認する | fetchだけでorigin/feature-xのログを見られる |
| 削除されたリモートブランチを整理したい | git fetch -p でリモート追跡ブランチも削除できる |
更新が反映されない・エラーが出るときの確認項目
git fetch を実行しても期待した変更が見当たらない場合や、エラーで失敗する場合は次の項目を順に確認します。
- リモートURLの確認:
git remote -vでfetch元のURLが想定どおりか確認する。フォークやミラーを間違えて登録しているケースがある。 - 認証エラー:SSH鍵やアクセストークンが失効・未設定だと
Permission deniedやfatal: Authentication failedになる。鍵の登録状況を確認する。 - ブランチ・リモート名の指定ミス:
git fetch origin mainのようにタイプミスがあるとcouldn't find remote refになる。git branch -rで正しい名前を確認する。 - 削除済みブランチの表示が消えない:リモート側でブランチが削除されても、fetchだけでは追跡ブランチの参照が残ることがある。
git fetch -pで整理する。 - ネットワーク・プロキシ:社内ネットワークやVPN経由だとタイムアウトすることがある。
pingやcurlでリモートホストへの疎通を確認する。 - 取得したはずの変更が見当たらない:見ているのが
mainではなくorigin/mainか確認する。fetchだけではローカルのmainは更新されないため、git log main..origin/mainで差分の有無を確認する。
関連コマンド
git pull:git fetch+git mergeを行い、作業ブランチに反映する。git push: ローカルのコミットをリモートへ送信する。git diff: fetchした変更とローカルの差分を確認する。git status: 現在のブランチ状態とリモートとの乖離を確認する。git remote: リモートリポジトリを管理する。git merge:fetchした変更を統合する。git clone: リモートリポジトリを初回に複製する。
よくある疑問(FAQ)
git fetchは何回実行しても安全か?
安全です。git fetch は読み取り専用の操作で、ローカルの作業ブランチには一切影響しません。コミットの上書きや削除もしないため、何度実行しても問題ありません。
git fetchとgit pullのどちらを使えばよいか?
作業中のブランチを安全に保ちたいなら git fetch、素早く更新を取り込みたいなら git pull を使います。チーム開発では、まず git fetch で状態を確認してからマージする方法が安全です。
git fetch後にgit mergeしないとどうなる?
リモート追跡ブランチ(origin/main など)にのみ反映されており、自分の作業ブランチには影響しません。次に git merge や git rebase を実行するまで、作業ブランチは以前の状態のままです。
origin/mainとmainの違いは?
origin/main はリモート追跡ブランチで「リモートのmainブランチの状態」を示します。main はローカルのブランチです。git fetch は origin/main を更新しますが、ローカルの main は変わりません。
備考
git fetchは安全な操作で、作業ブランチを壊す心配はありません。- 更新内容を反映するには、
git mergeまたはgit rebaseを行う必要があります。 git pullはfetchとmergeをまとめて行うため、挙動を分けて確認したいときはgit fetchを使うのが便利です。
参考
- Git公式ドキュメント: https://git-scm.com/docs/git-fetch

コメント