Файл 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: тогда редактор не откроется вовсе.
☑️ Правка сообщения последнего коммита
⚠️ Внимание:--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 Code | git config --global core.editor "code --wait" |
| Notepad++ (Windows) | git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin" |
| Nano | git config --global core.editor "nano" |
| Sublime Text | git config --global core.editor "subl -n -w" |
| Блокнот (Windows) | git config --global core.editor "notepad" |
Флаг --wait (или его аналог) критически важен: он заставляет Git дождаться закрытия файла, прежде чем читать содержимое. Без него Git может прочитать пустой или несохранённый файл и прервать коммит. Точные параметры запуска для вашего редактора лучше сверить с его документацией — они различаются между версиями.
Типичные ошибки и их решение
«Завис» в 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.