Git: как повторно использовать/сохранять сообщения фиксации после «git reset»?

Как пользователь Git, я регулярно сталкиваюсь с ситуацией, когда мне нужно переработать один или несколько коммитов таким образом, чтобы они не вписывались в --amend или rebase -i с коммитами исправления. Обычно я бы сделал что-то вроде

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Я очень серьезно отношусь к разумно составленным сообщениям коммитов. Обычно они содержат более крупный текст со ссылками и обоснованием изменений. До сих пор меня очень раздражал длительный процесс восстановления моего старого сообщения коммита с помощью несортированного процесса git reflog, git log и копирования и вставки.

Есть ли лучшее, чтобы справиться с этим? А как быть, если мой содержит более одного коммита?

Редактировать: Немного подумав об этом, я думаю, что мне нужна некоторая git stash-подобная функциональность для сообщений коммитов, где коммиты исправления/изменения не подходят.


person bentolor    schedule 31.05.2013    source источник
comment
Если бы все, что вы сделали, было git reset head~1, разве ваше старое сообщение фиксации не было бы просто второй записью в reflog?   -  person    schedule 31.05.2013
comment
Да, но как я могу повторно использовать сообщение без копирования и вставки (что обычно требует ручного удаления отступов)   -  person bentolor    schedule 02.06.2013
comment
В настоящее время просто откройте gitk. Таким образом, вам даже не придется использовать reflog. В качестве альтернативы используйте rev-parse <branch>, чтобы получить свой хеш перед сбросом, и используйте ответ от ibizaman.   -  person cst1992    schedule 18.11.2016


Ответы (4)


После git reset это может сделать однострочник:

git commit --reuse-message=HEAD@{1}

или еще короче:

git commit -C HEAD@{1}

Вы можете использовать другие параметры, предоставленные @user2718704.

person ibizaman    schedule 19.09.2014
comment
Короче: git commit -C@@{1} - person Phu Ngo; 24.07.2018
comment
Это фантастическое использование reflog - person David Mann; 11.09.2018
comment
После сброса устанавливается ORIG_HEAD. Я считаю git commit --reuse-message=ORIG_HEAD наиболее ясным. - person Scott Jacobsen; 11.04.2019

При запуске команды «git commit» вы должны проверить следующие параметры:

Чтобы повторно использовать,

--reuse-message=<commit>

Чтобы редактировать при повторном использовании,

--reedit-message=<commit>

Чтобы изменить автора,

--reset-author
person user2718704    schedule 26.08.2013
comment
Отметил это как новое решение, так как это дало наиболее полный ответ. Хотя это решение все еще не полностью решает мои проблемы с «поиском». - person bentolor; 27.08.2013

Зачем сбрасывать, если можно взломать, исправить, взломать и потом просто запустить git commit --amend --no-edit; таким образом, сохраняя исходное сообщение коммита.

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

person mart1n    schedule 31.05.2013
comment
При выполнении интерактивной перебазировки вы даже можете использовать инструкцию fixup, чтобы объявить, что более поздняя фиксация должна исправить предыдущую фиксацию, и она будет автоматически использовать сообщение фиксации из оригинала, отбрасывая сообщение фиксации исправления. - person qqx; 31.05.2013
comment
Например, если я хочу повторно объединить принудительно обновленные запросы на извлечение. Или если коммит не последний и его нельзя легко исправить на основе HEAD и его проще переделать. - person bentolor; 02.06.2013
comment
@BenTebulin Ну, интерактивная перебазировка позволяет вам изменять любую фиксацию в диапазоне указанных коммитов. Это не строго коммит HEAD, который должен быть изменен. - person mart1n; 02.06.2013
comment
@ mart1n Спасибо, что выделили edit в rebase -i. Никогда не использовал его в этом контексте. Для остальных случаев, таких как повторное слияние, другой ответ больше подходит для моего вопроса, поэтому я отметил его как ответ. - person bentolor; 02.06.2013
comment
Intellij имеет области, которые работают только с файлами, которые еще не были зафиксированы. Полезно сбросить файлы до незафиксированных, чтобы Intellij можно было поручить, например, проверить файлы, а затем повторно зафиксировать эти файлы с тем же сообщением. изменение не будет работать для этого из-за ограничений области видимости Intellij. - person David Mann; 11.09.2018

Вы можете рассмотреть git commit --reset-author -c <commit>, чтобы повторно использовать сообщение о коммите с редактированием и текущим временем.

person Joe    schedule 02.06.2013
comment
Спасибо - это очень близко к тому, что я искал. - person bentolor; 02.06.2013