Wie mache ich die letzten lokalen Commits in Git rückgängig?

Lesezeit: 9 Minuten

Ich habe versehentlich die falschen Dateien übergeben zu Git aber das Commit noch nicht auf den Server übertragen.

Wie kann ich Machen Sie diese Commits aus dem lokalen Repository rückgängig?

Die einzige Möglichkeit scheint darin zu bestehen, die Änderungen in eine Art GUI-Texteditor zu kopieren, dann den gesamten lokalen Klon zu löschen, dann das Repository erneut zu klonen und dann die Änderungen erneut anzuwenden. Aber,

  • Dies kann zu Datenverlust führen.
  • Es ist sehr schwer, dies zu tun, wenn es nur ein Versehen ist git commit gelaufen war.

Gibt es einen besseren Weg?

  • Weißt du, was Git braucht? git undo, das ist es. Dann verschwindet der Ruf, den Idioten für den Umgang mit Fehlern haben, die von uns Normalsterblichen gemacht wurden. Implementieren Sie, indem Sie den aktuellen Status auf einen Git-Stack übertragen, bevor Sie ihn ausführen git Befehl. Es würde die Leistung beeinträchtigen, daher wäre es am besten, ein Konfigurationsflag hinzuzufügen, ob es aktiviert werden soll.

    – Yimin Rong

    20. März 2018 um 1:45 Uhr

  • @YiminRong Das kann mit Git’s gemacht werden alias Merkmal: git-scm.com/book/en/v2/Git-Basics-Git-Aliases

    – Edric

    5. Oktober 2018 um 14:50 Uhr

  • Für VsCode-Benutzer geben Sie einfach Strg + Umschalt + G ein und klicken Sie dann auf drei Punkte, dh weitere Optionen, und klicken Sie dann auf Undo Last Commit

    – schade

    8. April 2019 um 12:15 Uhr

  • @YiminRong Rückgängig machen was exakt? Es gibt Dutzende sehr unterschiedlicher Funktionsfälle, in denen “Rückgängigmachen” etwas bedeutet vollständig unterschiedlich. Ich wette, das Hinzufügen eines neuen schicken “Zauberstabs” würde die Dinge nur noch mehr verwirren.

    – Romain Waleri

    24. März 2020 um 14:27 Uhr


  • @YiminRong Nicht kaufen. Die Leute fummelten immer noch herum und machten Dinge rückgängig, die nicht rückgängig gemacht werden konnten. Aber noch wichtiger, git reflog ist bereits nah an dem, was Sie beschreiben, gibt dem Benutzer jedoch mehr Kontrolle darüber, was (nicht) getan werden soll. Aber bitte, nein, “Rückgängig machen” funktioniert nicht überall gleich, und die Leute würden es tun erwarten viele verschiedene Dinge, die das Feature erreichen soll. Letzten Commit rückgängig machen? Letzte Aktion rückgängig machen? Wenn die letzte Aktion ein Drücken war, wie genau rückgängig machen (zurücksetzen und drücken) oder (zurücksetzen und drücken)?

    – Romain Waleri

    25. März 2020 um 13:23 Uhr

Wie mache ich die letzten lokalen Commits in Git ruckgangig
Ryan Lundy

Ein Commit rückgängig zu machen ist ein wenig beängstigend, wenn Sie nicht wissen, wie es funktioniert. Aber es ist tatsächlich erstaunlich einfach, wenn Sie es verstehen. Ich zeige Ihnen die 4 verschiedenen Möglichkeiten, wie Sie einen Commit rückgängig machen können.

Option 1: git reset --hard

Angenommen, Sie haben dies, wobei C Ihr KOPF und (F) der Status Ihrer Dateien ist.

   (F)
A-B-C
    ↑
  master

Sie wollen nuke commit C und sehe es nie wieder und verliere alle Änderungen in lokal modifizierten Dateien. Du machst das:

git reset --hard HEAD~1

Das Ergebnis ist:

 (F)
A-B
  ↑
master

Jetzt ist B der KOPF. Weil du benutzt hast --hardwerden Ihre Dateien auf ihren Zustand bei Commit B zurückgesetzt.

Option 2: git reset

Ah, aber angenommen, Commit C wäre keine Katastrophe, sondern nur ein bisschen daneben. Sie wollen Machen Sie den Commit rückgängig, behalten Sie aber Ihre Änderungen bei für ein bisschen Bearbeitung, bevor Sie einen besseren Commit machen. Beginnen Sie wieder von hier aus mit C als HEAD:

   (F)
A-B-C
    ↑
  master

Sie können dies tun, indem Sie das weglassen --hard:

git reset HEAD~1

In diesem Fall lautet das Ergebnis:

   (F)
A-B-C
  ↑
master

