git: прервать коммит в середине сообщения - PullRequest
113 голосов
/ 05 февраля 2012

Я нахожусь в процессе совершения.Я напечатал сообщение о коммите в vim.Теперь я вспомнил, что мне нужно что-то изменить.Я понимаю, что есть другие варианты для достижения того, чего я хочу, но я хочу знать, есть ли способ прервать коммит, но при этом сохранить сообщение о коммите, которое я уже набрал.

Ответы [ 6 ]

158 голосов
/ 25 января 2015

Если ваш редактор может выйти с кодом ошибки - Git прервет коммит. При использовании VIM введите

:cq

для выхода с ненулевым кодом ошибки и отмены фиксации.

79 голосов
/ 05 февраля 2012

Да.Запишите сообщение фиксации в другой файл (:w /some/other/path.txt).Затем выйдите из редактора без сохранения (:q!).Если вы ранее сохранили файл по его первоначальному пути, удалите все и сначала запишите пустой файл (пустое сообщение о фиксации прервет фиксацию).

Теперь, когда вы будете готовы зафиксировать «для реальных»,используйте файл сообщения, который вы сохранили по альтернативному пути.

Альтернативно, скопируйте сообщение коммита в один из буферов vim.

Стоит отметить, что вам действительно не нужно делатьэто вообще : commit --amend позволяет вам изменять коммит после того, как он сделан, поэтому простое решение - создать коммит с тем, что у вас есть, а затем исправить его перед нажатием.Вы можете даже просто завершить фиксацию в ее поврежденном состоянии, reset HEAD~ (сбрасывает вас в состояние, в котором находилась ваша рабочая копия до фиксации), исправить вашу рабочую копию, а затем commit -a -c HEAD@{1}, чтобы использовать старое сообщение о фиксации.

66 голосов
/ 26 июля 2014

Если вы открыли vim, чтобы написать сообщение о коммите, просто удалите строки, которые не начинаются с # , и git прервет ваш коммит

Aborting commit due to empty commit message.
9 голосов
/ 05 февраля 2012

Хотя вы можете прервать коммит, другой подход заключается в изменении коммита после. Просто зафиксируйте свою текущую работу, затем внесите любые дополнительные изменения, git add их, затем выполните git commit --amend. Вы вернетесь обратно в редактор сообщений фиксации, и при сохранении в коммит будут внесены изменения, включающие дополнительные изменения и ваше новое сообщение фиксации.

5 голосов
/ 02 января 2017

Да, это возможно. Для фиксации ваш редактор ДОЛЖЕН записать сообщение фиксации в файл .git/COMMIT_EDITMSG и выйти с кодом статуса 0.

Так что, если вы используете VI / VIM, вы можете сделать следующее ...

  1. Напишите ваше сообщение о коммите.
  2. Сохранить сообщение фиксации с помощью :w (по умолчанию текущее содержимое будет сохранено в .git/COMMIT_EDITMSG)
  3. Выйдите из редактора с ошибкой :cq
  4. ... делайте то, что вы должны делать ... даже добавляйте / удаляйте файлы в области подготовки.
  5. Продолжите редактирование существующего сообщения о коммите с помощью git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file заполнит редактор любым заданным содержимым из / path / to / file. Однако по умолчанию это мгновенно выполнит фиксацию, если вы не укажете флаг -e дополнительно для редактирования .

0 голосов
/ 05 июня 2016

@ bdonlan ответ хорош для этого вопроса, но я укажу на ситуацию, когда вам может понадобиться лучшее решение.

Скажем, вы хотите добавить изменения в последний коммит. Итак, вы делаете, как предложил @bdolan:

git add files
git commit --amend

Представьте, что во время написания нового сообщения вы сожалеете о добавлении этих файлов в этот коммит. Проблема в том, что вы застряли с уже сохраненным сообщением о фиксации, и выход из редактора (с сохранением или без) добавит эти изменения к последнему подтверждению. Возвращаясь к тому состоянию, в котором вы находились до того, как эти действия потребовали от вас разделить последний коммит - держу пари, что вы хотите избежать этого.

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

Aborting commit due to empty commit message.

И вы совсем не изменили последний коммит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...