Die Git-Befehle git reset
, git checkout
und git revert
kann man leicht durcheinanderbringen. Diese Tutorial-Reihe soll helfen, sie voneinander abzugrenzen und Git-Entwickler in die Lage zu versetzen, immer das richtige Kommando für eine spezifische Entwicklungsaufgabe zur Hand zu haben. Nachdem wir uns im ersten Teil git reset
näher angesehen haben, widmen wir uns nun dem Auschecken und dem Reverting.
Checkout
Nach unserem früheren Tutorial zu get checkout
sind wir bereits vertraut mit der Nutzung dieses Befehls auf Commit-Ebene. Wenn wir ihn mit einem Branch-Namen ausführen, können wir zwischen Branches hin und her wechseln.
git checkout hotfix
Intern geschieht dabei nichts weiter, als dass HEAD
zu einem anderen Branch bewegt und das Arbeitsverzeichnis in Übereinstimmung gebracht wird. Da diese Operation potenziell lokale Änderungen überschreiben kann, zwingt uns Git dazu, alle Änderungen zu committen oder im Arbeitsverzeichnis zu verstecken, da sie bei der checkout
-Operation verlorengehen. Anders als git reset
bewegt git checkout
keine Branches umher.
Wir können beliebige Commits auch auschecken, indem wir die Commit-Referenz nutzen statt einen Branch. Es geschieht exakt dasselbe wie beim Auschecken eines Branchs: Die HEAD
-Referenz wird zu dem spezifischen Commit bewegt. Der folgende Befehl checkt zum Beispiel ein Großelter des aktuellen Commits aus:
git checkout HEAD~2
Das ist hilfreich, wenn wir eine alte Version unseres Projekts schnell inspizieren wollen. Da es allerdings keine Branch-Referenz zum aktuellen HEAD
gibt, finden wir uns in einem abgetrennten HEAD
-Status wieder. Das kann gefährlich werden, wenn wir beginnen, neue Commits hinzuzufügen, denn es gibt keine Möglichkeit, zu ihnen zurückzukehren, wenn wir zu einem anderen Branch wechseln. Aus diesem Grund sollten wir immer erst einen neuen Branch erstellen, ehe wir Commits zu einem abgetrennten HEAD
hinzufügen.
Revert
Mit git revert
machen wir einen Commit rückgängig, indem ein neuer Commit erstellt wird. Das ist ein sicherer Weg, Änderungen zurückzunehmen, weil keine Commit-Historie neu geschrieben wird. Im folgenden Beispiel ermitteln wir, welche Änderungen der vorletzte Commit enthält, erstellen einen neuen Commit, der diese Änderungen rückgängig macht, und heften den neuen Commit an ein bestehendes Projekt an:
git checkout hotfix
git revert HEAD~2
Das können wir wie folgt visualisieren:
git reset
modifiziert im Gegensatz dazu die bestehende Commit-Historie. Deshalb sollten wir git revert
einsetzen, wenn wir Änderungen an einem öffentlichen Branch zurücknehmen möchten; git reset
heben wir uns dafür auf, wenn wir Änderungen in einem privaten Branch rückgängig machen wollen.
Am besten verstehen wir git revert
als Werkzeug, committete Änderung zu widerrufen, und git reset
als Weg, nicht committete Änderungen zu verwerfen.
Wie git checkout
hat auch git revert
das Potenzial, Dateien im Arbeitsverzeichnis zu überschreiben. Daher wird uns Git auffordern, Änderungen zu committen oder zu verstecken, die während der revert
-Operation verlorengehen würden.
Im dritten Teil dieses Tutorials sehen wir uns dann an, wie git reset
und git checkout
auf Dateiebene genutzt werden können.
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