In beiden Fällen ist HEAD nur ein Zeiger auf den letzten Commit. Wenn du a machst git reset HEAD~1, weisen Sie Git an, den HEAD-Zeiger um einen Commit zurück zu verschieben. Aber (es sei denn, Sie verwenden --hard) lassen Sie Ihre Dateien unverändert. Also jetzt git status zeigt die Änderungen, die Sie in C eingecheckt haben. Sie haben nichts verloren!

Möglichkeit 3: git reset --soft

Für die leichteste Berührung können Sie sogar Machen Sie Ihr Commit rückgängig, aber lassen Sie Ihre Dateien und Ihre Index:

git reset --soft HEAD~1

Dies lässt nicht nur Ihre Dateien in Ruhe, sondern auch Ihre Index allein. Wenn Sie das tun git status, sehen Sie, dass sich die gleichen Dateien wie zuvor im Index befinden. Tatsächlich könnten Sie direkt nach diesem Befehl tun git commit und Sie würden denselben Commit wiederholen, den Sie gerade hatten.

Option 4: Du hast es getan git reset --hard und müssen diesen Code zurückbekommen

Eine Sache noch: Angenommen, Sie zerstören ein Commit wie im ersten Beispiel, aber dann entdecken Sie, dass Sie es doch brauchten? Pech gehabt, oder?

Nein, gibt es still ein Weg, es zurückzubekommen. Art git reflog und Sie sehen eine Liste mit (teilweisem) Commit scha (d. h. Hashes), in denen Sie sich bewegt haben. Finden Sie das Commit, das Sie zerstört haben, und tun Sie Folgendes:

git checkout -b someNewBranchName shaYouDestroyed

Sie haben dieses Commit jetzt wiederbelebt. Commits werden in Git etwa 90 Tage lang nicht wirklich zerstört, also kannst du normalerweise zurückgehen und einen retten, den du nicht loswerden wolltest.

  • IN ACHT NEHMEN! Dies funktioniert möglicherweise nicht so, wie Sie es erwarten, wenn Ihr fehlerhafter Commit ein (schneller Vorlauf) Merge war! Wenn sich Ihr Kopf auf einem Merge-Commit befindet (z. B.: Merge-Branch-Feature in Master), git reset --hard~1 zeigt den Master-Branch auf den letzten Commit innerhalb des Feature-Branch. In diesem Fall sollte die spezifische Commit-ID anstelle des relativen Befehls verwendet werden.

    – Chris Kerekes

    20. Februar 2013 um 18:46 Uhr


  • Beachten Sie, dass die Nummer in HEAD~1 kann durch jede positive ganze Zahl ersetzt werden, z HEAD~3. Es mag offensichtlich erscheinen, aber Anfänger (wie ich) sind sehr vorsichtig, wenn sie Git-Befehle ausführen, also wollen sie vielleicht nicht riskieren, etwas durcheinander zu bringen, indem sie dieses Zeug selbst testen.

    – Sime Vidas

    13. August 2013 um 14:37 Uhr

  • Übersehen eines entscheidenden Punkts: Wenn der besagte Commit zuvor auf die Fernbedienung „geschoben“ wurde, wird jede „Rückgängig“-Operation, egal wie einfach, den restlichen Benutzern, die diesen Commit in ihrer lokalen Kopie haben, enorme Schmerzen und Leiden bereiten. wenn sie in Zukunft einen ‘Git Pull’ machen. Wenn also der Commit bereits „gepusht“ wurde, tun Sie dies stattdessen: git revert git push origin :

    – FractalSpace

    8. November 2013 um 23:43 Uhr


  • @FractalSpace, es wird keine “enormen Schmerzen und Leiden” verursachen. Ich habe ein paar Force-Pushs durchgeführt, als ich Git mit einem Team verwendet habe. Alles, was es braucht, ist Kommunikation.

    – Ryan Lundy

    9. November 2013 um 0:00 Uhr

  • @Kyralessa An meinem Arbeitsplatz wird es nicht als “Kommunikation” bezeichnet, den Arbeitsablauf des gesamten Teams durcheinander zu bringen und ihnen dann zu sagen, wie man Scheiße repariert. git history rewrite ist eine destruktive Operation, die dazu führt, dass Teile des Repos zerstört werden. Auf seiner Verwendung zu bestehen, während klare und sichere Alternativen verfügbar sind, ist einfach unverantwortlich.

    – FractalSpace

    9. November 2013 um 3:02 Uhr

  • Ich fand diese Antwort am klarsten. git revert HEAD^ ist nicht das Vorherige, ist das Vorherige des Vorherigen. Ich tat : git revert HEAD und dann nochmal drücken und es hat geklappt 🙂

    – nacho4d

    14. Juli 2011 um 8:32 Uhr


  • Wenn Git dich fragt “Mehr?” Wenn Sie diese Befehle ausprobieren, verwenden Sie die alternative Syntax für diese Antwort: stackoverflow.com/a/14204318/823470

    – Teer

    5. März 2020 um 15:50 Uhr

  • revert einige Dateien gelöscht, die ich meinem Repo hinzugefügt habe. Verwenden Sie es mit Vorsicht!

    – carloswm85

    31. Juli 2021 um 22:25 Uhr


  • Was ist der Unterschied zwischen git reset –soft HEAD~1 und reset –soft HEAD^?

    – Jorge Tovar

    21. Dezember 2021 um 20:23 Uhr

  • Vielleicht habe ich es einfach nicht gesehen, aber das letzte Verknüpfung Sie haben angegeben, scheint diese spezielle Frage nicht abzudecken. (Ich weiß, Sie sagten, es seien zusätzliche Informationen, ich frage mich nur, ob ich etwas verpasst habe.)

    – NerdOnTour

    13. Januar um 9:01 Uhr


