はじめに
アプリ開発において「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 fetch
とgit pull
の関係がここにあります。このように、git fetch
とgit pull
の関係性を理解することは、Gitの操作をより柔軟に扱う上で重要です。
「git fetch」の使い方
リモートリポジトリの最新の状態をローカルのリモート追跡ブランチへ取り込みます。
git fetch
git fetch
の実行結果です。リモートリポジトリにあるfeature#2
とfeature#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 fetch
とgit pull
の関係性がありました。
リモート追跡ブランチについて
リモート追跡ブランチは、リモートリポジトリの状態を反映する参照です。リモートの最新の状態をローカルに保持できることで、リモートの状況を確認しながら安全に開発を進めることが可能になります。
この記事では、「git fetch」の基本から実際の利用法に至るまで、その活用法を詳しく解説してきました。
ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.04.08
git stashで何ができる? 一時退避の使い方を徹底解説
git stashを使えば、作業中の変更を一時的に退避させ、クリーンな作業状態に戻ることができます。開発者は柔軟にタスク間を移動でき、作業の効率が高まります。
- git
2024.05.08
リリース管理に欠かせない!コミットにタグを付ける「git tag」コマンドの使い方
アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また特定のコミットに普遍的な目印をつけたい!や、リリースバージョンを管理したい!という方向けに、この記事では「git tag」について解説します。
- git
2023.11.26
gitのコミット履歴を整理するためにsquashを使いこなそう
Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。
- インフラエンジニア
- git