1980 Stimmen

Rückgängig machen von "git commit --amend" anstelle von "git commit"

Ich habe versehentlich meine vorherige Übertragung geändert. Der Commit hätte separat sein sollen, um den Verlauf der Änderungen an einer bestimmten Datei festzuhalten.

Gibt es eine Möglichkeit, diese letzte Übertragung rückgängig zu machen? Wenn ich etwas tue wie git reset --hard HEAD^ wird die erste Übertragung ebenfalls rückgängig gemacht.

(Ich habe noch keine entfernten Verzeichnisse übertragen)

0 Stimmen

wenn Sie die Auswirkungen der einzelnen Schritte überprüfen möchten (entweder bevor Sie die folgenden Antworten ausprobieren, oder wenn Ihnen beim Ausführen eines Schrittes der Kopf schwirrt), versuchen Sie git log --reflog -p -- {{name-of-the-dir-or-file-in-question}} . Es zeigt sowohl die tatsächlichen Änderungen als auch die Commit-Meldungen für jede Aktion.

30voto

Justin Schulz Punkte 417

Möglicherweise ist es erwähnenswert, dass Sie, wenn Sie sich noch in Ihrem Editor mit der Übergabemeldung befinden, die Übergabemeldung löschen können und der Vorgang abgebrochen wird git commit --amend Befehl.

26voto

Arkaitz Jimenez Punkte 21364

Sie können eine Übergabe jederzeit aufteilen, Von der Handbuch

  • Starten Sie ein interaktives Rebase mit git rebase -i commit^, wobei commit der Commit ist, den Sie aufteilen wollen. Eigentlich ist jeder Commit-Bereich geeignet, solange er diesen Commit enthält.
  • Markieren Sie den Commit, den Sie teilen möchten, mit der Aktion "Bearbeiten".
  • Wenn Sie diese Übergabe bearbeiten wollen, führen Sie git reset HEAD^ aus. Der Effekt ist, dass der HEAD um eins zurückgespult wird und der Index entsprechend folgt. Der Arbeitsbaum bleibt jedoch derselbe.
  • Fügen Sie nun die Änderungen in den Index ein, die Sie in der ersten Übertragung haben möchten. Sie können dazu git add (möglicherweise interaktiv) oder git-gui (oder beides) verwenden.
  • Übertragen Sie den jetzt aktuellen Index mit der entsprechenden Übergabemeldung.
  • Wiederholen Sie die letzten beiden Schritte, bis Ihr Arbeitsbaum sauber ist.
  • Setzen Sie den Rebase mit git rebase --continue fort.

32 Stimmen

Viel zu kompliziert. git reflog ist alles, was Sie brauchen

2 Stimmen

Viele Schritte, ja, aber jeder Schritt ist unkompliziert und leicht zu bewerkstelligen. Das hat bei mir funktioniert und bekommt meine Stimme.

5 Stimmen

Zusätzlich erlaubt Ihnen diese Antwort, selektiv die Änderungen auszuwählen, die Sie versehentlich "geändert" haben, was dem Ansatz git reset --soft HEAD@{1} (der mein Problem übrigens gelöst hat) einen zusätzlichen Wert verleiht

23voto

utzcoz Punkte 591

Vielleicht können Sie git reflog um zwei Übertragungen vor amend und nach amend zu erhalten.

Dann verwenden Sie git diff before_commit_id after_commit_id > d.diff um den Unterschied zwischen vor der Änderung und nach der Änderung zu ermitteln.

Nächste Verwendung git checkout before_commit_id zurück zu vor der Übergabe

Und letzte Verwendung git apply d.diff um die von Ihnen vorgenommenen Änderungen wirklich umzusetzen.

Damit ist mein Problem gelöst.

17voto

Pratik Punkte 566

Nachfolgend können Sie den Vorgang rückgängig machen git commit —amend

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

\====================================

Jetzt sind Ihre Änderungen wie zuvor. Sie sind also fertig mit dem Rückgängigmachen für git commit —amend

Jetzt können Sie git push origin <your_branch_name> um sie in den Zweig zu verschieben.

8voto

garrettmac Punkte 8018

Ich bin fast 9 Jahre zu spät dran, aber ich habe nicht gesehen, dass diese Variante erwähnt wurde, die dasselbe bewirkt (es ist eine Art Kombination aus einigen dieser Möglichkeiten, ähnlich wie bei der oberen Antwort ( https://stackoverflow.com/a/1459264/4642530 ).

Suche nach allen abgetrennten Köpfen in der Branche

git reflog show origin/BRANCH_NAME --date=relative

Finden Sie dann den SHA1-Hash

Zurücksetzen auf altes SHA1

git reset --hard SHA1

Dann schieben Sie es wieder hoch.

git push origin BRANCH_NAME

Erledigt.

Damit kehren Sie vollständig zur alten Übertragung zurück.

(einschließlich des Datums des zuvor überschriebenen abgetrennten Commit-Heads)

4 Stimmen

Ja, aber normalerweise möchte ich die --soft um meine Änderungen beizubehalten. Ich möchte nur, dass sie separat übertragen werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X