wake-up-neo.net

Rückgängigmachen von "git commit --amend" anstelle von "git commit"

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

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

(Ich habe noch keine Remote-Verzeichnisse gepusht)

1134

Sie müssen lediglich ein neues Commit mit denselben Details wie das aktuelle Commit HEAD erstellen, jedoch mit dem übergeordneten Commit als der vorherigen Version von HEAD. git reset --soft verschiebt den Verzweigungszeiger so, dass die nächste Festschreibung über einer anderen Festschreibung erfolgt, als der aktuelle Verzweigungskopf jetzt ist.

# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# [email protected]{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 [email protected]{1}

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

benutze das ref-log :

git branch fixing-things [email protected]{1}
git reset fixing-things

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

um eine vollständige Liste der vorherigen Indizes anzuzeigen, geben Sie git reflog ein.

118
knittl

Finden Sie Ihre geänderten Commits durch:

git log --reflog

Hinweis: Sie können --patch hinzufügen, um den Inhalt der Commits der Übersichtlichkeit halber anzuzeigen. Gleich wie git reflog.

setzen Sie dann Ihr HEAD zu einem Zeitpunkt, zu dem es in Ordnung war, auf einen vorherigen Commit zurück.

git reset SHA1 --hard

Hinweis: Ersetzen SHA1 mit Ihrem echten Festschreibungs-Hash. Beachten Sie auch, dass dieser Befehl alle nicht festgeschriebenen Änderungen verliert, sodass Sie sie möglicherweise vorher aufbewahren können. Alternativ können Sie auch verwenden Sie stattdessen --soft, um die neuesten Änderungen beizubehalten und diese dann festschreiben.

Wählen Sie dann das andere Commit aus, das Sie darüber benötigen:

git cherry-pick SHA1
56
kenorb

Sie können ein Commit immer aufteilen, indem Sie manuell

  • Starten Sie eine interaktive Rebase mit git rebase -i commit ^, wobei commit das Commit ist, das Sie aufteilen möchten. Tatsächlich reicht jeder Festschreibungsbereich aus, solange er diese Festschreibung enthält.
  • Markieren Sie das Commit, das Sie aufteilen möchten, mit der Aktion "Bearbeiten".
  • Wenn Sie das Commit bearbeiten möchten, führen Sie git reset HEAD ^ aus. Der Effekt ist, dass das HEAD um eins zurückgespult wird und der Index dem Beispiel folgt. Der Arbeitsbaum bleibt jedoch derselbe.
  • Fügen Sie nun die Änderungen zu dem Index hinzu, die Sie beim ersten Festschreiben 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 Commit-Nachricht.
  • Wiederholen Sie die letzten beiden Schritte, bis Ihr Arbeitsbaum sauber ist.
  • Setzen Sie die Rebase mit git rebase --continue fort.
23
Arkaitz Jimenez

Vielleicht kann git reflog verwendet werden, um zwei Festschreibungen vor und nach der Änderung zu erhalten.

Verwenden Sie dann git diff before_commit_id after_commit_id > d.diff, um zwischen vor und nach der Änderung zu unterscheiden.

Verwenden Sie als Nächstes git checkout before_commit_id, um vor dem Festschreiben zu zurückzukehren

Und zuletzt verwenden Sie git apply d.diff, um die tatsächliche Änderung anzuwenden, die Sie vorgenommen haben.

Das löst mein Problem.

13
utzcoz

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

13
Justin Schulz

Sie können unten tun, um Ihren git commit —amend rückgängig zu machen.

  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. Du bist also mit dem Rückgängigmachen für git commit —amend fertig.

Jetzt können Sie git Push Origin <your_branch_name> ausführen, um zum Zweig zu pushen.

3
Pratik

Wenn Sie die Festschreibung auf Remote verschoben und dann fälschlicherweise Änderungen an dieser Festschreibung vorgenommen haben, wird das Problem behoben. Geben Sie einen git log aus, um den SHA vor dem Festschreiben zu finden. (Dies setzt voraus, dass remote Origin heißt). Setzen Sie nun diesen Befehl mit diesem SHA ab.

git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone

#save ALL the changes to the stash
git stash

git pull Origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend

git stash pop
#git status reveals only the changes you incorrectly amended

#now you can create your new unamended commit
3
David Sopko

Fast 9 Jahre zu spät, aber diese Variante wurde nicht erwähnt, um dasselbe zu erreichen (es ist eine Art Kombination von ein paar davon, ähnlich wie bei top answer ( https://stackoverflow.com/a/ 1459264/46425 ).

Alle abgenommenen Köpfe auf dem Ast durchsuchen

git reflog show Origin/BRANCH_NAME --date=relative

Finden Sie dann den SHA1-Hash

Zurücksetzen auf alten SHA1

git reset --hard SHA1

Dann schieben Sie es wieder nach oben.

git Push Origin BRANCH_NAME

Fertig.

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

(Einschließlich des Datums des zuvor überschriebenen abgelösten Festschreibungskopfs)

2
garrettmac
  1. Zur temporären Verzweigung mit letzter Festschreibung auschecken

    git branch temp [email protected]{1}

  2. Letzten Commit zurücksetzen

    git reset temp

  3. Jetzt haben Sie alle Dateien, für die Sie einen Commit durchgeführt haben, sowie den vorherigen Commit. Überprüfen Sie den Status aller Dateien.

    git status

  4. Setzen Sie Ihre Commit-Dateien von Git Stage zurück.

    git reset myfile1.js (so weiter)

  5. Fügen Sie dieses Commit erneut hinzu

    git commit -C [email protected]{1}

  6. Fügen Sie Ihre Dateien hinzu und weisen Sie sie einem neuen Commit zu.

1