Frage So machen Sie "git commit --amend" statt "git commit" rückgängig


Ich habe versehentlich mein vorheriges Commit geändert. Das Commit sollte separat sein, um den Verlauf der Änderungen, die ich an einer bestimmten Datei vorgenommen habe, zu protokollieren.

Gibt es eine Möglichkeit, das letzte Commit rückgängig zu machen? Wenn ich sowas mache git reset --hard HEAD^Das erste Commit wird ebenfalls rückgängig gemacht.

(Ich habe noch nicht zu irgendwelchen entfernten Verzeichnissen gedrängt)


942
2017-09-22 09:56


Ursprung


Antworten:


Was Sie tun müssen, ist ein neues Commit mit den gleichen Details wie das aktuelle zu erstellen HEAD Commit, aber mit dem Elternteil als die vorherige Version von HEAD. git reset --soft Verschiebt den Verzweigungszeiger so, dass das nächste Festschreiben über einem anderen Festschreiben stattfindet, von dem der aktuelle Abzweigkopf jetzt ist.

# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before 
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}

# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}

1662
2017-09-22 10:23



benutze die Protokollierung:

git branch fixing-things HEAD@{1}
git reset fixing-things

Sie sollten dann alle Ihre zuvor geänderten Änderungen nur in Ihrer Arbeitskopie haben und erneut committen können

um eine vollständige Liste der vorherigen Indizes anzuzeigen git reflog


101
2017-09-22 10:02



Finden Sie Ihre geänderten Commits durch:

git log --reflog

Hinweis: Sie können hinzufügen --patch um den Körper der Commits für Klarheit zu sehen. Gleich wie git reflog.

dann setze deinen HEAD zu einem früheren Commit zurück an dem Punkt, an dem es in Ordnung war:

git reset SHA1 --hard

Hinweis: Ersetzen SHA1 mit Ihrem echten Commit Hash. Beachten Sie auch, dass dieser Befehl ausgeführt wird verlieren alle nicht festgeschriebenen Änderungen, so dass Sie sie vorher verstauen können.

Dann wählen Sie das andere Commit, das Sie noch brauchen:

git cherry-pick SHA1

32
2018-03-27 01:56



Sie können einen Commit immer teilen, Von dem Handbuch

  • Starten Sie ein interaktives Rebase mit git rebase -i commit ^, wobei commit das Commit ist, das Sie teilen möchten. In der Tat wird jeder Commit-Bereich ausreichen, solange er diesen Commit enthält.
  • Markieren Sie das Commit, das Sie teilen möchten, mit der Aktion "Bearbeiten".
  • Wenn Sie diesen Commit bearbeiten, führen Sie git reset HEAD ^ aus. Der Effekt ist, dass der HEAD um eins zurückgespult wird und der Index folgt. Der Arbeitsbaum bleibt jedoch gleich.
  • Fügen Sie nun die Änderungen dem Index hinzu, den Sie beim ersten Commit haben möchten. Sie können git add (möglicherweise interaktiv) oder git-gui (oder beides) dazu verwenden.
  • Übergeben Sie den jetzt aktuellen Index mit der aktuellen Commit-Nachricht.
  • Wiederholen Sie die letzten beiden Schritte, bis Ihr Arbeitsbaum sauber ist.
  • Setzen Sie die Rebase mit Git Rebase fort - weiter.

20
2017-09-22 10:01



Kann vielleicht verwenden git reflog um zwei Commits vor der Änderung und nach der Änderung zu erhalten.

Dann benutze git diff before_commit_id after_commit_id > d.diff um Unterschiede zwischen vor und nach Änderung zu erhalten.

Nächste Verwendung git checkout before_commit_id zurück zu vor dem Commit

Und letzte Verwendung git apply d.diff um die echte Veränderung anzuwenden, die du getan hast.

Das löst mein Problem.


13
2017-09-20 12:39



Möglicherweise ist es erwähnenswert, dass Sie die Commit - Nachricht löschen können, wenn Sie sich noch mit der Commit - Nachricht in Ihrem Editor befinden git commit --amend Befehl.


12
2018-03-03 18:45



Fast 9 Jahre zu spät, aber nicht gesehen, dass diese Variation das gleiche erreicht (es ist eine Art von einer Kombination von diesen, ähnlich wie Top-Antwort (https://stackoverflow.com/a/1459264/4642530).

Suche alle abgetrennten Köpfe auf dem Zweig

git reflog show origin/BRANCH_NAME --date=relative

Dann finden Sie den SHA1-Hash

Auf alten SHA1 zurücksetzen

git reset --hard SHA1

Dann drück es wieder hoch.

git push origin BRANCH_NAME

Erledigt.

Dadurch kehren Sie vollständig zum alten Commit zurück.

(Einschließlich des Datums des zuvor überschriebenen, freigesetzten Übergabekopfs)


1
2018-06-17 21:55



  1. Checkout zur temporären Verzweigung mit dem letzten Commit

    git branch temp HEAD@{1}

  2. Letztes Commit zurücksetzen

    git reset temp

  3. Jetzt haben Sie alle Dateien, die Sie übergeben, sowie die vorherigen Commits. Überprüfen Sie den Status aller Dateien.

    git status

  4. Setzen Sie Ihre Commit-Dateien von git stage zurück.

    git reset myfile1.js (bald)

  5. Schließen Sie dieses Commit erneut an

    git commit -C HEAD@{1}

  6. Fügen Sie Ihre Dateien hinzu und übergeben Sie sie an das neue Commit.


0
2018-03-04 07:28