0%

Änderungen rückgängig machen · Übung

Ich habe etwas Falsches committet und andere könnten es haben

Du hast etwas committet, und es war falsch. Diesmal ist es kein Tippfehler in der Nachricht: Die Änderung selbst hätte nicht vorgenommen werden sollen. Vielleicht hast du den Commit bereits geteilt, und jemand anderes hat ihn.

Es gibt zwei Wege, einen Commit rückgängig zu machen. Die eigentliche Fähigkeit besteht darin, den richtigen zu wählen. Die Befehle sind der einfache Teil.

Eine Entscheidungshilfe ordnet Arbeitsdateien, bereitgestellte Kopien, private Commits, geteilte Commits und verlorene Zeiger den Befehlen git restore, git restore --staged, git reset, git revert und git reflog zu.

Zuerst den Fehler machen

Du brauchst einen falschen Commit, bevor du einen rückgängig machen kannst. In den vorherigen Lektionen wurde route.txt bereits wiederhergestellt, und scratch.tmp blieb sicher außerhalb der verfolgten Dateien. Ändere den Start der Route auf einen Ort, an dem sie nicht beginnt, und committe es so, als würdest du es für richtig halten:

nano -w route.txt

Ändere die erste Zeile zu Start: Whitehaven. Speichere mit Ctrl-O, Enter und verlasse nano dann mit Ctrl-X, genau wie in Kapitel 2. Committe die Änderung anschließend:

git add route.txt
git commit -m "Correct the start of the route"
git log

Die Wanderung beginnt nicht in Whitehaven. Dieser Commit muss rückgängig gemacht werden.

Die entscheidende Frage

Beantworte eine Frage, bevor du nach einem Befehl greifst:

Hat jemand anderes diesen Commit?

Wenn niemand ihn hat, darfst du deinen Verlauf frei umschreiben. Das macht git reset, und eine kleinere Variante davon hast du schon beim Ersetzen mit amend gesehen.

Wenn jemand ihn hat, ist Umschreiben das falsche Werkzeug. Die andere Kopie des Verlaufs enthält den Commit noch, den du aus deiner entfernt hast. Beide stimmen nicht mehr überein. Das wieder in Ordnung zu bringen, kann einen wirklich unangenehmen Nachmittag kosten, und das lässt sich vermeiden.

Wenn jemand anderes den Commit haben könnte, entfernst du ihn nicht. Du fügst einen neuen Commit hinzu, der seine Wirkung rückgängig macht, und beide bleiben im Verlauf. Dafür ist git revert da.

Durch Hinzufügen rückgängig machen, nicht durch Entfernen

git revert --no-edit HEAD
git log
git status

git revert nimmt einen Commit und erstellt einen neuen Commit, dessen Änderungen genau das Gegenteil bewirken. HEAD bezeichnet den neuesten Commit, den du gerade erstellt hast. --no-edit übernimmt Gits vorgeschlagene Nachricht: das Wort Revert und die ursprüngliche Nachricht in Anführungszeichen. Es öffnet keinen Editor, um eine eigene Nachricht zu schreiben.

git log zeigt jetzt beide Commits: deinen falschen und den Revert, der ihn rückgängig gemacht hat. In der Datei steht wieder Start: Ravenglass. git status meldet keine bereitgestellten oder geänderten verfolgten Dateien. Die private scratch.tmp wird weiterhin als nicht verfolgt aufgeführt, sicher außerhalb beider Commits.

Dieser doppelte Eintrag ist kein unnötiger Ballast. Er ist eine ehrliche Aufzeichnung: Das wurde getan, dann wurde es rückgängig gemacht, und hier steht, wann. Wer den ersten Commit bereits hatte, bekommt einfach den zweiten und gelangt zum selben Zustand wie du.

Was dabei zerstört wird und was nicht

git revert fügt einen neuen Commit zum Verlauf hinzu, statt einen vorhandenen umzuschreiben. Dein erreichbarer Verlauf wird länger, der ursprüngliche Commit bleibt erhalten, und die Kopie jeder anderen Person bleibt gültig. Genau deshalb ist es die richtige Wahl für geteilte Arbeit.

Der Preis dafür ist, dass der Fehler im gemeinsamen Verlauf neben seiner Rücknahme sichtbar bleibt. Manche mögen das nicht. Es ist der Preis dafür, das Repository einer anderen Person nicht durcheinanderzubringen, und das ist ein guter Tausch.

Du hast gestern einen Commit geteilt, und ein Kollege hat ihn bereits. Heute merkst du, dass er falsch war. Welchen Befehl solltest du wählen?

Als Nächstes: der Fall, in dem die Arbeit verschwunden zu sein scheint.