Git で変更を patch ファイルにする / patch コマンドで適用する

More than 1 year has passed since last update.

Git で表示される差分を、patch ファイルにすることができる。

これを使うと、patch ファイルとして後で適用したり、他 PC で差分だけ適用したりできるので便利。


patch ファイルの作り方

以下、コミット前の修正をパッチファイル化したい時の例。

$ git diff > diff.patch

そうすると、以下の様なファイルが作成される。

$ cat diff.patch                                                                                                                                                                         (git)-[master] -

diff --git a/test.txt b/test.txt
index d00491f..1191247 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
1
+2

ちなみに、以下のような差分指定もできる。

$ git diff HEAD~1 > head_diff.patch


--no-prefix オプションについて

git diff--no-prefix は不要である点、コメントで教えて頂きました。

ご指摘ありがとうございます。

http://qiita.com/sea_mountain/items/7d9c812e68a26bd1a292#comment-c0515c9335128da21656


patch ファイルの使い方

上記で作成した patch ファイルは以下のコマンドで適用できる。

$ patch -p1 < diff.patch

上記の例は patch を作成した時の階層と同じ階層で適用する場合。


-p オプションとは

-p オプションは、パッチを適用するディレクトリのことを示している。

git diff コマンドで作成した patch ファイルだと、diff で表示される、変更ファイルのパスが、リポジトリ直下になる。

そのため、同じ階層にいる状態で patch を適用するときは -p0 オプションを使えば良い。


-p オプション使用例

man patch に書かれている -p の使用例が大変わかり易いので、以下翻訳しつつ引用する。

-p数字  または  --strip=数字 オプションで使用する

別ディレクトリに存在するファイルにパッチを当てたいときに有効である。

以下の様なファイルの場合

/u/howard/src/blurfl/blurfl.c

-p0 パス指定を変更しない
/u/howard/src/blurfl/blurfl.c

-p1 スラッシュが1つなくなった状態になる
u/howard/src/blurfl/blurfl.c

-p4 パス名 + スラッシュのセットが4つ分無くなる。("/" + "u/" + "howard/" + "src/" この4セット)
blurfl/blurfl.c

-p オプションを指定しない場合の挙動は、blurfl.c となる。


参考サイト

普通のpatchコマンドで取り込めるdiffファイルをgitで作成する

patch -p0 コマンドで適用できるパッチを作成する

IBM Knowledge Center コマンド・リファレンス 第 4 巻 patch コマンド