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

104

Как пользователь 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и скопировать и вставить процесс.

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

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

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

Ответы:

144

После a git resetэтот однострочный файл может это сделать:

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

или даже короче:

git commit -C HEAD@{1}

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

ибизамец
источник
6
Короче:git commit -C@@{1}
Phu Ngo
2
Это фантастическое использование рефлога
Дэвид Манн
24
После сброса устанавливается ORIG_HEAD. Я считаю, git commit --reuse-message=ORIG_HEADчто это самое ясное.
Скотт Якобсен
45

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

Для повторного использования,

--reuse-message=<commit>

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

--reedit-message=<commit>

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

--reset-author
user2718704
источник
1
Отмечено как новое решение, так как оно дает наиболее исчерпывающий ответ. Хотя это решение все еще не решает полностью мои проблемы с «поиском».
bentolor
9

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

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

mart1n
источник
2
При выполнении интерактивной перебазировки вы даже можете использовать fixupинструкцию, чтобы объявить, что более поздняя фиксация предназначена для исправления предыдущей фиксации, и она будет автоматически использовать сообщение фиксации из оригинала, отклоняя сообщение из фиксации фиксации.
qqx
Например, если я хочу повторно объединить принудительно обновленные запросы на вытягивание. Или если фиксация не последняя и не может быть легко исправлена ​​на основе HEAD, и их легче повторить.
bentolor 01
@BenTebulin Что ж, интерактивная перебазировка позволяет вам изменять любую фиксацию в диапазоне указанных коммитов. Не обязательно изменять фиксацию HEAD.
mart1n 02
@ mart1n Спасибо за выделение редактировать в rebase -i. Никогда не использовал его в этом контексте. Для остальных случаев, таких как повторное слияние, другой ответ больше подходит для моего вопроса, поэтому я отметил его как ответ.
bentolor 02
У Intellij есть области, которые работают только с файлами, которые еще не зафиксированы. Полезно сбросить файлы на незафиксированные, чтобы intellij можно было проинструктировать, например, об линтинге файлов, а затем повторно зафиксировать эти файлы с тем же сообщением. поправка не будет работать для этого из-за ограничений области действия intellij.
Дэвид Манн
5

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

Джо
источник
Спасибо - это очень близко к тому, что я искал.
bentolor 02