git commit editmsg: файл COMMIT_EDITMSG и редактирование сообщений коммитов

Файл COMMIT_EDITMSG появляется в папке .git каждый раз, когда вы выполняете git commit без флага -m — Git открывает его в редакторе, чтобы вы ввели сообщение коммита. Если редактор не настроен или завис, коммит «виснет» на этом файле, и новички часто не понимают, что происходит и как выйти из ситуации.

Разберёмся, что это за файл, где он лежит, как с его помощью редактировать сообщения коммитов и какие ошибки с ним связаны. Инструкции применимы к Git на Windows, Linux и macOS — пути отличаются только слэшами.

Что такое COMMIT_EDITMSG и где он находится

COMMIT_EDITMSG — это служебный текстовый файл, который Git создаёт внутри каталога .git в корне вашего репозитория. В него Git записывает черновик сообщения коммита: шаблон с закомментированными строками (статус ветки, список изменённых файлов) и, при необходимости, текст предыдущего сообщения.

Полный путь выглядит так: .git/COMMIT_EDITMSG. Файл перезаписывается при каждом новом коммите, поэтому в нём всегда лежит текст последнего сеанса редактирования сообщения. Удалять его вручную не нужно — Git управляет им сам.

  • 📄 Назначение: временное хранилище текста сообщения коммита перед его сохранением в историю.
  • ✏️ Создаётся при: git commit, git commit --amend, git merge с конфликтом сообщения, git rebase -i.
  • 🗑️ Удалять вручную: не требуется, файл перезаписывается автоматически.

Как Git использует файл при коммите

Когда вы вводите git commit без параметра -m, происходит следующее: Git формирует шаблон сообщения, записывает его в COMMIT_EDITMSG и открывает файл в редакторе, заданном в конфигурации. После того как вы сохраняете файл и закрываете редактор, Git считывает содержимое, отбрасывает строки, начинающиеся с символа #, и создаёт коммит с оставшимся текстом.

Важный нюанс: если после удаления комментариев сообщение оказывается пустым, Git прервёт коммит с сообщением Aborting commit due to empty commit message. Это защита от случайных «пустых» коммитов.

Как отредактировать сообщение последнего коммита

Самый частый сценарий работы с этим файлом — исправление опечатки в сообщении последнего коммита. Для этого используется команда:

git commit --amend

Git снова откроет COMMIT_EDITMSG, но уже с текстом предыдущего коммита. Измените текст, сохраните файл и закройте редактор — история будет переписана. Если текст менять не нужно, а требуется только добавить забытые файлы, используйте git commit --amend --no-edit: тогда редактор не откроется вовсе.

☑️ Правка сообщения последнего коммита

Выполнено: 0 / 5
⚠️ Внимание: --amend переписывает историю. Если коммит уже отправлен в общий репозиторий (git push), после правки потребуется принудительная отправка git push --force-with-lease, что может создать проблемы коллегам, уже забравшим старую версию.

Настройка редактора для COMMIT_EDITMSG

Половина всех проблем с git commit editmsg связана с тем, что Git открывает файл в редакторе, которым пользователь не умеет пользоваться. По умолчанию на Linux и macOS это часто Vim, на Windows — зависит от варианта установки Git. Редактор задаётся командой:

git config --global core.editor "название редактора"

Примеры для популярных редакторов:

РедакторКоманда настройки
VS Codegit config --global core.editor "code --wait"
Notepad++ (Windows)git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
Nanogit config --global core.editor "nano"
Sublime Textgit config --global core.editor "subl -n -w"
Блокнот (Windows)git config --global core.editor "notepad"

Флаг --wait (или его аналог) критически важен: он заставляет Git дождаться закрытия файла, прежде чем читать содержимое. Без него Git может прочитать пустой или несохранённый файл и прервать коммит. Точные параметры запуска для вашего редактора лучше сверить с его документацией — они различаются между версиями.

📊 Каким редактором вы пользуетесь для сообщений коммитов?
Vim / Neovim
VS Code
Nano
Только git commit -m, редактор не открываю

