git fetch とは?リモートの変更を安全に取得するコマンドと使い方

コマンドリファレンス

git fetch コマンドは、リモートリポジトリの最新の変更をローカルに取得するためのコマンドです。
ただし 作業ブランチや作業ディレクトリのファイルは一切変更されず、リモート追跡ブランチ(origin/main など)に更新内容がダウンロードされるだけです。git fetch を実行した直後に git statusgit diff を見ても、実行前と同じ内容のままであることが確認できます。

git fetchとは?なぜ使うのか

チームで開発していると、他のメンバーがリモートリポジトリに変更をプッシュしている場合があります。git fetch は、そのリモートの変更を「まずダウンロードするだけ」にして、自分の作業ブランチには影響を与えません。

これが git pull との最大の違いです。git pull はダウンロードと同時に現在のブランチへのマージも実行するため、思わぬコンフリクトが起きることがあります。git fetch なら取得後に差分を確認してから、自分のタイミングでマージできます。

リモート追跡ブランチとは

git fetch でダウンロードした情報は、リモート追跡ブランチ(例:origin/mainorigin/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 loggit 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 pullgit clonegit remote update があります。それぞれ使う場面が異なります。

コマンド動作作業ブランチへの影響
git fetchリモートの変更をリモート追跡ブランチに取得する影響なし(自動マージしない)
git pullgit fetchgit 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 deniedfatal: Authentication failed になる。鍵の登録状況を確認する。
  • ブランチ・リモート名の指定ミスgit fetch origin main のようにタイプミスがあると couldn't find remote ref になる。git branch -r で正しい名前を確認する。
  • 削除済みブランチの表示が消えない:リモート側でブランチが削除されても、fetchだけでは追跡ブランチの参照が残ることがある。git fetch -p で整理する。
  • ネットワーク・プロキシ:社内ネットワークやVPN経由だとタイムアウトすることがある。pingcurl でリモートホストへの疎通を確認する。
  • 取得したはずの変更が見当たらない:見ているのが main ではなく origin/main か確認する。fetchだけではローカルの main は更新されないため、git log main..origin/main で差分の有無を確認する。

関連コマンド

  • git pull : git fetchgit 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 mergegit rebase を実行するまで、作業ブランチは以前の状態のままです。

origin/mainとmainの違いは?

origin/main はリモート追跡ブランチで「リモートのmainブランチの状態」を示します。main はローカルのブランチです。git fetchorigin/main を更新しますが、ローカルの main は変わりません。

備考

  • git fetch は安全な操作で、作業ブランチを壊す心配はありません。
  • 更新内容を反映するには、git merge または git rebase を行う必要があります。
  • git pullfetchmerge をまとめて行うため、挙動を分けて確認したいときは git fetch を使うのが便利です。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント