Unterschied zwischen den Git-Befehlen `Reset`, `Revert` und `Checkout`.
- Unterschied zwischen den Befehlen Git Reset, Git Revert und Git Checkout
- Git Reset vs. Git Revert vs. Git Checkout
- Operationen auf Commit-Ebene
- Operationen auf Dateiebene
Dieser Artikel beschreibt den Unterschied zwischen den Befehlen git reset
, git revert
und git checkout
. Dies sind einige der nützlichsten Git-Dienstprogramme, mit denen wir einige Änderungen in unseren Repositories rückgängig machen können.
Es ist leicht, die Befehle zu verwechseln, aber am Ende dieses Artikels werden Sie das Vertrauen gewonnen haben, Ihr Repository mit den oben genannten Befehlen zu verwenden und darin zu navigieren.
Unterschied zwischen den Befehlen Git Reset, Git Revert und Git Checkout
Diese Befehle sind leichter zu verstehen, wenn wir uns über die Auswirkungen jedes Befehls auf die drei Hauptkomponenten eines Git-Repositorys im Klaren sind.
- Das Arbeitsverzeichnis
- Inszenierter Schnappschuss
- Commit-Verlauf
Wir können die obigen Komponenten auch die Drei Bäume
nennen.
Git-Checkout
Was meinen wir mit Auschecken?
Diese Operation verschiebt den HEAD
-Zeiger zu einem bestimmten Commit.
Das obige Bild zeigt eine Abfolge von Commits in einem Git-Repository. Die Zweigzeiger HEAD
und main
befinden sich derzeit auf dem Commit d
.
Wir können unsere HEAD
-Referenz mit dem git checkout
-Befehl zu jedem Commit verschieben.
Um beispielsweise unsere HEAD
-Referenz zum Commit b
zu verschieben, führen wir Folgendes aus:
$ git checkout -b
Wir können den Befehl git checkout
auf Commit- und Dateiebene verwenden. Beim Auschecken auf Dateiebene wird der Inhalt der Datei mit dem Inhalt des angegebenen Commits aktualisiert.
Git-Revert
Beim Zurücksetzen nehmen wir einen bestimmten Commit und erstellen einen neuen, der den Effekt des angegebenen Commit umkehrt. Der Commit git revert
wirkt nur auf Commit-Ebene und hat keine Funktionalität auf Dateiebene.
Git-Reset
Beim Zurücksetzen nehmen wir ein bestimmtes Commit, setzen die Drei Bäume
zurück und aktualisieren ein Repository, damit es mit dem Status des Repos beim angegebenen Commit übereinstimmt. Wir können auf drei verschiedene Modi zurücksetzen, die den drei Bäumen
entsprechen.
Normalerweise verwenden wir den git reset
und den git checkout
, um lokale oder private Änderungen rückgängig zu machen. Beide ändern den Verlauf eines Repositorys und können zu Konflikten führen, wenn sie auf entfernte öffentliche oder freigegebene Repositorys übertragen werden.
Git Reset vs. Git Revert vs. Git Checkout
Die folgende Tabelle enthält einige häufige Anwendungsfälle für die drei Befehle.
Befehl | Umfang | Häufige Anwendungsfälle |
---|---|---|
git zurücksetzen |
Commit-Level | Commits in einem Branch lokal löschen oder nicht festgeschriebene Änderungen verwerfen. |
git zurücksetzen |
Dateiebene | Staging einer Datei aus dem Index entfernen. |
git Kasse |
Commit-Level | Untersuchen Sie alte Commits und wechseln Sie zwischen Branches. |
git Kasse |
Dateiebene | Änderungen im Arbeitsverzeichnis verwerfen. |
git zurücksetzen |
Commit-Level | Kehrt die Auswirkungen eines Commits in öffentlichen Zweigen um. |
git zurücksetzen |
Dateiebene | (N / A) |
Operationen auf Commit-Ebene
Wir übergeben Parameter an die Befehle git reset
und git checkout
, um verschiedene Betriebsebenen aufzurufen. Wenn wir keinen Dateiparameter einschließen, wirken sich die Befehle auf den Commit als Ganzes aus.
Setzen Sie ein Commit zurück
Das Zurücksetzen auf der Commit-Ebene verschiebt die HEAD
-Referenz zu einem bestimmten Commit. Wir können diesen Befehl verwenden, um Commits aus einem Branch zu löschen.
Hier ist ein Beispiel.
$ git reset HEAD~3
Der obige Befehl bewegt die Spitze unseres Zweigs um drei Commits nach hinten. Wir können sie als hängende
oder verwaiste
Commits bezeichnen.
Wir haben die drei Commits verworfen. Es ist am besten, den Befehl zu verwenden, um Commits zu beseitigen, die wir nicht in einem entfernten gemeinsam genutzten Repository veröffentlicht haben.
Wir können auch den Befehl git reset
verwenden, um den bereitgestellten Snapshot und das Arbeitsverzeichnis zu ändern, indem wir eines der folgenden Flags übergeben.
--soft
– Ändert die gestuften Änderungen oder das Arbeitsverzeichnis nicht.--mixed
– Beeinflusst nicht das Arbeitsverzeichnis, ändert aber den bereitgestellten Snapshot, damit er mit dem angegebenen Commit übereinstimmt.--hard
– Ändert sowohl das Arbeitsverzeichnis als auch den bereitgestellten Snapshot, um mit dem angegebenen Commit übereinzustimmen.
Alte Commits auschecken
Wir können den Befehl git checkout
verwenden, um den Zustand eines Repositorys bei einem bestimmten Commit zu überprüfen. Wir können auch Zweignamen übergeben, um zwischen Zweigen zu wechseln.
Hier ist ein Beispiel.
$ git checkout feature
Der obige Befehl wechselt zum feature
-Zweig. Es bewegt keine Äste.
Wir können auch beliebige Commits untersuchen, indem wir anstelle eines Branch-Namens einen Commit-Hash oder eine Referenz übergeben. Hier ist ein Beispiel.
$ git checkout HEAD~1
Der obige Befehl überprüft das übergeordnete Element unseres aktuellen Commits. Wenn Sie HEAD~2
passieren, wird der Großelternteil überprüft.
Der obige Befehl schaltet uns in den getrennten HEAD
-Modus, da unser aktueller HEAD
keine Zweigreferenz hat.
Alle Änderungen und Commits, die im getrennten HEAD
-Modus durchgeführt werden, sind nicht mehr erreichbar, sobald Sie zu einem anderen Zweig wechseln. Erstellen Sie immer einen neuen Zweig, wenn Sie Änderungen im getrennten HEAD
-Zustand festschreiben möchten.
Gemeinsame Commits zurücksetzen
Wenn wir Commits rückgängig machen, erstellen wir ein neues Commit, das die Auswirkungen des angegebenen Commits umkehrt. Auf diese Weise vermeiden wir das Neuschreiben des Commit-Verlaufs gemeinsam genutzter Repositories.
Wenn wir beispielsweise den letzten Commit rückgängig machen wollen, führen wir Folgendes aus:
$ git revert HEAD
Operationen auf Dateiebene
Die Befehle git checkout
und git reset
akzeptieren einen Dateipfad als optionalen Parameter. Die Auswirkungen der Befehle sind auf eine einzelne Datei beschränkt.
Zurücksetzen einer Datei
Wir können den bereitgestellten Snapshot einer Datei aktualisieren, damit er mit der Version des angegebenen Commits übereinstimmt, wie unten gezeigt.
$ git reset HEAD~1 README.md
Der obige Befehl ruft die Version der Datei README.md
im übergeordneten Commit des aktuellen Commit ab und fügt sie dem Index für den nächsten Commit hinzu. Wir können git reset HEAD README.md
ausführen, um die README.md
-Datei aus der Staging-Umgebung zu entfernen.
Git Checkout-Datei
Das Übergeben eines Dateipfads an den Befehl git checkout
aktualisiert das Arbeitsverzeichnis und nicht den bereitgestellten Snapshot. Dadurch wird der HEAD
-Zeiger nicht zwischen Zweigen bewegt.
Hier ist ein Beispiel.
$ git checkout HEAD~1 README.md
Dadurch wird die Version der Datei README.md
aus dem übergeordneten Commit unseres aktuellen Commits abgerufen und die Datei README.md
nur in unserem Arbeitsverzeichnis aktualisiert. Es bedeutet einfach, dass wir zur Dateiversion im alten Commit zurückgekehrt sind.
Im Gegensatz zum Befehl git revert
, der die durch den angegebenen Commit eingeführten Änderungen rückgängig macht, verwirft dieser alle nachfolgenden Änderungen. Wir können es verwenden, um nicht bereitgestellte Änderungen an einer einzelnen Datei zu verwerfen, wie unten gezeigt.
$ git checkout HEAD README.md
Zusammenfassend lässt sich sagen, dass wir leicht zwischen den Befehlen git reset
, git revert
und git checkout
unterscheiden können, indem wir die Auswirkungen jedes Befehls auf den Commit-Verlauf, den bereitgestellten Snapshot und das Arbeitsverzeichnis verstehen.
John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.
LinkedInVerwandter Artikel - Git Revert
- Git Revert Commit Local
- Setzen Sie ein Git-Repository auf einen vorherigen Commit zurück
- Wiederherstellen eines rückgängig gemachten Git-Commits
- Löschen lokale Commits in Git
- Merge-Commit in Git rückgängig machen