Willkommen zu unserer ultimativen Anleitung zu den git reset
und git revert
Befehlen. In diesem Tutorial erfahren Sie alles, was Sie über das Beheben häufiger Fehler und das Rückgängigmachen fehlerhafter Commits bei der Verwendung von Git wissen müssen.
Verstehen Sie die drei Abschnitte eines Git-Projekts
Ein Git-Projekt besteht aus den folgenden drei Hauptabschnitten:
- Git-Verzeichnis
- Arbeitsverzeichnis (oder Arbeitsbaum)
- Bühnenbereich
Im Git-Verzeichnis (in YOUR-PROJECT-PATH/.git/
) speichert Git alles, was zur genauen Verfolgung des Projekts erforderlich ist. Dies umfasst Metadaten und eine Objektdatenbank, die komprimierte Versionen der Projektdateien enthält.
Im Arbeitsverzeichnis nimmt ein Benutzer lokale Änderungen an einem Projekt vor. Das Arbeitsverzeichnis ruft die Projektdateien aus der Objektdatenbank des Git-Verzeichnisses ab und legt sie auf dem lokalen Computer des Benutzers ab.
Hinweis: Das Verzeichnis wird auch als Repository oder Kurzform-Repo bezeichnet. Das Repo auf dem lokalen Computer des Benutzers heißt "Local Repo", während das Repo auf dem Git-Server "Remote Repo" heißt.
Der Staging-Bereich ist eine Datei (auch als "Index", "Stage" oder "Cache" bezeichnet), in der Informationen darüber gespeichert sind, was in Ihr nächstes Commit aufgenommen wird. Ein Commit ist, wenn Sie Git anweisen, diese bereitgestellten Änderungen zu speichern. Git erstellt einen Snapshot der Dateien wie sie sind und speichert diesen Snapshot dauerhaft im Git-Verzeichnis.
In drei Abschnitten gibt es drei Hauptzustände, in denen sich eine Datei zu einem bestimmten Zeitpunkt befinden kann: geändert, festgeschrieben oder bereitgestellt. Sie ändern eine Datei jedes Mal, wenn Sie Änderungen in Ihrem Arbeitsverzeichnis vornehmen. Als nächstes wird es bereitgestellt, wenn Sie es in den Bereitstellungsbereich verschieben. Schließlich wird es nach einem Commit festgeschrieben .
Git Reset
Mit dem git reset
Befehl können Sie Ihren aktuellen Kopf auf einen bestimmten Status zurücksetzen. Sie können den Status bestimmter Dateien sowie eines gesamten Zweigs zurücksetzen. Dies ist nützlich, wenn Sie Ihr Commit noch nicht auf GitHub oder ein anderes Remote-Repository übertragen haben.
Setzen Sie eine Datei oder einen Satz von Dateien zurück
Mit dem folgenden Befehl können Sie selektiv Inhaltsblöcke auswählen und diese zurücksetzen oder entfernen.
git reset (--patch | -p) [tree-ish] [--] [paths]
Entferne eine Datei
Wenn Sie eine Datei mit in den Staging-Bereich verschoben haben git add
, aber nicht mehr möchten, dass sie Teil eines Commits ist, können git reset
Sie diese Datei entfernen:
git reset HEAD FILE-TO-UNSTAGE
Die von Ihnen vorgenommenen Änderungen bleiben in der Datei. Dieser Befehl entfernt diese Datei lediglich aus Ihrem Staging-Bereich.
Setzen Sie einen Zweig auf ein vorheriges Commit zurück
Der folgende Befehl setzt den HEAD Ihres aktuellen Zweigs auf den angegebenen Wert zurück COMMIT
und aktualisiert den Index. Im Grunde wird der Status Ihres Zweigs zurückgespult, und dann schreiben alle Commits, die Sie in Zukunft ausführen, über alles, was nach dem Rücksetzpunkt kam. Wenn Sie das weglassen MODE
, wird standardmäßig Folgendes verwendet --mixed
:
git reset MODE COMMIT
Die Optionen für MODE
sind:
--soft
: setzt die Indexdatei oder den Arbeitsbaum nicht zurück, sondern HEAD aufcommit
. Ändert alle Dateien in "Zu übernehmende Änderungen"--mixed
: Setzt den Index, aber nicht den Arbeitsbaum zurück und meldet, was nicht aktualisiert wurde--hard
: Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien im Arbeitsbaum seitdemcommit
werden verworfen--merge
: setzt den Index zurück und aktualisiert die Dateien im Arbeitsbaum, die sich zwischencommit
und HEAD unterscheiden, behält jedoch diejenigen bei, die sich zwischen dem Index und dem Arbeitsbaum unterscheiden--keep
: Setzt Indexeinträge zurück und aktualisiert Dateien im Arbeitsbaum, die sich zwischencommit
und HEAD unterscheiden. Wenn eine Datei, die sich voncommit
HEAD unterscheidet, lokale Änderungen aufweist, wird das Zurücksetzen abgebrochen
Wichtiger Hinweis zu Hard Resets
Seien Sie sehr vorsichtig, wenn Sie die --hard
Option mit verwenden, git reset
da sie Ihr Commit, Ihren Staging-Bereich und Ihr Arbeitsverzeichnis zurücksetzt. Wenn diese Option nicht richtig verwendet wird, kann der geschriebene Code verloren gehen.
Git Revert
Sowohl die Befehle als auch git revert
und git reset
machen vorherige Commits rückgängig. Wenn Sie Ihr Commit jedoch bereits in ein Remote-Repository verschoben haben, wird empfohlen, es nicht zu verwenden, git reset
da es den Verlauf der Commits neu schreibt. Dies kann die Arbeit an einem Repository mit anderen Entwicklern und die Aufrechterhaltung einer konsistenten Commit-Historie sehr schwierig machen.
Stattdessen ist es besser zu verwenden git revert
, wodurch die durch ein vorheriges Commit vorgenommenen Änderungen rückgängig gemacht werden, indem ein völlig neues Commit erstellt wird, ohne den Verlauf der Commits zu ändern.
Setzen Sie ein Commit oder eine Reihe von Commits zurück
Mit dem folgenden Befehl können Sie Änderungen von einem vorherigen Commit oder Commits zurücksetzen und ein neues Commit erstellen.
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort
Allgemeine Optionen:
-e --edit
- Dies ist die Standardoption und muss nicht explizit festgelegt werden. Es öffnet den Standardtexteditor Ihres Systems und ermöglicht es Ihnen, die neue Festschreibungsnachricht zu bearbeiten, bevor Sie das Zurücksetzen festschreiben.
- Diese Option macht das Gegenteil von
-e
undgit revert
öffnet den Texteditor nicht. - Diese Option verhindert, dass
git revert
ein vorheriges Commit rückgängig gemacht und ein neues erstellt wird. Anstatt ein neues Commit zu erstellen,-n
werden die Änderungen gegenüber dem vorherigen Commit rückgängig gemacht und dem Staging-Index und dem Arbeitsverzeichnis hinzugefügt.
--no-edit
-n -no-commit
Beispiel.
Stellen wir uns folgende Situation vor: 1.) Sie arbeiten an einer Datei und fügen Ihre Änderungen hinzu und übernehmen sie. 2.) Sie arbeiten dann an ein paar anderen Dingen und machen weitere Commits. 3.) Jetzt stellen Sie fest, dass Sie vor drei oder vier Commits etwas getan haben, das Sie rückgängig machen möchten - wie können Sie das tun?
Sie denken vielleicht, verwenden Sie einfach git reset
, aber dies entfernt alle Commits nach dem, den Sie ändern möchten - git revert
zur Rettung! Lassen Sie uns dieses Beispiel durchgehen:
mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`
Und damit sind Sie Ihrem schwarzen Gürtel in Git einen Schritt näher gekommen.