アプリ開発において「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 diff
やgit format-patch
で作成したパッチファイルを適用することができ、オフライン環境での作業やOSSプロジェクトへのコントリビュートなどで活躍します。今ではプルリクエストによる変更の確認や適用が主流になっていますが、上記のように有用な場面は依然として存在します。普段の開発ではそこまで使うことが多いコマンドではないかもしれませんが、git apply
コマンドを理解し適切に使いこなすことで、ぜひ様々な状況に対応できるエンジニアになってください。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.05.08
Gitコマンド「git mv」とは?「mv」との違いをあわせて解説します!
この記事では、git mvについての解説を行います。
- git
2024.08.24
git checkout と git switch それぞれの使い方を比較する
この記事では、switchコマンドの基本的な使い方と機能を紹介します。また、checkoutコマンドとの比較を行い、両者の違いとそれぞれのコマンドが適した使用状況について解説します。最後に、switchコマンドを使った実践的な使用例とベストプラクティスを提供します。
- PC操作
- git
2024.06.19
複数ブランチを同時に作業する方法を解説!git worktreeの使い方ガイド
開発作業をしている最中に、チームメンバーからプルリクの依頼をされるということは良くあります。この時、プルリクの内容を確認するためのブランチに移動する前に、作業中の変更をコミットして…という確定していない変更をコミットすることにモヤモヤした経験ありませんか?
- git