Git: abort commit в середине ввода сообщения

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

Ответ 1

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

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

В качестве альтернативы скопируйте сообщение фиксации в один из буферов vim.

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

Ответ 2

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

:cq

чтобы выйти с ненулевым кодом ошибки и прервать фиксацию.

Ответ 3

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

Aborting commit due to empty commit message.

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

Предположим, вы хотите добавить изменения к последнему фиксации. Так вы делаете, как @bdolan предложил:

git add files
git commit --amend

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

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

Aborting commit due to empty commit message.

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