Типичные ошибки и их решение

«Завис» в Vim. Самая распространённая ситуация: открылся Vim, и непонятно, как выйти. Нажмите Esc, затем введите :wq и нажмите Enter — файл сохранится, коммит выполнится. Чтобы выйти без сохранения (коммит будет отменён), используйте :q!.

Ошибка «editor exited with error status». Возможная причина — редактор запустился и сразу завершился с ошибкой, либо путь к нему в конфигурации неверен. Проверьте настройку командой git config --global core.editor и убедитесь, что указанная программа действительно запускается из терминала.

Ошибка «could not launch editor». Git не нашёл исполняемый файл редактора. На Windows проверьте, что путь указан с прямыми слэшами и заключён в кавычки, если содержит пробелы.

  • 🚪 Выйти из Vim: Esc:wq → Enter.
  • 🔍 Проверить редактор: git config --global core.editor.
  • 🚫 Отменить коммит из редактора: закрыть файл без сохранения или очистить текст сообщения.
  • Обойти редактор: использовать git commit -m "текст".
⚠️ Внимание: если вы случайно открыли редактор в середине интерактивного rebase или слияния, не закрывайте терминал «по-жёсткому» — корректно выйдите из редактора, иначе репозиторий может остаться в промежуточном состоянии REBASE_HEAD или MERGE_HEAD, которое придётся завершать командами git rebase --abort или git merge --abort.

Шаблон сообщения коммита

Git позволяет задать собственный шаблон, который будет подставляться в COMMIT_EDITMSG при каждом коммите. Это удобно для команд, где принят единый формат сообщений (например, с указанием типа изменения и номера задачи).

Создайте текстовый файл, например ~/.gitmessage.txt, с нужной структурой, и подключите его:

git config --global commit.template ~/.gitmessage.txt

Теперь при каждом git commit редактор откроется с вашим шаблоном вместо стандартного. Строки с # по-прежнему будут проигнорированы при создании коммита.

Что ещё лежит рядом в папке .git

Рядом с COMMIT_EDITMSG можно встретить MERGE_MSG (текст сообщения при слиянии), SQUASH_MSG (при squash-слиянии) и ORIG_HEAD (указатель на состояние до опасной операции). Все это служебные файлы, которые Git перезаписывает автоматически.

Когда файл не создаётся или не нужен

Файл COMMIT_EDITMSG не задействуется, если сообщение передано напрямую через git commit -m "текст" или git commit -F файл. В этих случаях редактор не открывается, а сообщение берётся из аргумента команды. Тем не менее Git может всё равно обновить содержимое файла для служебных целей — на это не стоит полагаться как на источник данных.

Не используйте COMMIT_EDITMSG как способ программно узнать сообщение последнего коммита — для этого существует надёжная команда git log -1 --pretty=%B. Содержимое файла может относиться к отменённому или прерванному коммиту.

Частые вопросы

Можно ли удалить файл COMMIT_EDITMSG?

Технически да, но смысла в этом нет: Git пересоздаст его при следующем коммите. На работу репозитория удаление не влияет, файл не является частью истории.

Почему git commit открывает редактор, хотя я этого не хочу?

Потому что без флага -m Git всегда открывает редактор для ввода сообщения. Либо используйте git commit -m "текст", либо настройте удобный редактор через core.editor.

Как выйти из Vim, если он открылся при коммите?

Нажмите Esc, введите :wq и нажмите Enter — коммит сохранится. Для отмены коммита: Esc, затем :q! и Enter.

Что означает «Aborting commit due to empty commit message»?

Git сочёл сообщение пустым: либо файл не был сохранён, либо весь текст закомментирован или удалён. Откройте коммит заново и убедитесь, что в файле есть хотя бы одна строка без символа # в начале.

Как изменить сообщение не последнего, а более старого коммита?

Используйте интерактивный rebase: git rebase -i HEAD~N, где N — число коммитов от текущего. Пометьте нужный коммит словом reword, и Git откроет редактор сообщения для него. Помните, что это переписывает историю, как и --amend.