Git:一時的な差分をファイルに出力してみよう!2

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

はじめに

こんにちは!中途入社のなーがです。前回は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-patchgit am
未コミットgit diffgit apply

終わりに

今回はGitのformat-patchコマンドを使用して差分ファイルを作成し、反映してみました。format-patchコマンドは使ったことが無かったのですが、個人的にはcherry-pickの複数版のような印象を受けました。使用頻度は少ないかもしれませんが、機会があれば業務でも使ってみたいと思います。

アバター画像
About なーが 13 Articles
前職は.NETやPythonを用いた業務アプリケーション、プロトタイプAPI開発に従事。2023年中途入社。とりあえずやってみて、苦しんで覚える系エンジニア。AWS認定3冠(SAA、MLS、DAS)

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる