パッチファイルの作成

context 出力形式

$ diff -c original.txt new.txt > patch.txt

unified 出力形式

$ diff -u original.txt new.txt > patch.txt

ディレクトリを比較する場合、-rNオプションを追加。

$ diff -crN old-dir new-dir > patch.txt

パッチの適用

$ patch < patch.txt
や
$ patch -p0 -E < patch.txt

など。
※ -p"num"で、パッチファイル内の上位ディレクトリ(パス)を削除。

実行例

$ cat original.txt
abc
$ cat modified.txt
abcdef
$ diff -u original.txt modified.txt > patch.txt
$ cat patch.txt
--- original.txt        2009-07-18 09:10:11.000000000 +0900
+++ modified.txt        2009-07-18 09:10:20.000000000 +0900
@@ -1 +1 @@
-abc
+abcdef
$ patch < patch.txt
patching file original.txt
$ cat original.txt
abcdef

ディレクトリの場合、

$ tree
.
|-- dir1
|   `-- ash.c
`-- dir2
    `-- ash.c

2 directories, 2 files
 tree
.
|-- dir1
|   `-- ash.c
`-- dir2
    `-- ash.c

2 directories, 2 files
 diff -cr dir1 dir2 > patch.txt
 cat patch.txt
diff -cr dir1/ash.c dir2/ash.c
*** dir1/ash.c  2009-07-18 09:25:45.000000000 +0900
--- dir2/ash.c  2009-07-18 09:08:08.000000000 +0900
***************
*** 2,7 ****

  int main()
  {
!       printf("hello, Mr.Stupid\n");
  }

--- 2,7 ----

  int main()
  {
!       printf("hello, Mr.Perfect\n");
  }

 cd dir1
$ patch -p0 < ../patch.txt
can't find file to patch at input line 4
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff -cr dir1/ash.c dir2/ash.c
|*** dir1/ash.c 2009-07-18 09:25:45.000000000 +0900
|--- dir2/ash.c 2009-07-18 09:08:08.000000000 +0900
--------------------------
File to patch:
$ patch -p1 < ../patch.txt
patching file ash.c
$ cat ash.c
#include <stdio.h>

int main()
{
        printf("hello, Mr.Perfect\n");
}

$