Как изменить коммит без изменения сообщения коммита (повторное использование предыдущего)?

657

Есть ли способ изменить коммит без vi(или вашего $EDITOR) всплывающего окна с возможностью изменить ваше сообщение коммита, но просто повторно использовать предыдущее сообщение?

Шридхар Сарнобат
источник
6
Я бы понизил свой собственный вопрос после того, как усвоил трудный путь к изменению.
Шридхар Сарнобат
28
Пока вы соблюдаете определенные правила (например, не вносите поправки в то, что уже выдвинуто), нет никаких причин, по которым исправление должно быть плохим.
Paullb
3
Поправки с фиксацией не должны использоваться для периодической фиксации работы во время одного логического изменения. Для этого необходимо совершить локально правильно , а затем сквош фиксации истории когда - то законченный (@ Шридхар-Sarnobat)
DBCerigo
3
Я полностью согласен с @DBCerigo. Единственная ситуация, которую я считаю полезным для внесения поправок, - это когда я забыл поместить файл в предыдущий коммит (например, потому что он новый и поэтому не запускается автоматически при запуске git commit -a) и хочу задним числом зафиксировать его.
Шридхар Сарнобат
1
В другой раз внесение изменений полезно, даже если вы признаете опасность изменения истории, если вы недовольны своим последним сообщением о коммите и хотите перефразировать его без необходимости перебазирования.
Шридхар Сарнобат

Ответы:

1011

Начиная с версии git 1.7.9, вы также можете использовать git commit --amend --no-editсвой результат.

Обратите внимание, что это не будет включать метаданные из другого коммита, такие как временная метка, которая может иметь или не иметь важного значения для вас.

Shaggie
источник
42
Вы также можете упростить использование флага по умолчанию --no-edit по умолчанию, добавив псевдоним: "modify = commit -a --amend --no-edit"
Jherico,
1
@Jherico Я бы предложил удалить -a. Пожалуйста, делайте атомарные коммиты, это намного проще для обзора или перебазирования :)
frouo
120

git commit -C HEAD --amendбудет делать то, что вы хотите. -CОпция принимает метаданные из другой фиксации.

Энди Росс
источник
15
Просто чтобы добавить к ответу Энди. Если это то, что вы делаете часто, то вы можете настроить для него псевдоним git config --global alias.amend 'commit --amend -C HEAD'. Затем вы можете использовать git amendв качестве ярлыка.
mikej
9
Да ладно, не ленитесь, обновите git и используйте встроенную команду, которую предлагает Shaggle! Плюс один для опции -C.
Димитрис Балтас
4
Не только метка времени, но и информация об авторстве!
user1338062
3
@RyanCastner Действительно, комментарий, на который вы ссылаетесь, был с 2013 года. В текущей версии git --amend, даже без какой-либо опции, сохраняется дата автора (но изменяется дата фиксации). Таким образом, я удалил свой старый комментарий.
Рубен Верборг
2
На самом деле этот ответ ценен по-другому, даже если это не принятый ответ. В отличие от другого ответа, вам не нужно использовать —amend. Вы можете создать новый коммит, но использовать то же сообщение, что и предыдущий коммит. Это может показаться бесполезным, но мое сообщение о фиксации по умолчанию, когда я просто сохраняю свою работу без необходимости придумывать хорошее сообщение о —message=“Work in progress (untested)”
коммите
67

Другая (глупая) возможность - git commit --amend <<< :wqесли у вас есть vi (m) as $EDITOR.

Galva
источник
39
Даже если это не является необходимым для этого варианта использования, я не знал, что вы можете передать vim. Это открывает некоторые интригующие возможности. Отличный совет.
Шридхар Сарнобат
6
... <<< ZZможет быть, даже меньше печатать;)
Руслан
6
..и еще меньше - ... <<< :x:)
skwisgaar
3
Я не думаю, что это глупо. Это отличный способ улучшить рабочий процесс для любой команды, которая открывает vi.
B Семь
12
тройные угловые скобки. это новое
oligofren
16

Чтобы расширить принятый ответ, вы также можете сделать:

git commit --amend --no-edit -a

добавить в настоящее время измененные файлы.

Rambatino
источник
11

Использование принятого ответа для создания псевдонима

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

тогда вы можете сделать

git oops

и он добавит все, и изменить, используя то же сообщение

или

git oops -m "new message"

изменить замену сообщения

aljgom
источник