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ファイルがメールで届きました。パッチ内容を貼り付けてプレビューし、ローカルコピーに変更を適用します。

試してみる — Diff Patch Applier

フルツールを開く