1646916490 835 Wie mache ich die letzten lokalen Commits in Git ruckgangig
bdonlan

Dateien hinzufügen/entfernen, um die Dinge so zu erhalten, wie Sie es möchten:

git rm classdir
git add sourcedir

Dann den Commit ändern:

git commit --amend

Der vorherige, fehlerhafte Commit wird bearbeitet, um den neuen Indexstatus widerzuspiegeln – mit anderen Worten, es wird so sein, als hätten Sie den Fehler nie gemacht.

Beachten Sie, dass Sie dies nur tun sollten, wenn Sie noch nicht gepusht haben. Wenn Sie gepusht haben, müssen Sie einfach einen Fix normal festschreiben.

  • FYI: Dadurch werden alle meine Dateien entfernt und ich habe Änderungen verloren.

    – jegorlitwinenko

    15. Mai 2020 um 10:03 Uhr

  • UPD: Allerdings habe ich es mit Reflog wiederhergestellt. Aber die Quittung hat beim ersten Commit nicht funktioniert.

    – jegorlitwinenko

    15. Mai 2020 um 11:25 Uhr

  • Verwenden git rm --cached um die Dateien im Dateisystem zu behalten und nur aus dem Git-Index zu löschen!

    – xuiqzy

    19. Mai 2020 um 10:00 Uhr

Wie mache ich die letzten lokalen Commits in Git ruckgangig
Dippas

git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

oder

git reset --hard HEAD~1

Warnung: Der obige Befehl entfernt dauerhaft die Änderungen an der .java Dateien (und alle anderen Dateien), die Sie übergeben wollten.

Die hard reset zu HEAD-1 wird Ihre Arbeitskopie auf den Zustand des Commit vor Ihrem falschen Commit setzen.

  • FYI: Dadurch werden alle meine Dateien entfernt und ich habe Änderungen verloren.

    – jegorlitwinenko

    15. Mai 2020 um 10:03 Uhr

  • UPD: Allerdings habe ich es mit Reflog wiederhergestellt. Aber die Quittung hat beim ersten Commit nicht funktioniert.

    – jegorlitwinenko

    15. Mai 2020 um 11:25 Uhr

  • Verwenden git rm --cached um die Dateien im Dateisystem zu behalten und nur aus dem Git-Index zu löschen!

    – xuiqzy

    19. Mai 2020 um 10:00 Uhr

1646916491 347 Wie mache ich die letzten lokalen Commits in Git ruckgangig
Zoe steht mit der Ukraine

Um das letzte Commit zu ändern

Ersetzen Sie die Dateien im Index:

git rm --cached *.class
git add *.java

Wenn es sich um eine private Niederlassung handelt, ändern die Verpflichtung:

git commit --amend

Oder, wenn es sich um einen gemeinsam genutzten Branch handelt, machen Sie einen neuen Commit:

git commit -m 'Replace .class files with .java files'

(Um einen vorherigen Commit zu ändernverwenden Sie die fantastische interaktive Rebase.)


ProTip™: Hinzufügen *.class zu einem ignorieren damit das nicht mehr passiert.


Um ein Commit rückgängig zu machen

Das Ändern eines Commits ist die ideale Lösung, wenn Sie das letzte Commit ändern müssen, aber eine allgemeinere Lösung ist es reset.

Sie können Git auf jeden Commit zurücksetzen mit:

git reset @~N

Woher N ist die Anzahl der Commits davor HEADund @~ setzt auf den vorherigen Commit zurück.

Anstatt den Commit zu ändern, könnten Sie Folgendes verwenden:

git reset @~
git add *.java
git commit -m "Add .java files"

Kasse git help resetinsbesondere die Abschnitte auf --soft --mixed und --hardum besser zu verstehen, was dies bewirkt.

Neu protokollieren

Wenn Sie es vermasseln, können Sie immer das Reflog verwenden, um gelöschte Commits zu finden:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started

  • Für diejenigen, die in Zukunft lesen – bitte beachten Sie das git revert ist ein separater Befehl – der im Grunde eine einzelne Übergabe “zurücksetzt”.

    – BenKoshy

    8. August 2018 um 7:11 Uhr


987970cookie-checkWie mache ich die letzten lokalen Commits in Git rückgängig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy