1. ホーム
  2. 記事一覧
  3. ソースコードにパッチファイルを適用するGitコマンド「git apply」について徹底解説!

2024.05.27

ソースコードにパッチファイルを適用するGitコマンド「git apply」について徹底解説!

アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また 特定のOSSにコントリビュートしたい! または オフラインのリポジトリへ変更を適用したい! という方向けに、この記事では「git apply」コマンドについて解説します。

GitについてはエンベーダーのLinux応用コースで詳しく学ぶことができます。

https://envader.plus/course/5/scenario/1055

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

「git apply」コマンドとは

git applyコマンドは、Gitのパッチファイルを現在のワーキングツリーに適用するためのコマンドです。パッチファイルとは、ソースコードの変更内容を記録したテキストファイルのことで、git diffコマンドやgit format-patchコマンドを使って生成することができます。

「git apply」コマンドでできること

git applyコマンドを使うことで、以下のようなことができます。

  • パッチファイルの内容を現在のワーキングツリーに適用する
  • 適用した変更を元に戻す
  • パッチファイルの適用前に、変更内容の概要を確認する

開発現場での使用例

  • オフライン環境での作業

    オフライン環境にあるソースコードなどのリポジトリに、何か別の環境で作成した変更を適用したい時があるとします。そのような場合、後ほど紹介するコマンドを用い事前にパッチファイルを作成し、git applyコマンドでその変更を取り込むことができます。また、コミットではなくワーキングツリーに変更が適用されるだけであるため、簡単にその変更を取り消したり修正したりすることができます。

  • OSSプロジェクトへの貢献

    OSS(オープンソースソフトウェア)プロジェクトにコントリビュートする際、プルリクエストを送る代わりにパッチファイルを送ることがあります。特に、メーリングリストでパッチファイルのやり取りを行っているプロジェクトでは、git applyコマンドが重要な役割を果たします。

OSSプロジェクトへのコントリビュート方法の変遷

昔は、OSSプロジェクトへのコントリビュートはメーリングリストを通じたパッチファイルのやり取りが一般的でした。開発者がパッチファイルをメールで送信し、管理者がそれをgit applyなどのコマンドでプロジェクトに取り込む方法です。現在ではGitHubやGitLabなどのプラットフォームの普及により、プルリクエストを使った方法が主流になっていますが、一部のプロジェクトではメールベースの方法が今でも使われています。

「git apply」コマンドの使用方法

git apply コマンドを実行すると、単にワーキングツリーに変更を適用します。つまり、ステージングに追加されておらず、コミットもされていない状態になります。

# 「bugfix.patch」というパッチファイルがある場合
git apply bugfix.patch

このコマンドはパッチファイルの中のすべての内容が適用可能な場合に実行され、適用する際に一部のファイルのみにエラーがあった場合でも全てのファイルに何も適用しないという動作をします。(後述の--rejectオプションを使うことで、パッチ適用可能なファイルは適用させることが可能です。)

パッチファイルの作成方法

パッチファイルの作成方法はいくつかありますが、中でもよく使われる2つのコマンドをご紹介します。

  • git diff

    このコマンドはワーキングツリーで作業した際に差分を確認することができるコマンドですが、その出力をそのままファイルに格納することでパッチファイルとして扱うことができます。パッチファイルはテキスト形式ですが、拡張子は「.patch」を用いることが一般的です。git diffコマンドについてはこちらの記事を参考にしてください。

    https://envader.plus/article/245

    # git diffの出力を「bugfix.patch」ファイルに格納
    git diff > bugfix.patch
  • git format-patch

    このコマンドはgit diffと異なり、既に作成したコミットからパッチファイルを作成することができます。コマンドに続いて数を指定することで、パッチファイルを作成する過去のコミットの数を指定します。-1であれば最新のコミットから1つのパッチファイルを、-2であれば2つのコミットからそれぞれ1つずつ2つのパッチファイルを作成します。

    ファイル名は「連番-コミットメッセージ.patch」のようになります。

    # コミットメッセージが「fix」だった場合、「0001-fix.patch」というパッチファイルが作成される
    git format-patch -1

    git diff コマンドと違う点は、コミットの情報がパッチファイルに含まれていることです。git applyコマンドでパッチファイルを適用する際はワーキングツリーに変更を適用するだけですが、git amというコマンドを使用することで、変更をコミットとして取り込むこともできます。その場合、そのパッチファイル作成時に参照されたコミットの情報、作成者やタイムスタンプ、コミットメッセージがそのまま新たなコミットとして適用されます。

    git am 0001-fix.patch

オプション

git applyコマンドの主なオプションには以下のようなものがあります。

  • --reverse
  • --reject
  • --stat
  • --check

--reverse

git applyコマンドを適用した後、その適用した変更を取り消すことができるオプションです。ここでは、「bugfix.patch」というパッチファイルを作成済みだとします。

# パッチファイルを適用する
git apply bugfix.patch

# 適用した変更を取り消す
git apply --reverse bugfix.patch

--reject

このオプションを用いることで、パッチファイル適用時にエラーが出て適用できないファイルがある場合でも、適用可能なファイルには変更が適用されます。適用できなかったファイルとそのパッチの詳細情報は「適用に失敗したファイル名.rej」というファイルに格納することができます。

# main.goファイルにパッチが適用できなかった場合、「main.go.rej」というファイルが作成される
git apply --reject bugfix.patch

--stat

パッチファイルの適用前に、変更の概要を表示することができます。そのパッチファイルが何のファイルをどの程度変更するのかを確認できます。以下は、「main.go」ファイルの1行のみを変更するパッチファイルをオプション付きで実行した場合の例です。

git apply --stat bugfix.patch

 main.go |    1 +
 1 file changed, 1 insertions(+)

--check

パッチファイルを適用する前に、エラーが出ないかどうかを確かめることができるオプションです。エラーがある場合はそれが表示され、問題なく実行できる場合は何も表示されず適用もされません。

git apply --check bugfix.patch

まとめ

git applyコマンドは、パッチファイルをワーキングツリーに適用するためのツールです。git diffgit format-patchで作成したパッチファイルを適用することができ、オフライン環境での作業やOSSプロジェクトへのコントリビュートなどで活躍します。今ではプルリクエストによる変更の確認や適用が主流になっていますが、上記のように有用な場面は依然として存在します。普段の開発ではそこまで使うことが多いコマンドではないかもしれませんが、git applyコマンドを理解し適切に使いこなすことで、ぜひ様々な状況に対応できるエンジニアになってください。

【番外編】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講師への質疑応答可

関連記事