webentwicklung-frage-antwort-db.com.de

Versehentlich gesendetes Commit: Nachricht zum Ändern des Git-Commits

In meinem lokalen Repo habe ich ein Commit mit einer falschen Commit-Nachricht.

Ich habe die falsche Festschreibungsmeldung bereits mit git Push Veröffentlicht.

Jetzt hat das Remote-Repo (das von GitHub gehostet wird) auch die falsche Festschreibungsnachricht.

Ich habe es bereits mit git commit --amend Versucht, habe jedoch festgestellt, dass dies in dieser Situation nicht funktioniert, da ich seit dem falschen Commit zusätzliche Commits durchgeführt habe.

Wie würden Sie diese Situation beheben?

65
jonny

Einfachste Lösung (aber lesen Sie bitte die ganze Antwort, bevor Sie dies tun):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. Ändern Sie in dem sich öffnenden Editor pick in reword in der Zeile für das falsche Festschreiben.
  3. Speichern Sie die Datei und schließen Sie den Editor.
  4. Der Editor wird mit der falschen Festschreibungsmeldung erneut geöffnet. Repariere es.
  5. Speichern Sie die Datei und schließen Sie den Editor.
  6. git Push --force, um GitHub zu aktualisieren.

Dies bedeutet, dass Sie eine geänderte Version eines zuvor veröffentlichten Repositorys veröffentlichen. Wenn jemand zwischen dem Zeitpunkt, an dem Sie den Fehler mit der falschen Commit-Nachricht begangen haben, und dem Zeitpunkt, an dem Sie den Fehler behoben haben, aus Ihrem Repo gezogen oder geholt hat, treten später einige Schwierigkeiten auf. Stellen Sie also sicher, dass Sie diese Konsequenz akzeptieren können, bevor Sie dies versuchen.

94
Dan Moulding

Anstatt den gesamten Rebase-Weg für ein Commit zu gehen:

git reset --soft head~
git commit -m "The message you wanted to use"
git Push -f

Sie können die Optionen in der Manpage git-reset sehen.

Für ein Projekt, an dem nur Sie arbeiten, sollte die geänderte Historie kein Problem darstellen.

34
Abizern

Wenn Sie eine alte Festschreibungsnachricht über mehrere Zweige hinweg ändern müssen (d. H. Wenn die Festschreibung mit der fehlerhaften Nachricht in mehreren Zweigen vorhanden ist), möchten Sie sie möglicherweise verwenden

git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all

um die Commit-Nachricht zu ersetzen.

Git erstellt ein temporäres Verzeichnis zum Umschreiben und sichert zusätzlich alte Referenzen in refs/original /.

-f erzwingt die Ausführung der Operation. Dies ist notwendig, wenn das temporäre Verzeichnis bereits vorhanden ist oder wenn bereits Referenzen unter refs/original gespeichert sind. Ist dies nicht der Fall, können Sie dieses Flag löschen.

-- trennt Filter-Branch-Optionen von Revisionsoptionen

--all wird sicherstellen, dass alle Zweige und Tags neu geschrieben werden.

Aufgrund der Sicherung Ihrer alten Referenzen können Sie problemlos in den Status zurückkehren, bevor Sie den Befehl ausführen.

Angenommen, Sie möchten Ihren Master wiederherstellen und in der Verzweigung old_master darauf zugreifen:

git checkout -b old_master refs/original/refs/heads/master

Wenn Sie mit Ihren Änderungen zufrieden sind, verwenden Sie git Push -f, um die Änderungen in Ihr öffentliches Repo zu übertragen.

Beachten Sie, dass Sie Ihre Mitarbeiter darüber informieren sollten, da alle Hashes der Commits, die mit dem ersten geänderten beginnen, geändert wurden.

6
sebers

Wenn Sie den Code nicht an Ihren Remote-Zweig (Github/Bitbucket) weitergeleitet haben, können Sie die Festschreibungsmeldung in der Befehlszeile wie folgt ändern.

 git commit --amend -m "Your new message"

Wenn Sie an einem bestimmten Zweig arbeiten, tun Sie dies.

git commit --amend -m "BRANCH-NAME: new message"

Wenn Sie den Code bereits mit einer falschen Nachricht gesendet haben, müssen Sie beim Ändern der Nachricht vorsichtig sein. Das heißt, nachdem Sie die Commit-Nachricht geändert und erneut versucht haben, sie zu pushen, treten Probleme auf. Befolgen Sie diese Schritte, um es reibungslos zu machen. Bitte lesen Sie vorher die gesamte Antwort

git commit --amend -m "BRANCH-NAME : your new message"

git Push -f Origin BRANCH-NAME                # Not a best practice. Read below why?

Wichtiger Hinweis: Wenn Sie Force Push direkt verwenden, können Codeprobleme auftreten, an denen andere Entwickler im selben Zweig arbeiten. Um Konflikte zu vermeiden, müssen Sie den Code aus Ihrem Zweig ziehen, bevor Sie Push erzwingen ausführen

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

Dies ist die beste Vorgehensweise beim Ändern der Festschreibungsmeldung, wenn diese bereits übermittelt wurde.

2
Prabhakar