Wir beginnen mit dem Hinzufügen einiger Dateien. Beim letzten Commit werden wir Dateien sowohl hinzufügen als auch löschen, um eine unordentliche Situation zu schaffen. Dann kehren wir zurück in den Zustand vor dem Chaos.
Sie können einen Ordner namens /test erstellen und die folgenden Befehle ausführen, um Git zu initialisieren und die oben beschriebene Situation zu erstellen (wir machen absichtlich separate Commits, um einen Verlauf zu erstellen):
$ git initInitialisiertes leeres Git-Repository in /Users/zakh_eecs/_work/LearnGIT/git_revert/test/.git/
$ echo x > Datei_1.TXT
$ git add -A
$ git commit -m "Hinzufügen von Datei_1.TXT"
[master (root-commit) 08caf5d] Datei_1 hinzufügen.TXT
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 Datei_1.TXT
$ echo y > Datei_2.TXT
$ git add -A
$ git commit -m "Datei_2 hinzufügen file.TXT"
[master ba18a2f] Datei_2 hinzufügen.TXT
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 Datei_2.TXT
$ echo z > file_3.TXT
$ git add -A
$ git commit -m "Hinzufügen von file_3.TXT"
[master 97f09ad] Datei_3 hinzufügen.TXT
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 Datei_3.TXT
$ echo u > file_4.TXT
$ git add -A
$ git commit -m "Hinzufügen von file_4.TXT"
[master 9caf084] Datei_4 hinzufügen.TXT
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 Datei_4.TXT
$ echo v > Datei_5.TXT
$ git add -A
$ git commit -m "Hinzufügen von file_5.TXT"
[master 3f228b2] Datei_5 hinzufügen.TXT
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 Datei_5.TXT
Wenn wir unseren Ordner überprüfen, sollten wir die folgende Situation sehen:
$ ls -1Datei_1.TXT
Datei_2.TXT
Datei_3.TXT
Datei_4.TXT
Datei_5.TXT
Wenn wir den Verlauf überprüfen, sollten wir die folgenden Dateien haben:
$ git log --oneline3f228b2 Datei_5 hinzufügen.TXT
9caf084 Datei_4 hinzufügen.TXT
97f09ad Datei_3 hinzufügen.TXT
ba18a2f Datei_2 hinzufügen.TXT
08caf5d Datei_1 hinzufügen.TXT
Lassen Sie uns nun etwas Chaos anrichten, wir werden ein paar Dateien löschen und eine fehlerhafte Datei hinzufügen.
$rm Datei_2.TXT$rm Datei_4.TXT
$ echo w > my_bad_file.TXT
$ git add -A
$ git commit -m "Dateien hinzugefügt und gelöscht, ohne an Konsequenzen zu denken"
[master 879fbf8] Dateien hinzugefügt und gelöscht, ohne an Konsequenzen zu denken
3 Dateien geändert, 1 Einfügung (+), 2 Löschungen (-)
Löschmodus 100644 Datei_2.TXT
Löschmodus 100644 file_4.TXT
Modus erstellen 100644 my_bad_file.TXT
Dies ist nun der Zustand unseres Ordners:
$ ls -1Datei_1.TXT
Datei_3.TXT
Datei_5.TXT
my_bad_file.TXT
Und das ist der Zustand unserer Geschichte:
$ git log --oneline879fbf8 Dateien hinzugefügt und gelöscht, ohne an Konsequenzen zu denken
3f228b2 Datei_5 hinzufügen.TXT
9caf084 Datei_4 hinzufügen.TXT
97f09ad Datei_3 hinzufügen.TXT
ba18a2f Datei_2 hinzufügen.TXT
08caf5d Datei_1 hinzufügen.TXT
Uns ist klar, dass wir den letzten Commit 879fbf8 nicht wollen. Wir verwenden also den folgenden Befehl zum Zurücksetzen:
$ git revert 879fbf8Es öffnet sich ein Textfenster zum Bearbeiten des automatischen Kommentars:
"Hinzugefügte und gelöschte Dateien, ohne an Konsequenzen zu denken" zurücksetzenDadurch wird das Commit rückgängig gemacht 879fbf849c4bd6fb9a377604d6355c76b92a832c.
# Bitte geben Sie die Commit-Nachricht für Ihre Änderungen ein. Linien beginnend
# mit '#' wird ignoriert und eine leere Nachricht bricht den Commit ab.
# Auf Zweigmeister
# Zu verpflichtende Änderungen:
# neue Datei: file_2.TXT
# neue Datei: file_4.TXT
# gelöscht: my_bad_file.TXT
#
Sie können den Kommentar ändern. Wir werden es so lassen wie es ist. Sobald Sie das Kommentarfenster speichern, wird die Zurücksetzungsaufgabe ausgeführt:
$ git revert 879fbf8[master 6e80f0e] Revert "Hinzugefügte und gelöschte Dateien, ohne an Konsequenzen zu denken"
3 Dateien geändert, 2 Einfügungen(+), 1 Löschung(-)
Modus erstellen 100644 Datei_2.TXT
Modus erstellen 100644 Datei_4.TXT
Löschmodus 100644 my_bad_file.TXT
Schauen wir uns jetzt unseren Ordner an:
$ ls -1Datei_1.TXT
Datei_2.TXT
Datei_3.TXT
Datei_4.TXT
Datei_5.TXT
Unsere Dateien sind wieder in der Reihenfolge wie zuvor. Alle Hinzufügungen und Löschungen wurden rückgängig gemacht. Schauen wir uns das Protokoll an:
$ git log --oneline6e80f0e Revert "Hinzugefügte und gelöschte Dateien, ohne an Konsequenzen zu denken"
879fbf8 Dateien hinzugefügt und gelöscht, ohne an Konsequenzen zu denken
3f228b2 Datei_5 hinzufügen.TXT
9caf084 Datei_4 hinzufügen.TXT
97f09ad Datei_3 hinzufügen.TXT
ba18a2f Datei_2 hinzufügen.TXT
08caf5d Datei_1 hinzufügen.TXT
Es gibt ein neues Commit 6e80f0e. Alle Änderungen, die Teil von . waren 879fbf8 wurde rückgängig gemacht und dann begangen in 6e80f0e.
Warnung: Mit dem Git-Reset-Befehl können Sie auch Commits rückgängig machen. Aber im Reset-Fall (insbesondere Hard-Reset) hätte es die gelöscht 879fbf8 begehen, als ob es nie passiert wäre und es keine gegeben hätte 6e80f0e verpflichten. Mit einem Zurücksetzen-Befehl kann jeder die vorgenommenen Änderungen sehen. Im Reset-Fall bleibt keine Spur zurück. Daher ist es keine gute Idee, den Reset-Befehl in einem öffentlichen Repository zu verwenden, da dies zu Massenverwirrung führen kann. Die goldene Regel lautet: Verwenden Sie kein Reset in öffentlichen Repositories, sondern verwenden Sie Revert, was sicherer ist.
Abschließend:
Der Git-Revert-Befehl ist eine schnelle und bequeme Möglichkeit, Ihre Fehler zu beheben. Es ist ein Befehl, den Sie sich merken sollten, wenn Sie regelmäßig mit Git . arbeiten.
Weitere Studie:
- https://git-scm.com/docs/git-revert
- https://git-scm.com/docs/git-reset
- Git: Versionskontrolle lernen mit Git: Eine Schritt-für-Schritt-Anleitung für Anfänger
- Versionskontrolle mit Git: Leistungsstarke Tools und Techniken für die kollaborative Softwareentwicklung
- Pro Git, 2. Auflage