Git – Git Reset – Änderungen rückgängig machen
Der Begriff Reset steht für das Rückgängigmachen von Änderungen. In Git gibt es dafür den Befehl git reset. Der Befehl kennt drei Optionen, um Änderungen rückgängig zu machen:
- Soft
- Mixed
- Hard
Git benutzt einen Index (Staging-Bereich), HEAD und ein Arbeitsverzeichnis, um Commits zu erstellen und rückgängig zu machen.
- Im Arbeitsverzeichnis kannst du die Datei ändern, und du kannst in den Index gestaget werden.
- Im Staging-Bereich kannst du auswählen, was du in deinen nächsten Commit einfügen möchtest.
- Ein Commit-Objekt ist eine kryptografisch gehashte Version des Inhalts. Es hat einige Metadaten und Punkte, die benutzt werden, um die vorherigen Commits einzuschalten.
Lasst uns die verschiedenen Verwendungen des git reset Befehls besser verstehen.
Git Reset Hard
Es wird zuerst den Head verschieben und den Index mit dem Inhalt der Commits aktualisieren. Es ist die direkteste, unsicherste und am häufigsten verwendete Option. Die Option --hard ändert die Commit-History, und die Verweisziele werden auf den angegebenen Commit aktualisiert. Dann müssen der gestagete Index und das Arbeitsverzeichnis zurückgesetzt werden, um mit dem des angegebenen Commits übereinzustimmen. Alle vorher ausstehenden Commits im Staging-Index und im Arbeitsverzeichnis werden zurückgesetzt, damit sie mit dem Commit-Baum übereinstimmen. Das bedeutet, dass alle wartenden Arbeiten verloren gehen.
Lasst uns die Option --hard an einem Beispiel verstehen. Angenommen, ich habe eine neue Datei zu meinem bestehenden Repository hinzugefügt. Um eine neue Datei zum Repository hinzuzufügen, führe den unten stehenden Befehl aus:
git add <Dateiname>
Um den Status des Repositorys zu überprüfen, führe den unten stehenden Befehl aus:
git status
Um den Status des Heads und der vorherigen Commits zu überprüfen, führe den unten stehenden Befehl aus:
git log
Hier die Prozedur in Git Bash:
In der obigen Ausgabe habe ich meine Datei landing-page.txt leicht geändert und mit dem "git add" Befehl gestaged. Ich habe dann den Status des Repositorys überprüft. Wir können sehen, dass sich die aktuelle HEAD-Position noch nicht geändert hat, weil ich die Änderungen nicht committed habe. Jetzt werde ich die Option reset --hard ausführen. Der Befehl git reset --hard wie folgt aufgerufen:
git reset --hard
Output:
HEAD is now at c48ed7c Revert "Landing Page Update Feature1 Branch"
Hier als Screenshot aus Git Bash:
Die Option --hard setzt die Änderungen der Dateien zurück und passt die Position des Kopfes vor den letzten Änderungen an. Sie wird die gemachten Änderungen aus dem Staging-Bereich entfernen.
Der "Reset Hard"-Modus führt kurzgesagt folgende Operationen aus:
- Er bewegt den HEAD-Zeiger.
- Er wird die Staging-Area mit dem Inhalt, auf den der HEAD zeigt, aktualisieren.
- Er wird das Arbeitsverzeichnis aktualisieren, damit es mit dem gestageten Bereich übereinstimmt.
Git Reset Mixed
Der "Mixed Reset" ist die Standardoption des Git-Reset-Befehls. Wenn wir kein Argument weitergeben würden, dann wird der Befehl git reset als --mixed ausgeführt. Der Staging-Bereich wird hier ebenfalls auf den Status eines bestimmten Commits zurückgesetzt. Die rückgängig gemachten Änderungen werden in das Arbeitsverzeichnis übertragen.
Hier ein Beispiel aus der Praxis:
Lass uns eine neue Datei erstellen, sagen wir website1.txt. Überprüfen wir den Status des Repositorys. Führe dafür den folgenden Befehl aus:
git status
Füge die Datei jetzt mit "git add" in den Staging-Bereich ein:
git add <file name>
Der Output sieht ungefähr so aus:
Untracked files:
(use "git add <file>..." to include in what will be committed)
meine-todoapp/
todo-liste/
website1.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git add website1.txt
In Git Bash sieht das Gleiche so aus:
Ich habe die neue Datei website1.txt jetzt zu meinem lokalen Repository hinzugefügt. Nun werden wir den Befehl git reset mixed auf diesem Repository ausführen:
git reset --mixed
Alternativ können wir auch nur git reset aufrufen:
git reset
Der obige Befehl setzt den Status des HEAD zurück und löscht Daten aus dem Staging-Bereich nicht, die mit der Position des HEAD übereinstimmen.
Der Output sieht ungefähr so aus:
Untracked files:
(use "git add <file>..." to include in what will be committed)
website1.txt
nothing added to commit but untracked files present (use "git add" to track)
In unserem Output können wir sehen, dass wir die Position des HEAD zurückgesetzt haben, indem wir den Befehl git reset -mixed ausgeführt haben. Außerdem haben wir den Status des Repositorys überprüft. Wie wir sehen können, wurde der Status des Repositorys durch diesen Befehl nicht verändert.
Es sollte dadurch klar werden, dass der Mixed-Modus keine Daten aus dem Staging-Bereich löscht.
Der Reset Mixed-Modus führt im Grunde die folgenden Operationen aus:
- Er bewegt den HEAD-Pointer
- Er wird den Staging-Bereich mit dem Inhalt, auf den der HEAD zeigt, aktualisieren.
Der Mixed-Modus wird nicht das Arbeitsverzeichnis aktualisieren, wie es der Git-Hard-Modus macht
Git Reset HEAD (der Soft-Reset)
Der Soft-Modus berührt die Indexdatei oder den Arbeitsbaum überhaupt nicht, aber er setzt den HEAD zurück, wie alle anderen Modi. Wenn der Softmodus läuft, werden die Ref-Pointer aktualisiert und die Resets bleiben dort stehen. Der Modus agiert ähnlich wie der "git amend" Befehl. Daher sehen ihn viele Entwickler als "Zeitverschwendung" ober überflüssig an.
Der Soft-Reset wird grundsätzlich benutzt, um die Position des HEADs zu ändern. Schauen wir uns an, wie das funktioniert:
git reset--soft <commit-sha>
Der obige Befehl verschiebt den HEAD zu dem jeweiligen Commit.
Hier ein Praxis-Beispiel zur Soft-Option:
Ich habe Änderungen in meiner Datei website1.txt vorgenommen und committe sie. Also wird die aktuelle Position des Heads beim letzten Commit verschoben. Um den Status von HEAD zu überprüfen, führe den unten stehenden Befehl aus:
git log
Git Bash Screenshot - Änderungen an website1.txt comitted. Danach Soft-Reset durchgeführt:
Im obigen Output kannst du sehen, dass die aktuelle Position des HEADs auf dem Commit mit der ID 6d7b9380c3b8832251b8e1c0596e37e0f02714d9 liegt. Aber, ich möchte ihn auf meinen älteren Commit c48ed7c68ff2281e3a6c33fd1a5360549686e402 setzen. Da die Commit-SHA (ID) eine eindeutige Nummer ist, können wir sie benutzen, um den HEAD zu wechseln.
Führe dafür folgenden Befehl aus:
git reset --soft c48ed7c68ff2281e3a6c33fd1a5360549686e402
Der obige Befehl verschiebt meinen HEAD zu einem eindeutigen Commit, den ich spezifiziert habe.
Output:
Wie du in der obigen Ausgabe sehen kannst, wurde der HEAD durch git reset --soft in meinen Commit mit der ID c48ed7c68ff2281e3a6c33fd1a5360549686e402 geändert.
Zusammenfassung
In dieser Lektion hast du die grundlegenden Funktionen von "git reset" gelernt. Dieser Befehl hat drei verschiedene Modi (Optionen), nämlich Hard, Mixed und Soft. Wenn du keine Angabe zum Modus machst, wird immer der Mixed-Modus verwendet. Du kannst alle der hier aufgeführten Modi verwenden, um Änderungen deiner Dateien und Commits schnell rückgängig zu machen.
In der nächsten Lektion geht es dann um sogenannte Merge Konflikte (merge conflicts) und wie du diese einfach beheben kannst.