dartyushin.techОткрыть меню
← все статьи
статья1 минут

Как работает генерация Commit Message в IDE

Думаю, что многие [видели в GitHub Copilot](https://code.visualstudio.com/docs/copilot/copilot-smart-actions#_generate-a-commit-message-and-pr-information) кнопку ✨ прямо в input box, где мы пишем commit message для наших изменений. Если ее нажать — в строке ввода появится текст с описание наших изменений. Что же происходит под капотом после нажатия?

Пусть у нас в некотором проекте на golang произошло следующее изменение (результат команды git diff):

diff --git a/pkg/graphqlQuery/variable.go b/pkg/graphqlQuery/variable.go
index a8e087e..002c505 100644
--- a/pkg/graphqlQuery/variable.go
+++ b/pkg/graphqlQuery/variable.go
@@ -1,5 +1,7 @@
 package graphqlQuery
 
+import "strings"
+
 type VariableDefault struct {
  Value string
 }
@@ -11,11 +13,17 @@ type Variable struct {
 }
 
 func (variable *Variable) RenderType() string {
- result := "$" + variable.Name + ": " + variable.Type
+ var sb strings.Builder
+
+ sb.WriteString("$")
+ sb.WriteString(variable.Name)
+ sb.WriteString(": ")
+ sb.WriteString(variable.Type)
 
  if variable.Default != nil {
-  result = result + " = " + variable.Default.Value
+  sb.WriteString(" = ")
+  sb.WriteString(variable.Default.Value)
  }
 
- return result
+ return sb.String()
 }

Суть проста: мы переписали создание строки на механизм strings.Builder. Отправим в модель следующий запрос

Generate a concise and clear Git commit message based on the following git diff:

<GIT_DIFF_HERE>

В ответ получим примерно следующее

feat: optimize RenderType to use strings.Builder for efficient string concatenation
 ⁃ Replaced string concatenation with strings.Builder for better performance
 ⁃ Added strings import
 ⁃ Improved code scalability for future modifications

Модель из коробки знает формат git diff, и мы сразу получаем результат, который нам нужен. Чего не хватает? Хоть модель уже сразу начала следовать Conventional Commits, но она не знает как принято писать commit messages в конкретном проекте. Исправим наш промпт и добавим туда инструкцию, которую пользователь может указать в проекте

Generate a concise and clear Git commit message based on the following git diff.

<GIT_DIFF_HERE>

Custom instruction

<USER_CUSTOM_INSTRUCTION>

Для следующей инструкции

Пиши кратко и на русском. В скобочках указывай название файла. Например, fix(package/main.py): Some fix

ответ будет примерно таким

refactor(pkg/graphqlQuery/variable.go): Используем `strings.Builder` для формирования строки

На этом вся магия и заканчивается. Остается только тюнить промпт, чтобы добиваться нужного качества и формата ответа. Так же можно добавлять и другую информацию о проекте, которая будет полезна для генерации commit message.