git format-patchの出力を扱う
git format-patchで生成されたパッチを適用します。メール形式のフォーマット、複数コミット、Diff部分の抽出方法を理解します。
Troubleshooting
詳細な説明
git format-patchパッチの適用
git format-patchはコミットメタデータを含むメール形式のパッチを生成します。Diffパッチ適用ツールはこれらのパッチのDiff部分を処理できます。
format-patch出力の構造
From abc123 Mon Sep 17 00:00:00 2001
From: Author Name <author@example.com>
Date: Mon, 1 Jan 2024 12:00:00 +0000
Subject: [PATCH] Fix null pointer in user handler
変更の説明...
---
src/handler.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/handler.js b/src/handler.js
index abc1234..def5678 100644
--- a/src/handler.js
+++ b/src/handler.js
@@ -10,7 +10,8 @@
function handleUser(req, res) {
- const user = getUser(req.params.id);
- res.json(user.profile);
+ const user = getUser(req.params.id);
+ if (!user) return res.status(404).json({ error: "Not found" });
+ res.json(user.profile);
}
Diffの抽出
Diffパッチ適用ツールのパーサーは非Diffコンテンツをスキップし、---/+++ヘッダーと@@Hunkヘッダーを見つけるよう設計されています。format-patch出力全体を貼り付ければ、Diff部分が自動的に抽出されます。
複数コミット
パッチシリーズ(複数コミット)がある場合、各コミットに独自のdiff --gitセクションがあります。ツールは見つかったすべてのDiffセクションを処理し、各Hunkを順番に適用します。
統計行
サマリー行(1 file changed, 3 insertions(+), 2 deletions(-))は情報提供のみでパーサーには無視されます。実際のDiff行のみがパッチ適用に影響します。
よくある問題
- バイナリパッチ —
git format-patchはこのツールで処理できないバイナリDiffを含む可能性(Binary files differと表示) - リネーム検出 — リネームされたファイルは
rename from/toで表示されパーサーがスキップ - モード変更 —
old mode/new mode行は情報提供のみで無視
ユースケース
共有Gitリモートのないプロジェクトに対して、コントリビューターからgit format-patchファイルがメールで届きました。パッチ内容を貼り付けてプレビューし、ローカルコピーに変更を適用します。