Die ultimative Anleitung zum Zurücksetzen und Zurücksetzen von Git

Willkommen zu unserer ultimativen Anleitung zu den git resetund git revertBefehlen. 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:

  1. Git-Verzeichnis
  2. Arbeitsverzeichnis (oder Arbeitsbaum)
  3. 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 resetBefehl 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 resetSie 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 COMMITund 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 MODEsind:

  • --soft: setzt die Indexdatei oder den Arbeitsbaum nicht zurück, sondern HEAD auf commit. Ä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 seitdem commitwerden verworfen
  • --merge: setzt den Index zurück und aktualisiert die Dateien im Arbeitsbaum, die sich zwischen commitund 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 zwischen commitund HEAD unterscheiden. Wenn eine Datei, die sich von commitHEAD unterscheidet, lokale Änderungen aufweist, wird das Zurücksetzen abgebrochen

Wichtiger Hinweis zu Hard Resets

Seien Sie sehr vorsichtig, wenn Sie die --hardOption mit verwenden, git resetda 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 revertund git resetmachen vorherige Commits rückgängig. Wenn Sie Ihr Commit jedoch bereits in ein Remote-Repository verschoben haben, wird empfohlen, es nicht zu verwenden, git resetda 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 -eund git revertöffnet den Texteditor nicht.
  • Diese Option verhindert, dass git revertein vorheriges Commit rückgängig gemacht und ein neues erstellt wird. Anstatt ein neues Commit zu erstellen, -nwerden 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 revertzur 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.