Kapitel 4 · Übung
Änderungen rückgängig machen
Ich habe eine Datei geändert und möchte die alte Version zurück
Du hast ein Repository mit ein paar Commits, hast eine Datei geändert, und die Änderung war falsch. Die Änderung an dieser Datei ist weder committet noch bereitgestellt. Du möchtest die Datei einfach wieder so haben wie vorher.
Das ist der häufigste Fall beim Rückgängigmachen. Die gute Nachricht: Es ist auch der sicherste, weil Git bereits eine Kopie der alten Version hat.
Nachsehen, bevor du etwas anfasst
Das Repository in deinem Terminal enthält einen kleinen Wanderführer. Jemand hat daran gearbeitet. Frage Git zuerst, was anders ist:
git status
git diff
git status gruppiert, was bereitgestellt ist, was geändert, aber noch nicht bereitgestellt ist und was nicht verfolgt wird. Die geänderten Zeilen zeigt es nicht. Bevor du etwas rückgängig machst, möchtest du sie sehen.
git diff zeigt sie dir. Es gibt die geänderten Zeilen aus und markiert jede mit -, wenn sie vorher vorhanden war und entfällt, oder mit +, wenn sie neu ist. Eine unveränderte Datei erzeugt gar keine Ausgabe. Deshalb ist eine leere Antwort von git diff eine nützliche Antwort.
In Kapitel 3 hast du Diffs zwischen zwei gespeicherten Commits gelesen. Ohne Commit-Angaben, wie hier, vergleicht git diff den Arbeitsbaum mit der Staging-Area. Von route.txt ist keine Änderung bereitgestellt. Die bereitgestellte Version stimmt deshalb noch mit dem neuesten Commit überein, und dieser Diff zeigt die unerwünschte Bearbeitung. Mehr brauchst du nicht, um sie sicher rückgängig zu machen.
Du solltest sehen, dass in route.txt die Entfernung von 11km auf 110km geändert wurde. Das ist der Fehler. Es ist eine echte Wanderroute, und 110km sind kein Tagesausflug.
Die Datei wiederherstellen
Der Befehl heißt git restore. Er überschreibt die Datei in deinem Arbeitsbaum mit einer bekanntermaßen richtigen Kopie, die Git bereits besitzt.
Welche Kopie das ist, verdient eine kurze Erklärung, denn später führt das zu Missverständnissen. Standardmäßig nimmt git restore die Version aus der Staging-Area. Hier ist von route.txt keine Änderung bereitgestellt. Die Version dort entspricht deshalb noch dem neuesten Commit, und das Wiederherstellen bringt die committete Version zurück. Sobald du laufende Arbeit bereitstellst, sind beide nicht mehr gleich. Mit der Option --source kannst du angeben, welche du meinst.
git restore route.txt
git status
git diff
git restore route.txt benennt die eine Datei, die wiederhergestellt werden soll. Das zweite git status sollte route.txt nicht mehr erwähnen, und git diff sollte gar nichts ausgeben, weil kein Unterschied mehr vorhanden ist.
Was dabei zerstört wird und was nicht
Sei dir über die Wirkung im Klaren, denn dieser Befehl kann nicht committete Arbeit tatsächlich verwerfen.
git restore verwirft deine nicht committete Änderung an dieser Datei endgültig. Die Änderung auf 110km steht in keinem Commit. Git hatte deshalb nie eine Kopie davon, und keine spätere Lektion in diesem Kapitel kann sie zurückholen. Das ist der Tausch: Du bekommst die alte Version, weil du die neue aufgibst.
Deinen Verlauf kann der Befehl nicht beschädigen. Er fasst keine Commits an, verschiebt keinen Branch und betrifft nur die Pfade, die du angibst. Eine nicht genannte Datei bleibt unverändert.
Merke dir diese Regel: git restore ist für committete Arbeit sicher und für nicht committete Arbeit endgültig. Wenn du nicht sicher bist, ob die Änderung weg soll, führe zuerst git diff aus und lies, was du verlieren würdest.
Du führst git restore route.txt in einem Repository aus, in dem du auch notes.md bearbeitet hast. Was passiert mit notes.md?
Als Nächstes: dieselbe Situation, einen Schritt weiter, wenn die Änderung, die du rückgängig machen möchtest, bereits bereitgestellt ist.