patch — 套用 diff 補丁檔

將 diff 產生的補丁檔套用到目標檔案,實現增量更新。

語法

patch [選項] [原始檔] [補丁檔]

常用選項

選項 說明 範例
-p N 去除路徑前 N 個元件(處理不同目錄位置的補丁) patch -p1 < patch.diff
--dry-run 模擬套用,不實際修改檔案 patch --dry-run -p1 < fix.patch
-R, --reverse 反向套用補丁(撤銷已套用的補丁) patch -R < applied.patch
-b, --backup 套用前備份原始檔案(備份為 .orig) patch -b file.py < fix.patch
-i 補丁檔 指定補丁檔(而非從標準輸入讀取) patch -i fix.patch

使用範例

範例 1:套用單一補丁

將 fix.patch 補丁套用到 main.py。

$ patch main.py < fix.patch
patching file main.py
範例 2:套用多檔案補丁(-p1 常用)

-p1 去除路徑中第一個元件(a/ 或 b/ 前綴),是最常用的選項。

$ patch -p1 < changes.diff
patching file src/main.py
patching file src/utils.py
範例 3:先模擬再套用

用 --dry-run 確認補丁是否可以乾淨套用後,再實際執行。

$ patch --dry-run -p1 < security.patch
patch -p1 < security.patch
patching file lib/auth.py (dry run)
範例 4:撤銷已套用的補丁

使用 -R 反向套用(撤銷),將檔案還原到補丁套用前的狀態。

$ patch -R -p1 < changes.diff
patching file src/main.py (reversed)

常見錯誤與排錯

Hunk #1 FAILED at N.
原因
補丁的上下文與目標檔案不吻合,可能目標檔案版本不同或已修改過。
解法
確認補丁對應的原始版本,或在 patch 加上 --fuzz 選項放寬比對標準。

延伸閱讀