↓Перейти к содержанию
  1. Git: руководства и команды/

Как выйти из vim при git commit: решение для новичков

·8 минут·

Вы запустили git commit без флага -m, и теперь смотрите на непонятный экран. Курсор стоит, клавиатура не реагирует привычным образом, закрыть окно нельзя — вы в редакторе vim. Это случается с каждым новичком хотя бы раз. Вот как выйти.

Быстрое решение: как выйти из vim #

Если вы открыли vim и хотите выйти без создания коммита (отменить коммит):

ESC
:q!
Enter

Пошагово:

  1. Нажмите ESC — это переключит vim в нормальный режим
  2. Наберите :q! — двоеточие, буква q, восклицательный знак
  3. Нажмите Enter

Vim закроется, коммит не будет создан.

Если нужно сохранить сообщение и создать коммит #

Чтобы написать сообщение и создать коммит:

i
(напишите сообщение коммита)
ESC
:wq
Enter

Пошагово:

  1. Нажмите i — переключит в режим вставки (вверху появится -- INSERT --)
  2. Напишите сообщение коммита в первой строке
  3. Нажмите ESC — вернёт в нормальный режим
  4. Наберите :wq — сохранить и выйти
  5. Нажмите Enter

Основные команды выхода из vim #

:q!    выйти без сохранения (отменить)
:wq    сохранить и выйти (создать коммит)
:x     то же что :wq (сохранить и выйти)
ZZ     то же что :wq (без двоеточия)
ZQ     то же что :q! (без двоеточия)

Почему открывается vim #

Git использует системный редактор по умолчанию. На большинстве Linux и macOS это vim. Это происходит когда вы запускаете git commit без флага -m:

git commit       # → открывает редактор
git commit -m "сообщение"  # → не открывает редактор

Git также открывает редактор при интерактивном rebase (git rebase -i) и других операциях.

Как изменить редактор на постоянной основе #

Чтобы в будущем открывался другой редактор, а не vim:

Nano (простой текстовый редактор):

git config --global core.editor "nano"

# Из nano: Ctrl+X для выхода, Y для сохранения

VS Code:

git config --global core.editor "code --wait"
# --wait заставляет Git ждать, пока вы закроете вкладку

Sublime Text:

git config --global core.editor "subl -w"

Notepad++ (Windows):

git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

Проверить текущий редактор:

git config --get core.editor

Использование флага -m для избежания редактора #

Самый простой способ не сталкиваться с этой проблемой — всегда использовать флаг -m:

git commit -m "feat: добавлена функция авторизации"

Редактор не откроется. Для многострочных сообщений:

git commit -m "feat: добавлена авторизация

Интеграция с Google OAuth2.
Closes #123"

Краткое введение в режимы vim #

Vim работает в нескольких режимах — это главная причина путаницы:

Нормальный режим (Normal mode) — режим по умолчанию при открытии. Клавиши работают как команды, не как ввод текста. Нажмите ESC для возврата в этот режим из любого другого.

Режим вставки (Insert mode) — текст вводится как в обычном редакторе. Вход: клавиша i, a, o. Виден как -- INSERT -- внизу экрана.

Командный режим (Command mode) — ввод команд через :. Вход из нормального режима нажатием :.

ESC → Нормальный режим
i   → Режим вставки (от текущей позиции)
a   → Режим вставки (после текущей позиции)
:   → Командный режим

Практические примеры #

# Однострочный коммит без редактора (рекомендуется)
git commit -m "feat: добавлена функция входа"

# Если попали в vim и хотите выйти без коммита
# Нажмите ESC, затем наберите :q! и Enter

# Если хотите написать сообщение в vim
# Нажмите i, введите сообщение, нажмите ESC, :wq, Enter

# Установить nano как редактор по умолчанию
git config --global core.editor "nano"

# Установить VS Code
git config --global core.editor "code --wait"

# Один раз использовать nano для текущего коммита
GIT_EDITOR=nano git commit

# Проверить текущий редактор
git config --get core.editor

Более детальное объяснение режимов vim #

Vim имеет несколько режимов работы, и это главная причина путаницы новичков. Понимание режимов — ключ к использованию vim:

Нормальный режим (Normal mode) #

Это режим по умолчанию при открытии. Клавиши работают как команды, не как ввод текста. Вы видите экран и можете навигировать:

[Normal mode] (режим по умолчанию)
h j k l     = навигация (левый, вниз, вверх, правый)
G           = перейти в конец файла
gg          = перейти в начало файла
w           = перейти на следующее слово
b           = перейти на предыдущее слово
dd          = удалить строку
yy          = скопировать строку
p           = вставить
u           = отменить (undo)

Режим вставки (Insert mode) #

Это режим где можно печатать текст как в обычном редакторе:

[Insert mode] -- INSERT --
Вы видите внизу слово "-- INSERT --"
Всё что печатаете добавляется в текст
ESC для выхода

Командный режим (Command mode) #

Режим для ввода команд (двоеточие + команда):

[Command mode] ":"
:w      = сохранить (write)
:q      = выйти (quit)
:wq     = сохранить и выйти
:q!     = выйти БЕЗ сохранения
:set number = показать номера строк

Редактирование сообщения коммита в vim правильно #

Когда вы открываете vim для коммита, там уже есть шаблон:

# При открытии vim в git commit вы видите:

feat: добавлена аутентификация

# Пожалуйста введите сообщение коммита для ваших изменений. Строки,
# начинающиеся с '#', будут проигнорированы, и пустое сообщение
# отменяет коммит.
#
# On branch main
# Changes to be committed:
#       new file:   src/auth.js
#       modified:   README.md
#
~
~

