"patch -R"について

パッチを適用しようとしたら、いろいろ吐いてよくわからないので、調べた。

patch -c < "パッチ名"
で適用する。


元に戻すときは
patch -c -R < "パッチ名"
でOK。

ログはともに
patching file test.txt
と出る。

問題は、ぐちゃぐちゃになったとき。

1)パッチしたあとに、同じパッチをもう一度あてようとしたとき

  • -

$ patch < testdiff.txt
patching file test.txt
=>一回あてる
$ patch < testdiff.txt
patching file test.txt
Reversed (or previously applied) patch detected! Assume -R? [n] n
=>もう一回あてようとすると、「リバースパッチだよ、-Rとみなしますか?」「いいえ」
Apply anyway? [n] n
=>「とにかく適用しますか」「いいえ」
Skipping patch.
1 out of 1 hunk ignored -- saving rejects to file test.txt.rej
=>「パッチを飛ばして、rejファイルを吐きます」

  • -
  • -

$ patch < testdiff.txt
patching file test.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y
=>「リバースパッチとみなしますか」「はい」

  • Rをつけた、つまり、元に戻すパッチとして取り扱う。

当然、もともとのパッチを適用していないファイルに戻される。

  • -
  • -

$ patch < testdiff.txt
patching file test.txt
Reversed (or previously applied) patch detected! Assume -R? [n] n
=>「リバースパッチとみなしますか?」「いいえ」
Apply anyway? [n] y
=>「とにかくあてますか?」「はい」
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file test.txt.rej
=>あてられませんでしたので、Hunkとしてrejを吐きます。

  • -

2)パッチしていないファイルに-Rとしてパッチをあてたとき

  • -

$ patch -R < testdiff.txt
patching file test.txt
Unreversed patch detected! Ignore -R? [n] y
=>「unreversedパッチがありますが、-Rを無視しますか」「はい」
=>パッチ適用した通常の処理となる

  • -

3) まとめ
パッチ後に同じパッチをあてると、元に戻すリバースとみなすか聞いてくる。
はい - リバースとして扱う
いいえ - 「とにかくあてる」を選ぶと、あてられないのでrejを吐く。
いいえ - 「あてない」を選ぶと、これまたあてられないのでrejを吐く。


(1) -------
test.txt
aaa
bbb
ccc
ddd

(2) -------
test2.txt
aaa
bbb
ccc

(3) -------
testdiff.txt

test.txt 2010-01-12 17:38:21.000000000 +0900
      • test2.txt 2010-01-12 17:38:50.000000000 +0900

**************

1,5 ****

aaa

  • bbb

ccc
ddd

      • 1,4 ----