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」の基本から実際の利用法に至るまで、その活用法を詳しく解説してきました。

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

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

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

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

関連記事