VS Code + GitHub Copilot 環境でも git commit しちゃうんだな、これが

2023/12/28に公開
2

VS Code でコミットするときに GitHub Copilot を使っていると コミットメッセージを生成してくれたりします。

図 1 コミットメッセージを Copilot で生成

VS Code のソース管理タブでコミットメッセージを自動生成しているスクリーショット、画面右側には変更箇所も表示されている

英語苦手な自分からすると「マジうれしいんですけど」という感じなのですが、コミットメッセージはできればエディターで記述したいと考えてしまいます。

そこで今回は「コミットメッセージをエディターで編集する利便性」を維持しつつ、「GitHub Copilot による生成機能もできるだけ利用しよう」という内容のメモになります。

VS Code のエディターでコミットメッセージを記述するとは

VS Code でコミットメッセージを記述する方法としてはソース管理タブの利用が一般的かと思われます。

図 1-1 ソース管理タブのフィールドから普通に入力

ソース管理タブで複数行のコミットメッセージを入力しているスクリーショット

一方で上記とは別に、コミット用のコマンドを実行しエディターの中で記述する方法もあります。

  • ターミナルから git commit を実行する
  • コマンドパレットで Git: Commit を実行する

こちらはコマンドを別途実行する必要がありますが、コミットメッセージ(.git/COMMIT_EDITMSG)をエディタータブで編集するので、エディターならではの編集支援を受けられます。

図 1-2 エディターで入力(シンタックスハイライトや文字数のガイドルーラーが表示される)

エディターで前述にソース管理タブと同じコミットメッセージを入力しているスクリーショット、こちらはガイドルーラーが表示されている

また、コミットメッセージにも言語 ID が割り当てられているので、キー配列や拡張機能によるカスタマイズも適用しやすくなっています。

私は「Markdown として表示するとどう見える?」が気にときがあるので、以下のようなショートカットを登録しています。

リスト 1-1 ctrl + shift + v で Markdown プレビューを開くキーボードショートカット

{
  "key": "ctrl+shift+v",
  "command": "markdown.showPreview",
  "when": "!notebookEditorFocused && editorLangId == 'git-commit'"
}

デフォルトで利用できる Copilot の機能

普通にエディターなので Copilot が有効であればデフォルト状態でもコミットメッセージのサジェストなどをやってくれます。おそらくは編集中の COMMIT_EDITMSG の内容がコンテキストになっていると思われますが、ブランチ名や変更のあったファイル名一覧が含まれるているので、わりと良い感じにサジェストしてくれます。

図 2-1 Copilot によるサジェスト

「ci: Add "test,yml"」と入力したときに、「for GitHub Actions」とサジェストされているスクリーショット

また、Copilot のインラインチャットも利用できます。

図 2-2 インラインチャットの利用

コミットメッセージの一部を範囲選択し、インラインチャットへ「to english」と指示しているスクリーショット

この辺の編集支援だけでもやりやすくなるので「もうデフォルトのままでもいいんじゃないかな」という気にもなってきます。

コミットメッセージ生成機能に近づける

「もうデフォルトのままでもいいんじゃないかな」と言いましたが、やはり隣の芝生は青く見えてきます。

対応として git commit でエディターを開くときに最初から生成されたテキストが挿入される方法を探したのですが、見つかりませんでした。

その代わりでもないのですが、サジェストなどの精度を上げる方法として、git commit-v を指定することでコミットメッセージの編集時に diff の内容を挿入してみます。

https://qiita.com/magicant/items/f66528f83fccd1b1fdbb
https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--v

図 3-1 git commit -v による diff の挿入

git commit -v によりエディターで編集しているコミットメッセージに diff が挿入されているスクリーンショット

前述のように COMMIT_EDITMSG の内容をコンテキストにしているようなので、diff の挿入によりサジェストやインラインチャットの応答が具体的になったと感じています。 (「なった」と言い切りたいところですが、やはりバラ付きはあります)

