git: скасовуйте фіксування посеред введення повідомлення


131

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

Відповіді:


85

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

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

По черзі скопіюйте повідомлення про фіксацію в один із буферів vim.

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


7
Примітка: Вихід із vim за допомогою ": q!" не скасовує комісію, якщо є повідомлення про конфлікт з автоматичним заселенням. Натомість фіксація триватиме, і в повідомленні не буде вказано, які файли мали конфлікти.
stephenbez

write the empty file (an empty commit message will abort the commit)частина працювала як шарм, дякую!
Саша Давиденко

182

Якщо ваш редактор може вийти з кодом помилки - Git скасує комісію. Під час використання VIM введіть

:cq

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


5
Це хороший трюк для переривання файлу, commit --amendоскільки в іншому випадку вам доведеться видалити існуюче повідомлення фіксації та :wq.
Алекс Жасмін

2
Гарний трюк! Однак питання полягало в тому, як зберегти повідомлення про фіксацію, а не видалити його.
Ілля Лінн

так як svn вдається це зробити? на що він дивиться, крім вихідного коду?
Хаїм Герец

1
чудово, коли ви робите інтерактивну базу даних ака-
сквошинг

врятувало мені життя, коли я робив git commit --amendзамість цього git rebase --continueпід час ребазування.
Weishi Zeng

68

Якщо у вас відкрито vim для написання повідомлення про фіксацію, просто видаліть рядки, які не починаються з #, а git скасує вашу комісію

Aborting commit due to empty commit message.

11
Це особливо корисно, коли ви хочете відмінити git počin - імен.
edsko

1
Питання полягало в тому, як відмінити команду, але зберегти повідомлення про виконання. Видалення рядків, які не починаються з #, ефективно видаляє повідомлення про фіксацію, а не зберігає повідомлення про фіксацію. Не впевнений, як це має стільки результатів.
Ілля Лінн

2
ggdGвиріже весь вміст повідомлення, то наступного разу, коли ви запустите, vimви можете просто Pвирізати раніше текст.
oromoiluig

працює з використанням nano, ctrl + k всі рядки, тоді зберегти і вихід припинить
Juh_

9

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


7

Так, це можливо. Для того, щоб здійснити фіксацію, ваш редактор ОБОВ'ЯЗКОВО запише повідомлення про фіксацію у файл .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Заповнить редактор з будь-яким заданим вмістом від / шлях / до / файлу. Однак за замовчуванням це буде миттєво виконувати фіксацію, якщо ви не надасте -eпрапор додатково для редагування .


це працює, але є менш привабливим , оскільки 1) він передбачає I ВПЦ то , де .git папка 2) Я використовую Git worktrees , і з GIT worktrees, .git насправді файл кажучи , де реальна .git папка.
Олександр Птах

@AlexanderBird це неправда ... коли ви хочете зібрати старе повідомлення про фіксацію на кроці 5), вам слід просто вказати відносний шлях (скажімо, ви знаходитесь в /foo/bar/каталозі, відносно кореня проектів), наприкладgit commit -eF ../../.git/COMMIT_MESSAGE
Рудольф Тучек

@AlexanderBird крутий, ще не помітив із особливістю декількох працюючих дерев у git. Thx для підказки! Я вважаю, що єдиним недоліком у цьому є те, що вам доведеться зберігати загальний огляд у голові, що не дозволяє вам зосередитися на фактичному коді. І лише для того, щоб взяти повідомлення про виконання "на те, де я пішов", це трохи важко :)
Рудольф Тучек

1
@AlexanderBird тоді замість :wробити :sav committmpіgit commit -eF committmp
Hashbrown

0

Зазвичай я здійснюю свої зобов'язання в межах IntelliJвикористання наданих терміналів. На жаль, мої зобов'язання вручну:

git commit -m'my message' // etc

тож єдине, що я думаю, що це безпечно зробити - це просто закрити вікно терміналу! Просто виділіть текст, якщо хочете зберегти його, потім скопіюйте та закрийте вікно терміналу.


-2

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

Скажіть, що ви хочете додати зміни до останньої фіксації. Отже, ви робите так, як запропонував @bdolan:

git add files
git commit --amend

Уявіть, що під час написання нового повідомлення Ви шкодуєте, що додали ці файли до цього комітету. Проблема полягає в тому, що ви застрягли у вже збереженому повідомленні про фіксацію, і вихід із редактора (із збереженням або без збереження) додасть ці зміни до останньої фіксації. Якщо повернутись до того пункту, до якого ви були раніше, ці дії вимагають, щоб ви розділили останнє зобов’язання - я б ставку, що ви хочете цього уникнути.

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

Aborting commit due to empty commit message.

І ви зовсім не змінили останнє зобов’язання.


Якщо я зрозумів, що ти кажеш, що це проблема, то ти неправильно; як показано тут: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Тобто: якщо я хочу "скасувати" поправку, тоді я не повинен розділяти попередні зобов'язання. об'єкт фіксації, який був HEAD до внесення змін, зберігається як HEAD@{1}. Крім того, zetta вже запропонував видалити всі рядки без коментарів.
Олександр Птах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.