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 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
:
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