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 選項放寬比對標準。