HINWEIS: Diese Antwort ändert SHA1s. Achten Sie daher darauf, sie in einem Zweig zu verwenden, der bereits verschoben wurde. Wenn Sie nur die Schreibweise eines Namens korrigieren oder eine alte E-Mail aktualisieren möchten, können Sie dies mit git tun, ohne den Verlauf mit neu zu schreiben .mailmap
. Siehe meine andere Antwort .
Verwenden von Interactive Rebase
Du könntest es tun
git rebase -i -p <some HEAD before all of your bad commits>
Markieren Sie dann alle Ihre fehlerhaften Commits in der Rebase-Datei als "Bearbeiten". Wenn Sie auch Ihr erstes Commit ändern möchten, müssen Sie es manuell als erste Zeile in die Rebase-Datei einfügen (folgen Sie dem Format der anderen Zeilen). Wenn git Sie dann auffordert, jedes Commit zu ändern, tun Sie dies
git commit --amend --author "New Author Name <email@address.com>"
Bearbeiten oder schließen Sie einfach den geöffneten Editor und tun Sie es dann
git rebase --continue
um die Rebase fortzusetzen.
Sie können das Öffnen des Editors hier ganz überspringen, indem Sie anhängen, --no-edit
sodass der Befehl wie folgt lautet:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Single Commit
Wie einige Kommentatoren bemerkt haben, ist der Befehl rebase nicht erforderlich, wenn Sie nur das letzte Commit ändern möchten. Mach einfach
git commit --amend --author "New Author Name <email@address.com>"
Dadurch wird den Autor zu dem angegebenen Namen ändern, aber die Committer werden in Ihren konfigurierten Benutzer eingestellt werden git config user.name
und git config user.email
. Wenn Sie den Committer auf einen von Ihnen angegebenen Wert festlegen möchten, werden sowohl der Autor als auch der Committer festgelegt:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Hinweis zu Merge Commits
In meiner ursprünglichen Antwort gab es einen kleinen Fehler. Wenn es Zusammenführungs-Commits zwischen dem aktuellen HEAD
und Ihrem gibt <some HEAD before all your bad commits>
, git rebase
werden diese abgeflacht (und wenn Sie GitHub-Pull-Anforderungen verwenden, wird es übrigens eine Menge Zusammenführungs-Commits in Ihrem Verlauf geben). Dies kann sehr oft zu einem sehr unterschiedlichen Verlauf führen (da doppelte Änderungen möglicherweise "umbasiert" werden) und im schlimmsten Fall dazu führen, git rebase
dass Sie aufgefordert werden, schwierige Zusammenführungskonflikte zu lösen (die wahrscheinlich bereits in den Zusammenführungs-Commits gelöst wurden). Die Lösung besteht darin, das -p
Flag to zu verwenden git rebase
, um die Zusammenführungsstruktur Ihres Verlaufs beizubehalten. Die Manpage für git rebase
warnt davor, dass die Verwendung -p
und -i
zu Problemen führen kann, aber in derBUGS
In diesem Abschnitt heißt es: "Das Bearbeiten von Commits und das Umformulieren ihrer Commit-Nachrichten sollte einwandfrei funktionieren."
Ich habe -p
den obigen Befehl hinzugefügt . Für den Fall, dass Sie nur das letzte Commit ändern, ist dies kein Problem.