Seiten

Mittwoch, 1. August 2012

git letzten commit rückgängig machen

Leider vergesse ich oft noch kleine Änderungen, wenn ich einen commit mache. Die sind dann natürlich nicht im commit enthalten, einen extra commit a la "Ach übrigens das fehlt noch" halte ich für Unsinnig, also muss der letzte Commit rückgängig gemacht werden:

Die Erklärung ist eine kurze Zusammenfassung / Übersetzung von dieser stackoverflow.com Antwort.



       (F)
A - B - C
        ^
        HEAD

Das ist der Zustand nach Commit C.
Die Dateien (F) sind im gleichen Zustand wie Commit C, der HEAD Zeiger zeigt auf C.

Wenn C nun vollkommen daneben war und komplett weg muss, dann kann man mit

git reset --hard HEAD~1

diesen Commit vollkommen* entfernen. Das Ergebnis ist dann:

   (F)
A - B
    ^
    HEAD

Das heißt vor Allem, dass auch die Dateien nicht mehr im Zustand C sind und alle Änderungen "verloren" sind.

Oft ist das nicht gewünscht, nicht die Änderungen sondern der Commit sind häufig das Problem:

git reset HEAD~1

entfernt nur den Commit, nicht aber die Änderungen an den Dateien.

       (F)
A - B - C
    ^
    HEAD

git status zeigt nun also die gleichen Unterschiede wie vor Commit C an.

Noch weniger "invasiv" ist

git reset --soft HEAD~1

weil hierbei gleich noch gits Index (also welche Dateien mit in den Commit sollen und welche nicht, plus die Commit Nachricht) beibehalten wird.
Ein git commit würde dann also direkt zur Ausgangslage zurückführen.

*Nachtrag:
Vollkommen weg sind die Änderungen auch dann nicht. Mit

git reflog

kann man sich eine Liste von Commits anzeigen, mit denen in letzter Zeit gearbeitet wurde. Hier müsste dann auch der "zerstörte" Commit zu finden sein, wiederherstellen kann man diesen dann mit

git checkout -b branchMitAltemCommit shaDesZerstörtenCommits

wobei der Commit dann auch gleichzeitig in einen neuen Branch gespeichert wird.
 

1 Kommentar:

  1. ... wenn der letzte Commit aber schon mit push auf einen Server gebracht wurde, dann scheint das so nicht so ganz zu funktionieren, wie ich gerade feststellen musste.

    Mal sehen, vielleicht finde ich da einen besseren Weg als
    ein merge des remote und lokalen Branches und ein erneutes Commit...

    AntwortenLöschen