W3docs

git commit --amend

Nützliche Informationen über den Befehl git commit --amend, seine Verwendungsmöglichkeiten und praktische Beispiele.

Was git commit --amend bewirkt

Es passiert leicht, einen Commit abzuschließen und sofort einen Tippfehler in der Nachricht zu bemerken oder festzustellen, dass man vergessen hat, eine Datei zu stagen. Der Befehl git commit --amend ist der schnellste Weg, solche Fehler zu beheben: Er ermöglicht das Bearbeiten des letzten Commits auf dem aktuellen Branch.

Anstatt einen kleinen Folge-Commit obenauf zu stapeln, fügt --amend die gestagten Änderungen (und optional eine neue Nachricht) in den vorherigen Commit ein. Das Ergebnis ist ein einziger, sauberer Commit, der so aussieht, als wäre er beim ersten Mal richtig erstellt worden.

git commit --amend

Es ersetzt den Commit, es bearbeitet ihn nicht

Dies ist das Wichtigste, was man über --amend verstehen muss. Git-Commits sind unveränderlich, daher kann Git einen bestehenden Commit nicht wirklich ändern. Stattdessen erstellt --amend einen brandneuen Commit aus dem aktuellen Tree und dem übergeordneten Commit des alten Commits und verschiebt dann den Branch-Zeiger darauf. Der ursprüngliche Commit bleibt ohne Referenz (unreferenziert), bis die Garbage Collection ihn schließlich entfernt.

Da der neue Commit einen anderen Snapshot und/oder eine andere Nachricht hat, erhält er auch einen anderen Commit-Hash. Diese eine Tatsache erklärt alle folgenden Regeln, einschließlich der Frage, warum das Amenden von geteilten Commits gefährlich ist.

Die Nachricht des letzten Commits ändern

Wenn Sie einen Commit mit einer falschen oder unklaren Nachricht erstellt haben, führen Sie git commit --amend aus, um sie neu zu schreiben, ohne den Snapshot zu berühren. Übergeben Sie die neue Nachricht direkt mit -m, um den Editor zu überspringen:

git commit --amend -m "Fix typo in login validation"

Führen Sie git commit --amend ohne Optionen aus, und Git öffnet Ihren Editor mit der alten Nachricht vorausgefüllt, sodass Sie sie interaktiv bearbeiten können. Dies ist praktisch für längere Nachrichten mit einem Textkörper.

Vergessene Änderungen zum letzten Commit hinzufügen

Angenommen, Sie wollten zwei Dateien in einem einzigen Snapshot committen, haben aber vergessen, eine davon zu stagen. Stagen Sie die fehlende Datei und amenden Sie dann:

# You edit project.py and text.py, but only commit project.py
git add project.py
git commit -m "Add data processing helpers"

# You realize text.py belongs in that same commit
git add text.py
git commit --amend --no-edit

Das Flag --no-edit behält die vorhandene Commit-Nachricht bei, sodass Git die neu gestagten text.py still in den vorherigen Commit einfügt. Ohne --no-edit öffnet sich Ihr Editor, damit Sie die Nachricht gleichzeitig aktualisieren können.

Sie können beides kombinieren: die Nachricht ändern und vergessene Dateien in einem Schritt einschließen.

git add forgotten-file.js
git commit --amend -m "Add feature with all required files"

Das Ergebnis mit git log bestätigen

Untersuchen Sie nach dem Amenden den Branch mit git log, um zu überprüfen, ob sich der Hash geändert hat und der alte Commit nicht mehr in der History vorhanden ist:

git log --oneline -1

Ein anderer kurzer Hash neben Ihrer Nachricht bestätigt, dass durch das Amenden ein neuer Commit erstellt wurde, anstatt den alten direkt zu bearbeiten.

Häufige Fallstricke

  • --amend betrifft nur den letzten Commit. Um einen älteren Commit umzuschreiben, verwenden Sie stattdessen ein interaktives Rebase (git rebase -i).
  • Alles, was nicht gestagt ist, bleibt außen vor. Das Amenden committet den aktuellen Index, sodass nicht gestagten Änderungen uncommitted bleiben. Führen Sie zuerst git add aus.
  • Das Autor-Datum wird standardmäßig beibehalten, aber das Committer-Datum wird aktualisiert. Fügen Sie --reset-author hinzu, wenn Sie auch die Autor-Identität und das Datum aktualisieren möchten.

Amenden von bereits gepushten Commits vermeiden

Da das Amenden einen Commit mit einem neuen Hash erzeugt, stimmt der umgeschriebene Commit nicht mehr mit dem überein, was andere heruntergeladen haben. Amenden Sie niemals einen Commit, der bereits gepusht und mit Teammitgliedern geteilt wurde: Ihre History zeigt noch auf den alten Hash, und ein normaler git push wird abgelehnt. Ein erzwungener Push (git push --force) kann dann deren Arbeit überschreiben oder duplizieren.

Die Gefahr ist dieselbe wie beim Zurücksetzen eines öffentlichen Snapshots: Beide schreiben eine History um, von der andere abhängen. Halten Sie --amend für lokale, nicht gepushte Commits, und Sie vermeiden das Problem vollständig.

Warnung

Amenden Sie nur Commits, die sich ausschließlich auf Ihrem Rechner befinden. Sobald ein Commit gepusht und von anderen gepullt wurde, wird das Umschreiben mit --amend deren History beschädigen.

Übung

Übung
Was sind die korrekten Aussagen über den Befehl `git commit --amend`?
Was sind die korrekten Aussagen über den Befehl `git commit --amend`?
Was this page helpful?