Git

Git fetch is a command that retrieves the latest information from a remote repository without reflecting it in your local environment, allowing you to check it first.

git fetch

git fetchとは?

git fetch は、リモートリポジトリ上の最新のコミットやブランチ情報などを ローカルにダウンロードしてくる(同期する)ためのコマンドです。ダウンロードしただけで、ローカルブランチにはまだマージされません。つまり、ローカルの履歴には影響を与えず、あくまでも「情報を取得するだけ」という点が最大の特徴です。

目的
リモートリポジトリにある最新の変更点をローカルで確認する。
タイミング
プロジェクトを共有している場合、他の人の作業状況を定期的に把握したい時。
メリット
まだ自分のローカルにマージしていないため、問題が起きてもすぐにはローカルの履歴に影響が及ばない。

git fetchが重要となるケース

git fetchの基本的な使い方

最も基本的な使い方は以下のようになります。

Git Bash

git fetch <リモート名> <ブランチ名>

ただし、リモート名やブランチ名を省略すると、既定のリモート(通常はorigin)にある、あらゆるブランチを取得してくれます。

例:

Git Bash

# originリモートの全ブランチ情報を取得
git fetch

Git Bash

# originリモートのmainブランチの情報のみを取得
git fetch origin main

なぜ「git fetch」だけでOKなのか?

git fetchとgit pullの違い

同じようにリモートから更新を取り込むコマンドとして、git pull がよく挙げられます。しかし両者には大きな違いがあります。

コマンド 動作 推奨されるシーン
git fetch リモート上の更新を 取得するだけ。ローカルブランチには反映されない。 一旦ローカルには影響を与えずに新しい情報を確認したいとき
git pull リモート上の更新を 取得&自動的にマージ(またはリベース) する。 最新の変更をすぐにローカルブランチへ反映したい時

多くの場合、中級者以上になると以下のワークフローが定着してきます。

  1. git fetch でリモートの最新情報を取ってくる
  2. 取り込む内容を確認した上で git merge もしくは git rebase する

このフローによって、衝突が起きるかどうか、そして差分がどの程度発生しているかを事前に把握できます。そのため、「fetch → merge もしくは rebase」 というステップを分けることが推奨されることが多いです。

代表的なオプションと実例

git fetch --all:すべてのリモートを一括取得

複数のリモートを使っている場合、それぞれのリモートに対して個別に git fetch するのは手間がかかります。そこで、以下のコマンドを使うと、存在している全リモートリポジトリの更新情報を一括で取得します。

Git Bash

git fetch --all

git fetch --prune:不要なリモート追跡ブランチの整理

リモートのブランチが削除された場合、ローカル側にあるリモート追跡ブランチの参照(origin/削除されたブランチなど)が残ったままになることがあります。--prune オプションを使うと、存在しなくなったリモート追跡ブランチを自動的に削除してくれます。

Git Bash

git fetch --prune

git fetch -p と --prune の違い

-p は --prune の省略形です。機能は同じで、コマンドを短く打つことができます。

git fetch <リモート名> <ブランチ名>:<ローカルの参照名>:特定のブランチを別名で取得

もし特定のリモートブランチを、ローカル上の別名のブランチとして取得したい場合は、以下のように書きます。

Git Bash

git fetch origin feature/new-design:refs/remotes/origin/feature/new-design-backup

実務でよく使われるシーンと運用例

ブランチのレビュー用確認

シーン
チームメンバーが新たにプルリクエストを作成したが、まだ自分のローカルブランチに影響を与えずに変更内容をチェックしたい。
手順
  1. git fetch でリモートの最新情報を取得する。
  2. git checkout origin/feature/XXX のように、リモート追跡ブランチにチェックアウトしてコードを確認する。
  3. 必要があれば、自分のブランチに対して手動でマージするかどうかを検討する。

安全なマージプロセスを確立する

シーン
mainブランチへの直接マージの前に、他メンバーの作業との差分やコンフリクトの可能性を評価したい。
手順
  1. git fetch で最新情報を取得する。
  2. git merge origin/main (または git rebase origin/main) でローカルブランチを更新する。
  3. コンフリクトがある場合は解消し、テストを行った上でプッシュする。

CI/CDパイプラインや自動化スクリプトでのfetch

シーン
リポジトリをクリーンチェックアウトしてビルドやテストを行う際、特定のタグやブランチのみを取得してビルド時間を短縮したい。
手順
  1. git clone --depth=1 <リポジトリURL> などで浅いクローンを行い、対象ブランチのみを取得する。
  2. 必要に応じて git fetch --prune --depth=1 origin feature/XXXX として特定のブランチの最新だけを取得する。
  3. ビルドやテスト後に成果物を検証する。

トラブルシューティング:fetchで遭遇しやすい問題と対策

「特定のブランチが見えない」

原因
リモートリポジトリ側でブランチが作られたばかり、もしくはプライベート設定などによりアクセス権がない。
対策
  1. git fetch --all --prune でローカルの参照を最新に保つ。
  2. リモートリポジトリの権限設定が正しいかを確認。
  3. そもそもブランチが正しくプッシュされているか、チームメンバーに再確認。

リモートのブランチをマージしようとしたらコンフリクト

原因
他人のコミットと自分のコミットが同じファイル・同じ行近辺を修正しているため衝突。
対策
  1. git fetch した後にマージやリベースを行い、コンフリクトファイルを手動で修正。
  2. コンフリクト解決後、ローカルで動作確認テストを実施。
  3. 問題なければプッシュし、コンフリクト解消を完了させる。

fetch後にブランチ名がおかしくなっている

原因
過去に誤ったブランチ追跡設定やローカルでのリネームがあった。
対策
  1. git branch -vvgit remote show origin で追跡関係を確認。
  2. 不要なブランチや追跡設定を削除(git branch -d <ブランチ名> など)。
  3. 新たに git fetch --prune で整合性を保つ。

まとめ

git fetch は、Git でのチーム開発において 「リモートの状態を安全に確認する」 上で欠かせないコマンドです。

チーム開発では、ブランチの整合性やリポジトリのクリーンアップをしっかり行うことが、スムーズなコラボレーションにつながります。git fetch を習慣化し、常に最新の状態を安全に把握することで、エラーやコンフリクトの発生を最小限に抑えて開発を進めていきましょう。