ПРИМЕЧАНИЕ. Этот ответ изменяет SHA1, поэтому позаботьтесь об его использовании в уже перемещенной ветви. Если вы хотите исправить только написание имени или обновить старую электронную почту, git позволяет вам делать это без переписывания истории с помощью .mailmap
. Смотрите мой другой ответ .
Использование интерактивной ребазы
Вы могли бы сделать
git rebase -i -p <some HEAD before all of your bad commits>
Затем пометьте все ваши плохие коммиты как "edit" в файле rebase. Если вы также хотите изменить свой первый коммит, вы должны вручную добавить его в качестве первой строки в файле rebase (следуйте формату других строк). Затем, когда git просит вас внести изменения в каждый коммит, выполните
git commit --amend --author "New Author Name <email@address.com>"
отредактируйте или просто закройте открывшийся редактор, а затем выполните
git rebase --continue
продолжить ребаз.
Вы можете вообще пропустить открытие редактора, добавив --no-edit
команду так:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Single Commit
Как отмечают некоторые из комментаторов, если вы просто хотите изменить самый последний коммит, команда rebase не нужна. Просто делать
git commit --amend --author "New Author Name <email@address.com>"
Это изменит автора на указанное имя, но для коммиттера будет настроен ваш настроенный пользователь в git config user.name
и git config user.email
. Если вы хотите установить для коммиттера что-то, что вы укажете, это установит и автора, и коммиттера:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Примечание о слиянии коммитов
В моем первоначальном ответе был небольшой недостаток. Если есть какие-либо коммиты слияния между текущим HEAD
и вашим <some HEAD before all your bad commits>
, тогда они git rebase
будут сглажены (и, между прочим, если вы используете GitHub pull-запросы, в вашей истории будет тонна коммитов слияния). Это может очень часто приводить к очень разной истории (поскольку повторяющиеся изменения могут быть «перебазированы»), и в худшем случае это может привести к тому, что git rebase
вас попросят разрешить сложные конфликты слияния (которые, вероятно, уже были разрешены в коммитах слияния). Решением является использование -p
флага to git rebase
, который сохранит структуру слияния вашей истории. Страница man для git rebase
предупреждений о том, что использование -p
и -i
может привести к проблемам, но вBUGS
в разделе написано «Редактирование коммитов и переписывание их коммитов должны работать нормально».
Я добавил -p
к вышеупомянутой команде. Для случая, когда вы просто изменяете самый последний коммит, это не проблема.