ПРИМІТКА. Ця відповідь змінює SHA1, тому подбайте про використання її на гілці, яка вже була натиснута. Якщо ви хочете лише виправити написання імені або оновити стару електронну пошту, git дозволяє це робити без використання переписування історії .mailmap
. Дивіться іншу мою відповідь .
Використання інтерактивної бази даних
Ви могли б зробити
git rebase -i -p <some HEAD before all of your bad commits>
Потім позначте всі ваші погані зобов'язання як "редагувати" у файлі ребазу. Якщо ви також хочете змінити свою першу комісію, вам доведеться її вручну додати як перший рядок у файлі ребазування (дотримуйтесь формат інших рядків). Потім, коли 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
Єдиний комітет
Як зауважили деякі коментатори, якщо ви просто хочете змінити останню комісію, команда 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 запити на потяг, у вашій історії буде зроблено тонну об'єднань). Це дуже часто може призвести до дуже різної історії (оскільки повторювані зміни можуть бути "відкинуті назад"), і в гіршому випадку це може призвести до того, щоб git rebase
попросити вас вирішити складні конфлікти злиття (які, ймовірно, вже вирішені в комісіях злиття). Рішення полягає у використанні -p
прапора до git rebase
, що збереже структуру злиття вашої історії. Сторінка сторінки git rebase
попереджає, що використання -p
та -i
може призвести до проблем, але вBUGS
У розділі йдеться, що "Редагування комісій та переформатування повідомлень про виконання зобов’язань мають працювати добре"
Я додав -p
до вищевказаної команди. У випадку, коли ви просто змінюєте останню комісію, це не проблема.