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

Die Befehle git reset, git checkout und git revert gehören zu den nützlichsten Werkzeugen, die Git mitbringt. Sie alle ermöglichen es, Änderungen in einem Repository rückgängig zu machen, wobei die ersten beiden auch genutzt werden können, um sowohl Commits als auch spezifische Dateien zu modifizieren.

Weil sie sich so ähnlich sind, kann man leicht verwechseln, welcher Befehl in welchem Entwicklungsszenario zum Einsatz kommen sollte. Dieses und die folgenden Tutorials vergleichen die am häufigsten auftretenden Konfigurationen von git reset, git checkout und git revert.

Dabei hilft es, wenn wir uns vergegenwärtigen, welche Auswirkungen diese Befehle jeweils auf die drei Hauptkomponenten eines Git-Repositorys haben: Arbeitsverzeichnis, gestagter Snapshot und Commit-Historie.

Operationen auf Commit-Ebene

Die Parameter, mit denen wir git reset und git checkout nutzen, bestimmen ihren Anwendungsbereich. Wenn wir keinen Dateipfad als Parameter hinzufügen, wirken sie sich auf ganze Commits aus. Dies wollen wir uns zunächst genauer ansehen.

Reset

Auf Commit-Ebene ist das Resetting eine Möglichkeit, die Spitze eines Branchs zu einem anderen Commit zu bewegen. Auf diese Weise können wir Commits aus einem Branch entfernen. Das folgende Kommando bewegt beispielsweise den hotfix-Branch um zwei Commits zurück.

git checkout hotfix
git reset HEAD~2

Die beiden Commits, die am Ende des hotfix-Branchs waren, sind nun "baumelnde" Commits. Das bedeutet, dass sie gelöscht werden, wenn Git das nächste Mal eine Speicherbereinigung durchführt. Mit anderen Worten: Wir sagen, dass wir diese Commits wegschmeißen wollen. Das kann wie folgt visualisiert werden:

Git Before Resetting

Vor dem Resetting

Git After Resetting

Nach dem Resetting

git reset ist ein einfacher Weg, um Änderungen zurückzunehmen, die mit Niemandem geteilt wurden. Es ist unser Standardbefehl, wenn wir mit der Arbeit an einem Feature beginnen und irgendwann denken: "Was soll das hier eigentlich werden? Ich fange noch mal von vorne an."

Zusätzlich zum Bewegen des aktuellen Branchs können wir git reset auch nutzen, um den gestagten Snapshot und/oder das Arbeitsverzeichnis zu modifizieren, indem wir eine der folgenden Optionen verwenden:

  • --soft - Der gestagte Snapshot und das Arbeitsverzeichnis bleiben unverändert.
  • --mixed - Der gestagte Snapshot wird in Übereinstimmung mit dem spezifizierten Commit gebracht, das Arbeitsverzeichnis bleibt unverändert. (Das ist die voreingestellte Option.)
  • --hard - Sowohl der gestagte Snapshot als auch das Arbeitsverzeichnis werden aktualisiert, sodass sie dem spezifizierten Commit entsprechen.

Diese Modi definieren also quasi den Geltungsbereich des Befehls git reset:

Git Reset-Modi

Diese Optionen werden oft zusammen mit HEAD als Parameter genutzt. Beispielsweise führt git reset --mixed HEAD zum Unstaging aller Änderungen, während sie im Arbeitsverzeichnis verbleiben. Wenn wir alle nicht committeten Änderungen komplett entsorgen wollen, nutzen wir git reset --hard HEAD. Das sind zwei der gebräuchlichsten Anwendungsfälle für git reset.

Vorsicht ist geboten, wenn wir mit git reset einen anderen Commit außer HEAD ausführen, denn damit wird die Historie des aktuellen Branchs neu geschrieben. Bei einem öffentlichen Branch würde das zu großen Problemen führen.

In den weiteren Teilen dieses Tutorials werden wir uns zunächst mit der Anwendung von git checkout und git revert auf Commit-Ebene befassen, ehe wir dann auf die Nutzung von git reset und git checkout auf Datei-Level eingehen.

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