git diff＋ChatGPTでPRの説明文作成しよう！

## はじめに

組織で開発を行っている皆さんは普段からPull Request（PR）を作っていますよね？(決めつけ)

`master`ブランチに直接pushしている方も中にはいるかもしれませんが、会社やチームで開発を行っていると、PRを作成する頻度は高いのではないかと思います。

そしてPRを作成する際には、その説明文を書く必要があります。
コードだけを読んで修正意図が伝わればいいですが、そうはいってもすべての背景をコードベースで伝えるのには限度があります。

しかし、だからといって修正の背景や詳細を、開発者自身が客観的な文章で伝えるのは簡単なことではありません。
そこで、この記事では`git diff`とChatGPTを組み合わせて、自動的にPRの説明文を生成する方法をご紹介します。

## How to make PR？

繰り返しになりますが使うのは`git diff`コマンドとChatGPTだけなんです!(お昼の料理番組風)

### Git command

まずは以下のコマンドで差分を出力しましょう。
`git diff ${Target Branch} ${Source Branch} --output=diff.txt`
※この時ブランチの順番を注意してください。前に来てる方が修正前だとみなされて差分が出力されます。

こうすることによってマージ先のブランチとマージ元のブランチの差分が`diff.txt`ファイルに出力されます。
修正差分が大きい場合、一度ファイルに出力しておいた方が後々コピペしやすいので自分はこのようにしてますが、他にいいコマンドやオペレーションがあれば教えてください！

### Use ChatGPT

あとはもう簡単です。
以下のような依頼をChatGPTに投げるだけです！

~~~
あなたは開発者のアシスタントAIです。
ユーザーが入力した`git diff`による差分を解析して、
その差分が発生するPull Requestの説明文(マークダウンの形式)を出力してください。
修正の背景が不明確な場合には、いきなり出力するのではなくユーザーに修正の意図を問いかけてください。
PRの説明文のフォーマットは以下の通りです。

```
## 概要
修正の概要を記載します

## 変更点
具体的にどのような修正を行ったのかわかりやすく説明します

## 動作確認
コードの差分が渡された場合には、その修正の確認方法を提示します（ドキュメントの場合は省略可能）

## 関連リンク
issueやチケットなどを記載する箇所です
実際に転記するときにはユーザーが記載するので、出力時には空欄でよいです
```

git diffの差分は以下の通りです。

```
${git diff ${Target Branch} ${Source Branch} --output=diff.txtの結果}
```
~~~
このようにChatGPTに役割と期待するPRのフォーマット、そして`git diff`コマンドの結果を与えさえすれば、簡単に説明文を作成してくれます。

というのも開発者が`git diff`の結果を入力すると、AIは差分を解析し、説明文の各項目を自動生成します。
ただし、修正の背景が不明確な場合には、AIがユーザーに修正の意図を問いかけることもあります。

## 実際にやってみよう

~~~
あなたは開発者のアシスタントAIです。
ユーザーが入力した`git diff`による差分を解析して、
その差分が発生するPull Requestの説明文(マークダウンの形式)を出力してください。

(略)

git diffの差分は以下の通りです。
```
diff --git a/index.js b/index.js
index 1234567..89abcde 100644
--- a/index.js
+++ b/index.js
@@ -1,7 +1,10 @@
 // ボタンが押されたときの処理
 function onButtonPress() {
-  // 成功メッセージを表示
-  showMessage("成功");
+  try {
+    // 成功メッセージを表示
+    showMessage("success");
+  } catch (error) {
+    handleErrorMessage(error);
+  }
 }

 // メッセージを表示する関数
 function showMessage(message) {
   console.log(message);
 }
+
+// エラーハンドリングを追加する関数
+function handleErrorMessage(error) {
+  console.error("エラーが発生しました: " + error.message);
+}
```
~~~

実際にこのような質問を投げかけてみると、以下の結果が返ってきました！

~~~
Gitの差分情報を解析し、Pull Requestの説明文をマークダウン形式で生成します。以下がその出力例です。

```
## 概要
このPull Request では、`index.js` ファイルに対する変更が含まれています。ボタンのクリック時の処理にエラーハンドリングを追加し、メッセージの表示方法を修正しました。

## 変更点
主な変更点は次の通りです:
- ボタンのクリック時にエラーハンドリングを追加しました。
- `showMessage` 関数のメッセージを `"成功"` から `"success"` に変更しました。

## 動作確認
この変更の動作確認方法は次の通りです:
1. ボタンをクリックします。
2. 成功メッセージ `"success"` が正しく表示されることを確認します。
3. エラーが発生した場合、エラーメッセージがコンソールに正しく表示されることを確認します。

## 関連リンク
（ここに関連リンクを記載する場合、ユーザーが適切なリンクを追加してください。）
```

この生成された説明文は、Gitの差分情報に基づいて、Pull Requestの概要、変更点、動作確認方法を詳細に説明し、関連リンクのセクションも準備されています。ユーザーが関連リンクを追加する必要がある場合、その箇所を空欄のままにしてください。
~~~

さすがにこのままを引用するでのは不十分かもしれませんが、ドラフト（たたき台）としては十分すぎるかと思います。

## ChatGPTを用いるメリット

このようにAIによって説明文を自動生成するメリットは、開発者がPRのために時間を費やす必要がなくなることです。
説明文の作成に集中しなくても良いため、開発者はより効率的に実装などの作業に取り組むことができます。

また、開発者自身はPRを出す段階まで行くと、該当のソースコードや修正内容に対する解像度が上がっていることでしょう。
ただし、初めて見る人やレビュワーにとっては、その修正が具体的に何を意味するのかを一目で理解するのは難しい場合があります。
このような場合、今回作成されたような説明文が、このPRが何を修正するのかを明確に伝えてくれるでしょう。

さらに、これはレビュワーと若干重なりますが、客観的でわかりやすいPRの説明文は、その開発者がプロジェクトから離れた後の保守や追加実装の段階で役立ちます。
後から開発を引き継ぐ人が実装意図を把握しにくい場合でも、丁寧な説明文があれば大変助かります！(←実体験)

## まとめ

`git diff`とChatGPTを組み合わせて、PRの説明文を自動生成できる方法を紹介しました。

最後になりますが注意勧告を入れておきます。
**この記事を読んだ雇われエンジニアであるそこのあなた！
ChatGPTに業務コードをそのまま張り付けることは情報漏洩の恐れがあるため、大変危険で、避けるべき行為です！
会社のガイドラインに従い、契約している生成AIサービス（OpenAI API/Azure OpenAI Service/Amazon Bedrock/Google Vertex AI等)を利用するようにしましょう。**

ただこれからの開発プロセスにおいて、コーディング以外でもAIが活用されることは間違いないかと思われます。
ぜひ、この記事を参考にして、PR作成～レビューをスムーズに進めるための新しい方法を、問題が起きないように取り入れてみてください。
またほかに良い方法などご存じでしたら教えてください！