1. ホーム
  2. 記事一覧
  3. 実は便利なGitコマンドgit fetchとは?git pullとの関係もあわせて解説!

2024.05.04

実は便利なGitコマンドgit fetchとは?git pullとの関係もあわせて解説!

はじめに

アプリ開発において「Git」は必須スキルとなってきます。Gitには様々なコマンドがあり、それらを使いこなすことで、開発作業の安全性の向上と効率化を図ることができます。基本コマンドは使い慣れているけれど、その他のコマンドは使ったことがない、Gitの知識を広げたいと思っている方向けに、今回は「git fetch」を解説します。あまり馴染みのないコマンドかもしれませんが、実はgit pullと関係のあるコマンドです。

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

git fetch」の解説の前に、まずはGitのリポジトリの種類と構造について学びましょう。

Gitのリポジトリの種類について

Gitシステムにおけるリポジトリには、リモートリポジトリとローカルリポジトリの2種類があります。

  • リモートリポジトリ

    ネットワーク上のサーバーや社内サーバーで運用されるリポジトリで、チームメンバー間でファイルやディレクトリを共有するために使用されます。

    ※この記事でのリモートリポジトリはGitHubを利用している想定で解説します。

  • ローカルリポジトリ

    個々のユーザーのPC環境(ローカル環境)に存在するリポジトリで、個人の開発作業スペースとして使用されます。

ローカルリポジトリの構造について

リポジトリとは、ファイルやディレクトリの状態を保存する場所です。コードの変更履歴を保存し、必要な時にアクセスして履歴を追えるようにする場所でもあります。

ローカルリポジトリには、以下の要素があります。

  • ワークツリー

    ユーザーが実際にファイルの編集や作業を行なうローカルリポジトリのディレクトリです。

  • インデックス

    リポジトリに保存されている情報とワークツリーとの変更履歴を記録する場所です。次に行う、コミットのための変更を一時的に記録するためのエリアです。

  • ローカルブランチ

    ローカルリポジトリで管理されているブランチです。

  • リモート追跡ブランチ

    リモートブランチの状態を追跡するブランチです。

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

リモートリポジトリの状態を保持する参照です。参照とはリモートリポジトリの最新のコミットを指し示すためのポインタです。ポインタがあることで特定のコミットの履歴を追えたり、最新のブランチがどの様な状態かを知ることができます。

リモート追跡ブランチは、それぞれのリモートブランチの更新履歴を追跡します。

「git fetch」について

git fetchは、リモートリポジトリの最新の履歴を取得し、そのデータをローカルのリモート追跡ブランチに反映させるコマンドです。ローカルブランチには取得したデータは反映されません。これに対して、git pullはリモートリポジトリの最新の履歴を取得し、そのデータはローカルブランチにマージされます。

リモートブランチの最新の変更を確認したいが、ローカルブランチにマージしたくない場合にはgit fetchが便利です。git fetchを実行すると、リモートリポジトリの全てのブランチを参照できるようになり、ローカルでリモートブランチの内容を確認したり、必要に応じて特定のブランチを手動でマージすることが可能になります。

リモートリポジトリから取得した最新の状態をローカルブランチに反映させたい場合は、git mergeを使用する必要があります。git fetchでリモートの変更を取得した後にgit mergeを実行することで、git pullを使用したときと同じ結果になります。

git pullを実行すると、内部的にはまずgit fetchが呼び出され、次にgit mergeが実行されます。この記事の冒頭で触れたgit fetchgit pullの関係がここにあります。このように、git fetchgit pullの関係性を理解することは、Gitの操作をより柔軟に扱う上で重要です。

「git fetch」の使い方

リモートリポジトリの最新の状態をローカルのリモート追跡ブランチへ取り込みます。

git fetch

git fetchの実行結果です。リモートリポジトリにあるfeature#2feature#3のブランチの最新履歴を取得し、ローカルリポジトリにそれぞれのリモート追跡ブランチが作成されました。

git fetch
From github.com:sample-remote/sample-repository
 * [new branch]      feature#2  -> origin/feature#2
 * [new branch]      feature#3  -> origin/feature#3

「git fetch」コマンドの開発現場での活用例

  • 最新の変更を取得

    プロジェクトの最新の変更を確認したいがローカルブランチにマージしたくない場合、git fetchを使用し、リモート追跡ブランチに最新の状態を取り込みます。これにより、ローカルブランチにマージすることなく、リモートリポジトリの状態をローカルで確認する事ができます。

  • 特定のブランチの変更を取得

    作業中にブランチ以外に状態を確認したいリモートブランチがある場合、そのブランチの最新の変更を取得するためにgit fetchが使用されます。例えば、特定のブランチの最新の変更を取得したい場合は、ブランチを指定する事で可能になります。コマンド内容は「オプション紹介セクション:オプション <remote> <branch> 」で説明します。

  • リモートリポジトリの変更をローカルブランチにマージする前の確認

    リモートリポジトリの変更をローカルで作業中のブランチに統合したい場合、マージ作業前にgit fetchでリモートの最新状態をローカルで取得します。そして、変更を確認し問題が無いことを確かめてからマージすることができます。この2段階のアプローチで、安全にローカルブランチへ最新の状態を反映する事ができます。

  • プルリクエストの最新状態を確認

    チームメンバーのプルリクエストを更新した場合、その最新状態をローカルで確認するためにgit fetchを使用して、対象のリモートブランチの最新コミットを取得することができます。これにより、ローカルで対象のブランチの状態を確認することができます。以下のコマンドで対象の最新コミットを取得します。

    git fetch origin pull/ID/head:BRANCHNAME

    IDはプルリクエストのID、BRANCHNAMEはローカルで作成する新しいブランチの名前を指定します。

