はじめに
こんにちは!中途入社のなーがです。前回はdiffによるパッチファイルの作成についての記事だったので、今回はその続きを書いていこうと思います。 今更ですが、そもそもパッチファイルって何?という方はこちらの説明が分かりやすいと思うので、参考にしてみてください。
パッチファイルの作成
では、さっそく以下のコマンドを使用してパッチファイルを作成します。前回はdiffコマンドを使用しましたが、今回はformat-patchというコマンドを使用します。コミットIDを1つしか指定しなかった場合は、指定したコミットIDからHEADまでのコミットがコミット 1 つごとに 1 つずつパッチファイルとして作成されます。
# git format-patch 取り込みたいコミットID -o パッチファイル作成したいディレクトリ
git format-patch 26e26ec -o patch
またはコミットIDを2つ指定して、そのコミット間の差分を出力することもできます。
# git format-patch 取り込みたいコミットID(先頭)..取り込みたいコミットID(末尾) -o パッチファイル作成したいディレクトリ
git format-patch 26e26ec..5f966a6 -o patch
以下が各差分ファイルです。
ここで、前回のファイルと見比べてみましょう。
大きな違いは以下の箇所になります。
よく見ると、format-patchコマンドで作成された各ファイル2行目のFromがメールみたいにみえます。これは、format-patchコマンドが電子メール送信用のパッチを作成するためのコマンドであるため、このようなフォーマットになっているようです。オプション–toや–ccをしていすることで、メールヘッダーにToヘッダーやCcヘッダーなどを追加出来ます。format-patchコマンドには多くのオプションがあるので、興味のある方は公式ドキュメントを参考にしてください。
パッチファイルの反映
次に、作成したパッチファイルを反映します。パッチファイルの反映にはamコマンドを使用します。amコマンドも多くのオプションがあるので、興味のある方は公式ドキュメントを参考にしてください。
git am patch/0002-css.patch
Applying: cssを追加
コンフリクトが発生した場合は以下のように表示されます。
git am patch/0001-.patch
Applying: 項目を追加
error: patch failed: index.html:1
error: index.html: patch does not apply
Patch failed at 0001 項目を追加
hint: Use ‘git am --show-current-patch=diff’ to see the failed patch
When you have resolved this problem, run “git am --continue”.
If you prefer to skip this patch, run “git am --skip” instead.
To restore the original branch and stop patching, run “git am --abort”.
コンフリクトを解消した後に以下のコマンドを実行することで、処理が続行されます。
git am --continue
Applying: 項目を追加
コンフリクトが解消できない等でパッチファイルの反映を中止したい場合は、以下のコマンドを実行します。こちらも参考になると思います。
git am --abort
公式ドキュメントより、コミットメッセージやコミット作成者は以下のように反映されるようです。
- コミット作成者名:メッセージの「From:」行
- コミット作成者の日付:メッセージの「Date:」行
- コミットのタイトル:「Subject:」行の共通プレフィックス「[PATCH <anything>]」を削除したもの
実際にコマンドを実行したので、それぞれの違いについて簡単に見ていきます。こちらの表が分かりやすかったので、お借りしたいと思います。この表から分かるように、コミットした差分かどうかで使い分けるようですね。
差分の範囲 | 作成用コマンド | 反映用コマンド |
---|---|---|
コミット済 | git format-patch | git am |
未コミット | git diff | git apply |
終わりに
今回はGitのformat-patchコマンドを使用して差分ファイルを作成し、反映してみました。format-patchコマンドは使ったことが無かったのですが、個人的にはcherry-pickの複数版のような印象を受けました。使用頻度は少ないかもしれませんが、機会があれば業務でも使ってみたいと思います。