Правильный способ редактирования:

# 1. Нажмите i для входа в режим вставки
# 2. Поместите курсор в начало первой строки
# 3. Напишите сообщение:

feat: добавлена аутентификация

Интеграция с Google OAuth2. Пользователи могут
теперь входить через Google.

Closes #123

# 4. Нажмите ESC чтобы выйти из режима вставки
# 5. Наберите :wq и нажмите Enter

Правила хорошего сообщения коммита:

  • Первая строка: краткое описание (50 символов)
  • Пустая строка
  • Подробное описание (можно несколько абзацев)
  • Ссылки на issues: Closes #123 или Fixes #456

Изменение редактора на nano #

Nano — отличный выбор для новичков. Это самый простой редактор:

# Установить nano как редактор для всех проектов
git config --global core.editor "nano"

# Или только для текущего проекта
git config core.editor "nano"

# Теперь при git commit откроется nano:
# nano: простой редактор, внизу видны команды
# ^X = выход (означает Ctrl+X)
# ^O = сохранить
# ^K = удалить строку

При использовании nano:

Нажмите Ctrl+X чтобы выйти
Когда спросит "Save modified buffer?", нажмите Y (да)
Нажмите Enter чтобы сохранить под текущим именем

Настройка VS Code как редактора git #

VS Code — отличный выбор если вы уже его используете:

# Установить VS Code как редактор
git config --global core.editor "code --wait"

# Проверить что установлено
git config --global core.editor
# code --wait

# Теперь при git commit откроется VS Code
# Напишите сообщение в открывшейся вкладке
# Закройте вкладку (Ctrl+W)
# Git заметит что вы закрыли редактор и продолжит коммит

# Флаг --wait очень важен!
# Без него Git не дождётся пока вы закроете VS Code

Использование других редакторов #

# Atom
git config --global core.editor "atom --wait"

# Sublime Text
git config --global core.editor "subl -w"

# gedit (Linux)
git config --global core.editor "gedit"

# TextEdit (macOS) — не рекомендуется, работает странно
git config --global core.editor "open -W -n -e /Applications/TextEdit.app"

# Emacs
git config --global core.editor "emacs"

# Проверить текущий редактор
git config --global core.editor

# Использовать другой редактор один раз
GIT_EDITOR=nano git commit

# Очистить настройки и вернуть по умолчанию
git config --global --unset core.editor

COMMIT_EDITMSG файл #

Когда вы открываете редактор для коммита, Git создаёт специальный файл:

# Этот файл находится в .git директории
.git/COMMIT_EDITMSG

# Он содержит:
# 1. Текст сообщения коммита (что вы вводите)
# 2. Комментарии (начинаются с #)
# 3. Diff (если используется опция verbose)

# Сохраняется после успешного коммита в:
.git/logs/HEAD

# Если вы потеряли черновик сообщения:
git log -1         # посмотреть последний коммит

Отмена и переделка коммита #

Если вы вышли из редактора без сохранения:

# Коммит отменён, ваши файлы в staging area
git status
# On branch main
# Changes to be committed:
#   new file: src/auth.js

# Попробовать снова
git commit

# Или использовать флаг -m чтобы избежать редактора
git commit -m "feat: add authentication"

# Если коммит уже создан но сообщение неправильное
git commit --amend          # откроется редактор
git commit --amend -m "новое сообщение"  # изменить без редактора

Многострочные сообщения в командной строке #

Если вы предпочитаете избегать редактора, но хотите многострочное сообщение:

# Способ 1: с переносом строк в bash
git commit -m "feat: добавлена аутентификация

Интеграция с Google OAuth2.
Пользователи могут входить через Google.

Closes #123"

# Способ 2: с помощью heredoc
git commit -m "$(cat <<'EOF'
feat: добавлена аутентификация

Интеграция с Google OAuth2.
Пользователи могут входить через Google.

Closes #123
EOF
)"

# Способ 3: через файл
cat > msg.txt << 'EOF'
feat: добавлена аутентификация

Интеграция с Google OAuth2.
Пользователи могут входить через Google.

Closes #123
EOF

git commit -F msg.txt
rm msg.txt

Часто задаваемые вопросы #

Я застрял в vim, что делать? Нажмите ESC (несколько раз если нужно), затем наберите :q! и нажмите Enter. Это всегда сработает.

Как изменить редактор по умолчанию навсегда? git config --global core.editor "nano" или git config --global core.editor "code --wait" для VS Code.

Что произойдёт, если я закрою vim без сохранения? Коммит не будет создан. Git увидит пустое или отменённое сообщение и не создаст коммит. Это безопасно.

Можно ли избежать редактора при коммите? Да, используйте git commit -m "сообщение". Редактор не откроется.

Какой редактор проще всего для начинающих? Nano — самый простой. Подсказки команд видны внизу экрана. Ctrl+X для выхода, Y для сохранения.

Как написать многострочное сообщение без редактора? Используйте переносы строк в кавычках: git commit -m "Первая строка\n\nВторая строка" или используйте git commit -F файл.

Заключение #

Быстрое решение: ESC + :q! + Enter — выйдет из vim без коммита. Или ESC + :wq + Enter — сохранит и создаст коммит.

Долгосрочное решение: смените редактор на nano или VS Code. Или всегда используйте git commit -m "сообщение" и редактор не откроется.

Для изучения всех возможностей git commit читайте полное руководство по git commit.