Git
この記事では「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 pullの違い
- 代表的なオプションと実例
- 実務でよく使われるシーンと運用例
- トラブルシューティング:fetchで遭遇しやすい問題と対策
- まとめ
git fetchとは?
git fetch は、リモートリポジトリ上の最新のコミットやブランチ情報などを ローカルにダウンロードしてくる(同期する)ためのコマンドです。取得した内容は origin/main のような「リモート追跡ブランチ」に保存されます。まだ自分の作業ブランチ(例: main)には反映されません。つまり、ローカルの履歴には影響を与えず、あくまでも「情報を取得するだけ」という点が最大の特徴です。
- 目的
- リモートリポジトリにある最新の変更点をローカルで確認する。
- タイミング
- プロジェクトを共有している場合、他の人の作業状況を定期的に把握したい時。
- メリット
- まだ自分のローカルにマージしていないため、問題が起きてもすぐにはローカルの履歴に影響が及ばない。
git fetchが重要となるケース
- チーム開発で、複数人が同時並行でコミットを行っている状況
- リモートに新しいブランチが作られたかを確認したいとき
- 自分のローカルブランチをマージする前に、リモート側の最新状況を把握しておきたいとき
git fetchの基本的な使い方
最も基本的な使い方は以下のようになります。
Git Bash
git fetch <リモート名> <ブランチ名>
ただし、リモート名やブランチ名を省略すると、既定のリモート(通常はorigin)にある、あらゆるブランチを取得してくれます。
例:
Git Bash
# originリモートの全ブランチ情報を取得
git fetch
また、fetch を実行するとブランチだけでなくタグ情報も取得されます。これにより、リモートで新しいタグが作成されていれば、ローカルにも反映されます。
Git Bash
# originリモートのmainブランチの情報のみを取得
git fetch origin main
なぜ「git fetch」だけでOKなのか?
- 一般的に作業中のリポジトリは
originという名前のリモートを使うことが多く、そのリモートとの同期をとりたいだけなら、ブランチ名も省略してgit fetchとするだけで十分です。 - もし複数のリモートを使用している場合(例:
upstreamなど)、特定のリモートだけを指定してgit fetch upstreamのように明示的に書くこともあります。
git fetchとgit pullの違い
同じようにリモートから更新を取り込むコマンドとして、git pull がよく挙げられます。しかし両者には大きな違いがあります。
| コマンド | 動作 | 推奨されるシーン |
|---|---|---|
git fetch |
リモート上の更新を 取得するだけ。ローカルブランチには反映されない。 | 一旦ローカルには影響を与えずに新しい情報を確認したいとき |
git pull |
リモート上の更新を 取得&自動的にマージする。 ※設定を変更すると「リベース」で取り込むことも可能です(既定はマージ)。 |
最新の変更をすぐにローカルブランチへ反映したい時 |
多くの場合、中級者以上になると以下のワークフローが定着してきます。
git fetchでリモートの最新情報を取ってくる- 取り込む内容を確認した上で
git mergeもしくはgit rebaseする
このフローによって、衝突が起きるかどうか、そして差分がどの程度発生しているかを事前に把握できます。そのため、「fetch → merge もしくは rebase」 というステップを分けることが推奨されることが多いです。
代表的なオプションと実例
git fetch --all:すべてのリモートを一括取得
複数のリモートを使っている場合、それぞれのリモートに対して個別に git fetch するのは手間がかかります。そこで、以下のコマンドを使うと、存在している全リモートリポジトリの更新情報を一括で取得します。
Git Bash
git fetch --all
originやupstreamなど、設定されているすべてのリモートが対象になります。
git fetch --prune:不要なリモート追跡ブランチの整理
リモートのブランチが削除された場合、ローカル側にあるリモート追跡ブランチの参照(origin/削除されたブランチなど)が残ったままになることがあります。--prune オプションを使うと、存在しなくなったリモート追跡ブランチを自動的に削除してくれます。
Git Bash
git fetch --prune
- 日々の作業で頻繁に使うブランチが多い場合は、
--pruneを定期的に行うのがおすすめです。 - Gitの設定で
fetch.pruneをtrueにする(git config --global fetch.prune true)と、自動的に常にpruneを実行するようにもできます。
git fetch -p と --prune の違い
-p は --prune の省略形です。機能は同じで、コマンドを短く打つことができます。
git fetch <リモート名> <ブランチ名>:<ローカルの参照名>:特定のブランチを別名で取得
もし特定のリモートブランチを、ローカル上の別名のブランチとして取得したい場合は、以下のように書きます。
Git Bash
git fetch origin feature/new-design:refs/remotes/origin/feature/new-design-backup
- これにより、リモート上の
origin/feature/new-designの内容を、自分のローカルにorigin/feature/new-design-backupというリモート追跡ブランチとして取得できます。 - 直接的に使う機会は多くありませんが、リモートの特定ブランチを、他のブランチ名で保存しておきたいときなどに役立つ場面があります。
実務でよく使われるシーンと運用例
ブランチのレビュー用確認
- シーン
- チームメンバーが新たにプルリクエストを作成したが、まだ自分のローカルブランチに影響を与えずに変更内容をチェックしたい。
- 手順
-
git fetchでリモートの最新情報を取得する。git checkout origin/feature/XXXのように、リモート追跡ブランチにチェックアウトしてコードを確認する。- 必要があれば、自分のブランチに対して手動でマージするかどうかを検討する。
安全なマージプロセスを確立する
- シーン
mainブランチへの直接マージの前に、他メンバーの作業との差分やコンフリクトの可能性を評価したい。- 手順
-
git fetchで最新情報を取得する。git merge origin/main(またはgit rebase origin/main) でローカルブランチを更新する。- コンフリクトがある場合は解消し、テストを行った上でプッシュする。
CI/CDパイプラインや自動化スクリプトでのfetch
- シーン
- リポジトリをクリーンチェックアウトしてビルドやテストを行う際、特定のタグやブランチのみを取得してビルド時間を短縮したい。
- 手順
-
git clone --depth=1 <リポジトリURL>などで浅いクローンを行い、対象ブランチのみを取得する。- 必要に応じて
git fetch --prune --depth=1 origin feature/XXXXとして特定のブランチの最新だけを取得する。 - ビルドやテスト後に成果物を検証する。
git fetch --depth:履歴を浅く取得する
リポジトリが大きく、履歴をすべて取得する必要がない場合は、--depth オプションで履歴を浅く取得できます。これによりダウンロード量を減らし、処理を高速化できます。
Git Bash
git fetch --depth=1 origin main
- この例では、
origin/mainブランチの直近1コミット分だけを取得します。 - 履歴をすべて見る必要がないテストやビルド環境で便利です。
トラブルシューティング:fetchで遭遇しやすい問題と対策
「特定のブランチが見えない」
- 原因
- リモートリポジトリ側でブランチが作られたばかり、もしくはプライベート設定などによりアクセス権がない。
- 対策
-
git fetch --all --pruneでローカルの参照を最新に保つ。- リモートリポジトリの権限設定が正しいかを確認。
- そもそもブランチが正しくプッシュされているか、チームメンバーに再確認。
リモートのブランチをマージしようとしたらコンフリクト
- 原因
- 他人のコミットと自分のコミットが同じファイル・同じ行近辺を修正しているため衝突。
- 対策
-
git fetchした後にマージやリベースを行い、コンフリクトファイルを手動で修正。- コンフリクト解決後、ローカルで動作確認テストを実施。
- 問題なければプッシュし、コンフリクト解消を完了させる。
fetch後にブランチ名がおかしくなっている
- 原因
- 過去に誤ったブランチ追跡設定やローカルでのリネームがあった。
- 対策
-
git branch -vvやgit remote show originで追跡関係を確認。- 不要なブランチや追跡設定を削除(
git branch -d <ブランチ名>など)。 - 新たに
git fetch --pruneで整合性を保つ。
まとめ
git fetch は、Git でのチーム開発において 「リモートの状態を安全に確認する」 上で欠かせないコマンドです。
- 初心者の方は、まず
git pullとの違いを理解し、fetchで最新情報を取得し、差分を確認してからマージする手順を身につけましょう。 - 中級者以上の方は、
--allや--prune、さらには特定ブランチの参照指定などを活用して、効率的かつクリーンにリポジトリを保ちつつ、安全なマージプロセスを確立できます。
チーム開発では、ブランチの整合性やリポジトリのクリーンアップをしっかり行うことが、スムーズなコラボレーションにつながります。git fetch を習慣化し、常に最新の状態を安全に把握することで、エラーやコンフリクトの発生を最小限に抑えて開発を進めていきましょう。