「git fetch」のオプション紹介

項目説明
<remote> <branch>指定したリモートリポジトリの特定のブランチの履歴のみをfetchする
--prune, -p不要なリモート追跡ブランチを削除する
--tags, -tリモートリポジトリの新しいタグをすべて取得する
--dry-runリモートリポジトリから何がfetchされるかを、実際のデータ取得前に確認できる

<remote> <branch>

指定したリモートリポジトリの特定のブランチのみをfetchします。

git fetch <リモートリポジトリ名> <リモートリポジトリブランチ名>と指定する事で特定のブランチの最新の状態を取得します。

git fetch origin feature#2

git fetch origin feature#2を実行した結果です。指定したfeature#2ブランチをローカルリポジトリにfetchし、リモート追跡ブランチが作成されました。

git fetch origin feature#2
From github.com:sample-remote/sample-repository
 * branch            feature#2  -> FETCH_HEAD
 * [new branch]      feature#2  -> origin/feature#2

--prune, -p

リモートリポジトリで削除されたブランチをローカルリポジトリからも削除します。不要になったリモート追跡ブランチをクリーンアップするのに便利です。

git fetch --prune または -p

こちらは現在のリモートリポジトリの状態です。feature#2ブランチが削除されました。

git ls-remote
From github.com:sample-remote/sample-repository
6fbf0c42a5a1f92d9fe857edd61ca1fe434f58c0        HEAD
0a894d5f30b786a5fcc5c500b834a66e22156973        refs/heads/feature#1
6fbf0c42a5a1f92d9fe857edd61ca1fe434f58c0        refs/heads/main

ローカルリポジトリの現在の状態です。feature#2のリモート追跡ブランチが残っています。

git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/feature#1
  remotes/origin/feature#2
  remotes/origin/main

git fetch --pruneを実行した結果です。origin/feature#2のリモート追跡ブランチが削除されました。

git fetch --prune
From github.com:sample-remote/sample-repository
 - [deleted]         (none)     -> origin/feature#2
 git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/feature#1
  remotes/origin/main

--tags, -t

リモートリポジトリの新しいタグをすべて取得します。リリースやバージョンタグをローカルリポジトリで追跡する際に使用します。

git fetch --tags または -t

リモートリポジトリには以下の2つのタグがあります。

git fetch --tagsを実行後、ローカルリポジトリのタグを確認した結果です。ローカルにリモートリポジトリにあるタグが取得できました。

git tag
v1.0.0
v1.0.1

--dry-run

リモート追跡ブランチには変更を適用せずリモートリポジトリから何がfetchされるかを、データ取得前に確認することができます。fetchを実際に実行する前に、どのような変更が行われるかを確認したいときに使用されます。

git fetch --dry-run

git fetch --dry-runを実行した結果です。リモートリポジトリから新しいブランチfeature#2がfetchされるという事が確認できます。

git fetch --dry-run
From github.com:sample-remote/sample-repository
 * [new branch]      feature#2  -> origin/feature#2

git fetch --dry-runを実行した後に、ローカルリポジトリのブランチを確認した結果です。feature#2のリモート追跡ブランチは作成されてません。git fetch --dry-runはfetchをすると何のアクションが発生するかを確認するだけということが分かります。

git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/feature#1
  remotes/origin/main

この記事で学んだこと

この記事を通じて、「git fetch」に関連するさまざまな知識を得ることができました。簡単に振り返ってみましょう。

「git fetch」について

git fetchは、リモートリポジトリの最新の履歴を取得し、そのデータをローカルのリモート追跡ブランチに反映させるコマンドです。ローカルブランチには取得したデータは反映されないため、ローカルブランチにマージせずにリモートリポジトリの最新の変更を確認したい場合に便利です。

「git fetch」と「git pull」の関係性

git fetchはローカルのリモート追跡ブランチに取得したデータを反映しますが、取得したデータをローカルブランチに反映するにはgit mergeが必要になります。対してgit pullは取得したデータを直接ローカルブランチにマージします。

git pullを実行すると、内部的にはまずgit fetchが呼び出され、次にgit mergeが実行されます。このようなgit fetchgit pullの関係性がありました。

リモート追跡ブランチについて

リモート追跡ブランチは、リモートリポジトリの状態を反映する参照です。リモートの最新の状態をローカルに保持できることで、リモートの状況を確認しながら安全に開発を進めることが可能になります。

この記事では、「git fetch」の基本から実際の利用法に至るまで、その活用法を詳しく解説してきました。

ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事