Как выйти из vim при git commit: решение для новичков
Вы запустили git commit без флага -m, и теперь смотрите на непонятный экран. Курсор стоит, клавиатура не реагирует привычным образом, закрыть окно нельзя — вы в редакторе vim. Это случается с каждым новичком хотя бы раз. Вот как выйти.
Быстрое решение: как выйти из vim #
Если вы открыли vim и хотите выйти без создания коммита (отменить коммит):
ESC
:q!
Enter
Пошагово:
- Нажмите
ESC— это переключит vim в нормальный режим - Наберите
:q!— двоеточие, буква q, восклицательный знак - Нажмите
Enter
Vim закроется, коммит не будет создан.
Если нужно сохранить сообщение и создать коммит #
Чтобы написать сообщение и создать коммит:
i
(напишите сообщение коммита)
ESC
:wq
Enter
Пошагово:
- Нажмите
i— переключит в режим вставки (вверху появится-- INSERT --) - Напишите сообщение коммита в первой строке
- Нажмите
ESC— вернёт в нормальный режим - Наберите
:wq— сохранить и выйти - Нажмите
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.