はじめに
アプリ開発において「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」の基本から実際の利用法に至るまで、その活用法を詳しく解説してきました。
ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう!
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.04.28
git shortlogとは?git logとの違いを合わせて解説
この解説記事では、git shortlogについて、git logとの違いにもフォーカスを当てて説明していきます。
- git
2023.11.26
gitのコミット履歴を整理するためにsquashを使いこなそう
Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。
- インフラエンジニア
- git
2024.05.27
ソースコードにパッチファイルを適用するGitコマンド「git apply」について徹底解説!
この記事では「git apply」コマンドについて解説します。
- git