また、この状態になればインラインチャットで “make commit message” のように指示すると、生成機能ぽい感じになります。 (以下の例は上手くいっている方なので、あまり過度な期待はしないでください)

図 3-2 生成機能とインラインチャットの比較(diff なし)

自動生成とインラインチャットへの指示を同時に行っているスクリーショット、インラインチャットの応答は簡素なものになっている

  • 生成機能: Add readline functionality to index.mjs
  • インラインチャット: Add new feature

図 3-3 生成機能とインラインチャットの比較(diff あり)

自動生成とインラインチャットへの指示を同時に行っているスクリーショット、どちらも同じ応答で内容も具体的になっている

  • 生成機能: Add readline functionality to index.mjs
  • インラインチャット: Add readline functionality to index.mjs

このような感じになるので、コミットメッセージ生成への影響を確認できたら、Git の設定で -v をデフォルトにもできます。

リスト 3-1 ~/.gitconfig または ~/.config/git/config へ以下を追加

[commit]
  verbose = true

あとは、まだ試行錯誤中ですが、コミットテンプレートなどから指示を埋め込んでおくとより精度が良くなるかなと考えています。

そして、ここまで書いておいてアレなのですが、それでも生成機能に頼りたくなることもあります。その場合は普通に生成してから「コピペしちゃうんだな、これを」という対応にしています。

ターミナル内で git commit した後

GitHub を利用している場合、git commit した後はプルリクエストを作成することになるかと思います。話はそれてしまいますが、プルリクエストの説明などもエディターで記述する利点を少しだけ。

プルリクエスト作成は GitHub Pull Requests and Issues を使う方法もありますが、ターミナル内で操作を継続するなら GitHub CLI(gh コマンド)もおすすめです。

たとえば、コマンドラインから gh pr create を実行すると、ボディ(プルリクエストの説明)を Markdown として記述するので、こちらもエディターから Copilot を利用できます。

図 4-1 gh pr create で編集時にインラインチャットを利用

エディターで PR のボディを編集しているときに、インラインチャットで mermaid のダイアログを挿入しているスクリーショット

図 4-2 作成されたプルリクエスト

実際に作成されたプルリクエストのスクリーショット、インラインチャットで挿入した図が表示されている

ただし、こちらもエディターでの記述がベストと一概には言えないのが悩み所です。

私は gh pr checks --watch なども使いたいので Git 関連の操作はターミナルに寄せていますが、それでも場合によってツールを使い分けているといった感じです[2]

おわりに

コミットメッセージを VS Code のエディターで記述するとき、GitHub Copilot の生成機能をできるだけ利用してみました。

Copilot はなんとなくデフォルトのままで使っていましたが、コンテキストとなる情報を少し追加するだけでも生成物の精度が向上することを体験できました。

今後も生成 AI におまかせするだけでなく、工夫しながら利用できればと思っています。

脚注
  1. Hook 用スクリプトを Dev Container 内に配置する Feature を作ったとき履歴も含たのですが、単純な前方一致で「似ているコミットメッセージをサジェストする」ことが増えました。 ↩︎

  2. 最近、Copilot CLI が GitHub CLIextension になったので gh copilot コマンドが使えるようになりました。ここに「gh copilot pr みたいな機能が追加されないかな」と妄想しています。 ↩︎

GitHubで編集を提案

Discussion

844196844196

以下のようなスクリプトを .git/hooks/prepare-commit-msg へ設定しておくと git commit でエディターを開いたとき、diff がコメントとして挿入されます。

git commit -v で (#でコメントアウトはされませんが) diffが埋め込まれた状態でコミットメッセージの編集を開始できます。

https://qiita.com/magicant/items/f66528f83fccd1b1fdbb

常時有効にするのであれば ~/.gitconfig or ~/.config/git/config に↓を追記します:

~/.gitconfig or ~/.config/git/config
[commit]
  verbose = true
hankei6kmhankei6km

git commit -v の情報ありがとうございます!

こちらの方が簡単に試すことができて良いですね。少し試したところ、生成されるメッセージも同じようでしたので記事を更新しました。