Git-Tipps: Reset, Checkout und Revert für Fortgeschrittene (Teil 3)

In den ersten beiden Beiträgen zum Thema wurden die Nutzung und die Besonderheiten von git reset, git checkout und git revert auf Commit-Ebene thematisiert (Teil 1, Teil 2). Abschließend wollen wir uns ansehen, wie die ersten beiden dieser Git-Befehle auf Datei-Level zur Anwendung kommen können.

Operationen auf Datei-Level

Die Befehle git reset und git checkout akzeptieren auch einen optionalen Dateipfad als Parameter. Das ändert ihr Verhalten signifikant. Die Kommandos wirken sich nicht mehr auf komplette Snapshots aus, sondern die Operationen sind auf spezifische Dateien beschränkt.

Reset

Mit einem Dateipfad ausgeführt, aktualisiert git reset den gestagten Snapshot, sodass er mit der Version des spezifizierten Commits übereinstimmt. Der Befehl im folgenden Beispiel fetcht die Version von foo.py im vorletzten Commit und stagt ihn für den nächsten Commit:

git reset HEAD~2 foo.py

Wie bei git reset auf Commit-Ebene wird diese Operation für gewöhnlich mit HEAD genutzt. git reset HEAD foo.py unstagt foo.py. Die darin enthaltenen Änderungen sind im Arbeitsverzeichnis weiterhin präsent.

Git Reset mit Dateipfad

Die Optionen --soft, --mixed und --hard haben keine Auswirkungen auf die Datei-Level-Version von git reset, da der gestagte Snapshot immer und das Arbeitsverzeichnis nie aktualisiert wird.

Checkout

Das Auschecken einer Datei ähnelt der Nutzung von git reset mit einem Dateipfad, allerdings wird statt dem Staging-Bereich das Arbeitsverzeichnis aktualisiert. Anders als bei der Commit-Level-Version dieses Befehls wird die HEAD-Referenz nicht bewegt, folglich können wir nicht zwischen Branches wechseln.

Git Checkout mit Dateipfad

Mit dem folgenden Befehl bringen wir die Datei foo.py im Arbeitsverzeichnis in Übereinstimmung mit der im vorletzten Commit:

git checkout HEAD~2 foo.py

Wie beim Commit-Level-Aufruf von git checkout können wir so alte Versionen eines Projekts einsehen – aber der Anwendungsbereich ist auf die spezifizierte Datei limitiert.

Wenn wir die ausgecheckte Datei stagen und committen, hat das den Effekt des Revertings zur alten Version dieser Datei. Dies entfernt alle anschließend erfolgten Änderungen an der Datei, während git revert nur Änderungen rückgängig macht, die mit einem spezifizierten Commit eingebracht wurden.

Auch hier wird oftmals HEAD als Commit-Referenz genutzt. So hat etwa git checkout HEAD foo.py den Effekt, dass nicht gestagte Änderungen an foo.py verworfen werden. Das Verhalten ist dasselbe wie bei git reset HEAD --hard, betrifft jedoch nur die bestimmte Datei.

Zusammenfassung

Damit stehen uns alle Werkzeuge zur Verfügung, die wir benötigen, um Änderungen in einem Git-Repository rückgängig zu machen. git reset, git checkout und git revert können zunächst verwirrend sein, doch wenn wir uns ihre Auswirkungen auf das Arbeitsverzeichnis, den gestagten Snapshot und die Commit-Historie vergegenwärtigen, sollte es uns nicht schwerfallen, den für die aktuelle Entwicklungsaufgabe geeigneten Befehl zu wählen.

Diese kleine Tabelle gibt noch einmal einen Überblick über besprochenen Kommandos und ihre Use Cases:

Befehl Wirkungsbereich Anwendungsfälle
git reset Commit-Level Commits in einem privaten Branch verwerfen oder nicht committete Änderungen entsorgen
git reset Dateiebene Eine Datei unstagen
git checkout Commit-Level Zwischen Branches springen oder alte Snapshots einsehen
git checkout Dateiebene Änderungen im Arbeitsverzeichnis verwerfen
git revert Commit-Level Commits in einem öffentlichen Branch rückgängig machen
git revert Dateiebene -

Git und Stash effektiv und produktiv nutzen? Wir sind Ihr Partner!

Kennen Sie Stash, Atlassians Git-Repository-Managementsystem? Stash bietet eine zentrale Lösung zum Management des gesamten distributierten Codes: Hier kommen alle Git-Repositories im Unternehmen zusammen, hier finden Entwickler immer die letzte offizielle Version eines Projekts, hier können Projektverantwortliche Berechtigungen kontrollieren, um sicherzustellen, dass die richtigen Nutzer Zugriff auf den richtigen Code haben. Möchten Sie mehr erfahren? Wir sind offizieller Vertriebspartner von Atlassian und einer der größten Atlassian Experts Partner weltweit. Gerne unterstützen wir Sie bei der Evaluierung, Lizenzierung und Adaption von Stash.

Übrigens: //SEIBERT/MEDIA bietet auch professionelle Grundlagen- und Aufbau-Workshops zu Git und Atlassian Stash an.

Weiterführende Infos

99 Argumente für Stash als Git-Repository-Manager
Branch-basierte Git-Workflows mit Stash adaptieren
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo
Interview: Die Vorteile von Git in der Software-Entwicklung und die Möglichkeiten von Stash
So funktioniert die Lizenzierung von Atlassian-Produkten