Git:パッチファイルの作成と適用 - git format-patch / git apply / git am

Git:パッチファイルの作成と適用 - git format-patch / git apply / git am

下準備 #

以下のファイルを作成します。

main.js

main();

function main() {
  console.log("Hello world!");
}

実行してみます。

node main.js

> Hello world!

動作確認ができたのでコミットします。

git init
git add .
git commit -m "hello"

パッチファイルを作成する ー その1 #

main.js を修正します。

main();

function main() {
  console.log("Hi there!");
}

まだステージングやコミットはしていない状態です。この状態で次のコマンドを実行すると、修正内容を hi-there.patch というパッチファイルとして保存できます。

git diff > hi-there.patch

パッチファイルの内容を見てみます。

cat hi-there.patch

> diff --git a/main.js b/main.js
> index 37f01c1..731763a 100644
> --- a/main.js
> +++ b/main.js
> @@ -1,5 +1,5 @@
>  main();
>
>  function main() {
> -  console.log("Hello world!");
> +  console.log("Hi world!");
>  }

パッチファイルだけをコミットします。

git add hi-there.patch
git commit -m "add hi-there patch"

main.js の変更は戻してしまいましょう。

git checkout .

パッチファイルを適用する ー その1 #

さて、いまの main.js は以下です。

main();

function main() {
  console.log("Hello world!");
}

作成済みのパッチファイルを適用します。

git apply hi-there.patch

そうすると、main.js の内容がパッチの内容に置き換わります。

main();

function main() {
  console.log("Hi there!");
}

パッチが適用できました。なお、git apply で適用された変更はワーキングツリーの変更であり、ステージングやコミットはされていない状態です。

パッチファイルを作成する ー その2 #

いったんパッチファイルを削除してコミットします。

rm hi-there.patch
git add hi-there.patch
git commit -m "remove hi-there patch"

いま main.js の内容は “Hi there!” になっていますが、このままコミットします。

git add .
git commit -m "hi"

直前のコミットからパッチファイルを作成するには、次のコマンドを実行します。

git format-patch -1 HEAD

0001-hi.patch が作成されたはずです。

ls
> main.js
> 0001-hi.patch

パッチファイルの内容を見てみます。

cat 0001-hi.patch

> From 831723603c1a78678a148ff0685d0be77ce16848 Mon Sep 17 00:00:00 2001
> From: Jane Doe <[email protected]>
> Date: Sat, 10 Oct 2026 09:12:34 +0900
> Subject: [PATCH] hi
>
> ---
>  main.js | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/main.js b/main.js
> index 37f01c1..5b73286 100644
> --- a/main.js
> +++ b/main.js
> @@ -1,5 +1,5 @@
>  main();
>
>  function main() {
> -  console.log("Hello world!");
> +  console.log("Hi there!");
>  }
> --
> 2.56.0

パッチファイルをコミットします。

git add 0001-hi.patch
git commit -m "add 0001-hi patch"

パッチファイルを適用する ー その2 #

2つほどコミットを戻します。

git reset --hard HEAD~2

いま、パッチファイルはなくなり、main.js の内容も元に戻っています。

main();

function main() {
  console.log("Hello world!");
}

手動でパッチファイルを作成します。さきほど出力した内容をコピー&ペーストして 0001-hi.patch として作成します。

0001-hi.patch

From 831723603c1a78678a148ff0685d0be77ce16848 Mon Sep 17 00:00:00 2001
From: Jane Doe <[email protected]>
Date: Sat, 10 Oct 2026 09:12:34 +0900
Subject: [PATCH] hi

---
 main.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/main.js b/main.js
index 37f01c1..5b73286 100644
--- a/main.js
+++ b/main.js
@@ -1,5 +1,5 @@
 main();

 function main() {
-  console.log("Hello world!");
+  console.log("Hi there!");
 }
--
2.56.0

では、パッチファイルを適用します。

git am 0001-hi.patch

> Applying: hi

パッチがコミットとして適用されます。Git のログを確認してみましょう。

git log

> commit 8e7052d34f59be8c6e9d80d77ad3aa82b0ae5019 (HEAD -> main)
> Author: Jane Doe <[email protected]>
> Date:   Sat Oct 10 09:12:34 2026 +0900
>
>     hi

パッチファイルの作成、適用の方法いろいろ #

作成方法 #

  • ワーキングツリーの変更をパッチファイルにする:git diff > my.patch
  • ステージングの変更をパッチファイルにする:git diff --cached > my.patch
  • 直前のコミットをパッチファイルにする:git format-patch -1 HEAD
  • 特定のコミットをパッチファイルにする:git format-patch -1 <commit hash>

適用方法 #

  • パッチファイルをワーキングツリーに適用する:git apply my.patch
  • パッチファイルをステージングに適用する:git apply --cached my.patch
  • パッチファイルをコミットとして適用する:git am my.patch

補足 #

git diff で作成したパッチは git apply で適用できます。

git format-patch で作成したパッチは git am または git apply でも適用できます。git am の場合はコミットとして適用、git apply の場合はワーキングツリーまたはステージングとして適用します。

パッチファイルの仕組みはいつ使うのか? #

わたしが関わっているプロジェクトではフレームワークに一部パッチを当てる必要があり、その際にパッチファイルを作成・適用することで変更を管理しています。

より一般的には、一時的な変更を他の人と共有したいときに、パッチファイルを作成して送り、相手はそのパッチを適用するだけで同じ変更を取り込むといった使い方ができますね。