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

21058

Ich habe versehentlich die falschen Dateien auf Git festgeschrieben , aber das Festschreiben habe ich noch nicht auf den Server übertragen.

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

Peter Mortensen
quelle
138
Bevor Sie eine neue Antwort veröffentlichen, sollten Sie berücksichtigen, dass diese Frage bereits über 65 Antworten enthält. Stellen Sie sicher, dass Ihre Antwort dazu beiträgt, was nicht zu den vorhandenen Antworten gehört.
Sazzad Hissain Khan
89
Weißt du was Git braucht? git undo, das ist es. Dann verschwindet der Ruf, den Git für den Umgang mit Fehlern hat, die wir bloßen Sterblichen gemacht haben. Implementieren Sie dies, indem Sie den aktuellen Status auf einen Git-Stack verschieben, bevor Sie einen gitBefehl ausführen . Dies würde sich auf die Leistung auswirken. Fügen Sie daher am besten ein Konfigurationsflag hinzu, um festzustellen, ob es aktiviert werden soll.
Yimin Rong
11
@YiminRong Das kann mit Gitsalias Funktion gemacht werden: git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric
3
@RomainValeri - Auf die gleiche Weise funktioniert das Rückgängigmachen überall anders.
Yimin Rong
1
@ YiminRong Ich kaufe es nicht. Die Leute fummelten immer noch herum und machten Dinge rückgängig, um nicht rückgängig gemacht zu werden. Noch wichtiger ist jedoch, dass git refloges bereits nahe an dem liegt, was Sie beschreiben, dem Benutzer jedoch mehr Kontrolle darüber gibt, was (nicht) getan werden soll. Aber bitte, nein, "Rückgängig" funktioniert nicht überall gleich, und die Leute würden erwarten, dass das Feature viele verschiedene Dinge erreicht. Letztes Commit rückgängig machen? Letzte Aktion rückgängig machen? Wenn die letzte Aktion ein Push war, machen Sie wie genau rückgängig (Zurücksetzen und Drücken) oder (Zurücksetzen und Drücken)?
RomainValeri

Antworten:

22856

Machen Sie ein Commit rückgängig und wiederholen Sie es

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Dies möchten Sie rückgängig machen.
  2. Dies tut nichts , um Ihren Arbeitsbaum (den Zustand Ihrer Dateien auf der Festplatte), aber löst das Commit und Blätter der Änderungen , die Sie unstaged begangen (so erscheinen sie werden als „Änderungen nicht begehen inszenierten“ in git status, so dass Sie brauchen werden vor dem Festschreiben erneut hinzufügen). Wenn Sie dem vorherigen Commit nur weitere Änderungen hinzufügen oder die Commit-Nachricht 1 ändern möchten , können Sie git reset --soft HEAD~stattdessen git reset HEAD~2 verwenden , wobei Ihre vorhandenen Änderungen beibehalten werden.
  3. Nehmen Sie Korrekturen an Arbeitsbaumdateien vor.
  4. git add alles, was Sie in Ihr neues Commit aufnehmen möchten.
  5. Übernehmen Sie die Änderungen und verwenden Sie die alte Festschreibungsnachricht erneut. resetkopierte den alten Kopf nach .git/ORIG_HEAD; commitwith -c ORIG_HEADöffnet einen Editor, der zunächst die Protokollnachricht aus dem alten Commit enthält und Sie bearbeiten können. Wenn Sie die Nachricht nicht bearbeiten müssen, können Sie die -COption verwenden.

Beachten Sie jedoch, dass wenn Sie dem Index neue Änderungen hinzugefügt haben commit --amend, diese mit Ihrem vorherigen Commit hinzugefügt werden .

Wenn der Code bereits auf Ihren Server übertragen wurde und Sie die Berechtigung zum Überschreiben des Verlaufs (Rebase) haben, gehen Sie wie folgt vor:

git push origin master --force

Sie können sich auch diese Antwort ansehen:

Wie kann ich HEAD an einen früheren Ort zurückversetzen? (Abgenommener Kopf) & Commits rückgängig machen

Die obige Antwort zeigt Ihnen, git reflog,welche verwendet wird, um herauszufinden, was der SHA-1 ist, den Sie zurücksetzen möchten. Sobald Sie den Punkt gefunden haben, zu dem Sie rückgängig machen möchten, verwenden Sie die oben erläuterte Befehlsfolge.


1 Beachten Sie jedoch, dass Sie nicht auf ein früheres Commit zurücksetzen müssen, wenn Sie gerade einen Fehler in Ihrer Commit-Nachricht gemacht haben . Die einfachere Option besteht darin, git reset(seitdem vorgenommene Änderungen aufzuheben) und dann git commit --amendIhren Standard-Editor für Festschreibungsnachrichten zu öffnen , der mit der letzten Festschreibungsnachricht gefüllt ist .

2 HEAD~ ist das gleiche wie HEAD~1. Siehe auch Was ist der KOPF in Git? . Dies ist hilfreich, wenn Sie mehrere Commits aufheben möchten.

Mark Amery
quelle
472
Und wenn das Commit auf dem falschen Zweig war, können Sie git checkout theRightBranchmit allen Änderungsstufen. Da musste ich einfach machen.
Frank Shearar
490
Wenn Sie unter DOS arbeiten, müssen Sie stattdessen git reset --soft HEAD^verwenden git reset --soft HEAD~1. Das ^ ist ein Fortsetzungszeichen in DOS, daher funktioniert es nicht richtig. Dies --softist auch die Standardeinstellung, sodass Sie sie weglassen können, wenn Sie möchten und einfach sagen git reset HEAD~1.
Ryan Lundy
119
zsh Benutzer könnten bekommen: zsh: no matches found: HEAD^- Sie müssen entkommen ^ iegit reset --soft HEAD\^
tnajdek
7
Die Antwort ist nicht korrekt, wenn sie beispielsweise versehentlich git commit -aausgegeben wurde, als die -ahätte weggelassen werden sollen. In diesem Fall ist es besser, das nicht auszulassen --soft(was dazu führt, dass --mixeddies die Standardeinstellung ist), und dann können Sie die Änderungen, die Sie festschreiben wollten, wiederherstellen.
Dmansfield
6
@IcyBrk git add ist ein Befehl. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786
10732

Das Rückgängigmachen eines Commits ist etwas beängstigend, wenn Sie nicht wissen, wie es funktioniert. Aber es ist tatsächlich erstaunlich einfach, wenn Sie verstehen.

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

   (F)
A-B-C
    ↑
  master

Sie möchten Commit C nuklearisieren und es nie wieder sehen und alle Änderungen in lokal geänderten Dateien verlieren . Du machst das:

git reset --hard HEAD~1

Das Ergebnis ist:

 (F)
A-B
  ↑
master

Jetzt ist B der KOPF. Da Sie verwendet haben --hard, werden Ihre Dateien beim Festschreiben B auf ihren Status zurückgesetzt.

Ah, aber nehmen wir an, Commit C war keine Katastrophe, sondern nur ein bisschen daneben. Sie möchten das Festschreiben rückgängig machen, aber Ihre Änderungen für ein wenig Bearbeitung beibehalten, bevor Sie ein besseres Festschreiben durchführen. Von hier aus beginnend mit C als KOPF:

   (F)
A-B-C
    ↑
  master

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

git reset HEAD~1

In diesem Fall ist das Ergebnis:

   (F)
A-B-C
  ↑
master

In beiden Fällen ist HEAD nur ein Zeiger auf das letzte Commit. Wenn Sie a git reset HEAD~1ausführen, weisen Sie Git an, den HEAD-Zeiger um ein Commit zurückzusetzen. Aber (es sei denn, Sie verwenden --hard) lassen Sie Ihre Dateien wie sie waren. git statusZeigt nun die Änderungen an, die Sie in C eingecheckt haben. Sie haben nichts verloren!

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

git reset --soft HEAD~1

Dies lässt nicht nur Ihre Dateien in Ruhe, sondern auch Ihren Index in Ruhe. Wenn Sie dies tun git status, werden Sie feststellen, dass sich dieselben Dateien im Index befinden wie zuvor. Tatsächlich könnten git commitSie direkt nach diesem Befehl das Commit wiederholen, das Sie gerade hatten.

Noch etwas: Angenommen, Sie zerstören ein Commit wie im ersten Beispiel, stellen dann aber fest, dass Sie es doch gebraucht haben ? Pech, oder?

Nein, es gibt immer noch einen Weg, es zurückzubekommen. Geben Sie git reflogund finden Sie eine Liste von (Teil-) begehen sehen shas (das heißt, Hashes) , dass Sie in bewegten sich haben Finden Sie die commit Sie zerstört, und dies tun.:

git checkout -b someNewBranchName shaYouDestroyed

Sie haben dieses Commit jetzt wiederbelebt. Commits werden in Git 90 Tage lang nicht zerstört, daher können Sie normalerweise zurückgehen und eines retten, das Sie nicht loswerden wollten.

Ryan Lundy
quelle
15
IN ACHT NEHMEN! Dies könnte nicht das tun, was Sie erwarten, wenn Ihr fehlerhaftes Commit eine (schnelle) Zusammenführung war! Wenn sich Ihr Kopf in einem Zusammenführungs-Commit befindet (z. B. Feature mit zusammengeführtem Zweig in Master), git reset --hard~1verweist der Master-Zweig auf das letzte Commit innerhalb des Feature-Zweigs. In diesem Fall sollte anstelle des relativen Befehls die spezifische Festschreibungs-ID verwendet werden.
Chris Kerekes
90
Fehlen eines entscheidenden Punktes: Wenn das besagte Commit zuvor auf die Fernbedienung "übertragen" wurde, verursacht jede noch so einfache "Rückgängig" -Operation dem Rest der Benutzer, die dieses Commit in ihrer lokalen Kopie haben, enorme Schmerzen und Leiden. wenn sie in Zukunft einen "Git Pull" machen. Wenn das Commit bereits "gepusht" wurde, gehen Sie stattdessen folgendermaßen vor: git revert <bad-commit-sha1-id> git push origin:
FractalSpace
12
@FractalSpace, es wird nicht "enorme Schmerzen und Leiden" verursachen. Ich habe ein paar Force-Pushs durchgeführt, wenn ich Git mit einem Team verwendet habe. Alles was es braucht ist Kommunikation.
Ryan Lundy
14
@Kyralessa An meinem Arbeitsplatz wird es nicht als "Kommunikation" bezeichnet, den Workflow des gesamten Teams durcheinander zu bringen und ihnen dann zu sagen, wie sie das Problem beheben können. Das Umschreiben des Git-Verlaufs ist eine zerstörerische Operation, bei der Teile des Repos zerstört werden. Es ist einfach unverantwortlich, auf seiner Verwendung zu bestehen, obwohl klare und sichere Alternativen verfügbar sind.
FractalSpace
14
Ich wollte ein Commit nuklearisieren und es nie wieder sehen. Ich habe Ihr Beispiel mit verwendet, --hardaber was ich nicht realisiert habe, ist, dass all meine nicht inszenierten Änderungen in meinem Arbeitsbaum auch zerstört werden! Ich wollte diese Dateien als Teil eines späteren Commits festschreiben. Jetzt scheint es unmöglich, diese Dateien zurückzubekommen - ich habe sogar die Lösung ausprobiert, über die Sie geschrieben haben, reflogaber dadurch wurden die zuvor nicht bereitgestellten Änderungen nicht wiederhergestellt.
Adam Burley
2129

Es gibt zwei Möglichkeiten, Ihr letztes Commit "rückgängig zu machen", je nachdem, ob Sie Ihr Commit bereits öffentlich gemacht haben oder nicht (in Ihr Remote-Repository verschoben):

So machen Sie ein lokales Commit rückgängig

Angenommen, ich habe lokal festgeschrieben, aber jetzt möchte ich dieses Festschreiben entfernen.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

Um alles wieder so zu machen, wie es vor dem letzten Commit war, müssen wir resetdas Commit vor HEAD:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

Jetzt git logwird gezeigt, dass unser letztes Commit entfernt wurde.

So machen Sie ein öffentliches Commit rückgängig

Wenn Sie Ihre Commits bereits veröffentlicht haben, möchten Sie ein neues Commit erstellen, das die Änderungen "zurücksetzt", die Sie in Ihrem vorherigen Commit (aktueller HEAD) vorgenommen haben.

git revert HEAD

Ihre Änderungen werden nun rückgängig gemacht und können von Ihnen übernommen werden:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Weitere Informationen finden Sie unter Git Basics - Undoing Things .

Andrew
quelle
101
Ich fand diese Antwort am klarsten. git revert HEAD^ist nicht die vorherige, ist die vorherige der vorherigen. Ich habe: git revert HEADund dann nochmal drücken und es hat funktioniert :)
nacho4d
Wenn Git dich fragt "Mehr?" Wenn Sie diese Befehle ausprobieren, verwenden Sie die alternative Syntax für diese Antwort: stackoverflow.com/a/14204318/823470
tar
1745

Fügen Sie Dateien hinzu / entfernen Sie sie, um die gewünschten Ergebnisse zu erzielen:

git rm classdir
git add sourcedir

Ändern Sie dann das Commit:

git commit --amend

Das vorherige, fehlerhafte Commit wird bearbeitet, um den neuen Indexstatus widerzuspiegeln. Mit anderen Worten, es ist, als hätten Sie den Fehler überhaupt nicht gemacht.

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

bdonlan
quelle
2
Zu Ihrer Information: Dadurch werden alle meine Dateien entfernt und ich habe Änderungen verloren.
egorlitvinenko
UPD: Ich habe es jedoch mit Reflog wiederhergestellt. Die Quittung funktionierte jedoch beim ersten Festschreiben nicht.
egorlitvinenko
1
Verwenden Sie git rm --cacheddiese Option , um die Dateien im Dateisystem zu behalten und sie nur aus dem Git-Index zu löschen!
xuiqzy
1015
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

oder

git reset --hard HEAD~1

Warnung: Mit dem obigen Befehl werden die Änderungen an den .javaDateien (und allen anderen Dateien), die Sie festschreiben möchten, dauerhaft entfernt .

Das hard resetto HEAD-1setzt Ihre Arbeitskopie auf den Status des Commits vor Ihrem falschen Commit.

Lennart Koopmann
quelle
19
git commit -a -m "" oder git commit -am "" natürlich! :]
Trejder
Eine weitere Abkürzung für die Verwendung von Stash. Wenn Sie alles aufheben möchten (git add rückgängig machen) git stash, danngit stash pop
seanriordan08
778

So ändern Sie das letzte Commit

Ersetzen Sie die Dateien im Index:

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

Wenn es sich um eine private Niederlassung handelt, ändern Sie das Commit:

git commit --amend

Wenn es sich um einen gemeinsam genutzten Zweig handelt, führen Sie ein neues Commit durch:

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


( Um ein vorheriges Commit zu ändern , verwenden Sie die fantastische interaktive Rebase .)


ProTip ™: Fügen Sie *.classeinen Gitignore hinzu , um dies zu verhindern.


So setzen Sie ein Commit zurück

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

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

git reset @~N

Wo N ist die Anzahl der Commits zuvor HEADund wird @~auf das vorherige Commit zurückgesetzt.

Anstatt das Commit zu ändern, können Sie Folgendes verwenden:

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

Schauen Sie sich git help resetinsbesondere die Abschnitte an--soft --mixed und --hard, um besser zu verstehen, was dies bewirkt.

Reflog

Wenn Sie es vermasseln, können Sie immer das Reflog verwenden, um abgelegte 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


Zaz
quelle
2
Für diejenigen, die in Zukunft lesen - bitte beachten Sie, dass dies git revertein separater Befehl ist -, der im Grunde ein einzelnes Kommimt zurücksetzt.
BKSpurgeon
681

Verwenden Sie git revert <commit-id>.

Um die Commit-ID zu erhalten, verwenden Sie einfach git log.

Jaco Pretorius
quelle
15
Was bedeutet das, Kirsche wählen Sie das Commit? In meinem Fall befand ich mich beim Bearbeiten einer Datei im falschen Zweig. Ich habe es begangen und dann festgestellt, dass ich in der falschen Branche war. Durch die Verwendung von "git reset --soft HEAD ~ 1" bin ich kurz vor dem Festschreiben zurückgekehrt. Wenn ich jetzt den richtigen Zweig auschecke, wie mache ich die Änderungen an der Datei im falschen Zweig rückgängig und mache sie stattdessen (mit demselben Namen) Datei) im richtigen Zweig?
Astronomerdave
Ich habe gerade git revert commit-idgearbeitet wie ein Zauber. Dann müssen Sie natürlich Ihre Änderungen vorantreiben.
Casey Robinson
8
Ich glaube das wäre git cherry-pick <<erroneous-commit-sha>>@astronomerdave. Von, Mr. Fast 2 Jahre zu spät zur Party.
Tom Howard
@Kris: Anstelle von Cherry-Pick verwenden Sie Rebase. Weil es fortgeschrittenes Kirschpflücken ist
Eugen Konkov
Ich würde Revert nur verwenden, wenn ich mein Commit bereits verschoben habe. Andernfalls ist das Zurücksetzen eine bessere Option. Vergessen Sie nicht, dass beim Zurücksetzen ein neues Commit erstellt wird. Dies ist normalerweise nicht das Ziel.
Hola Soja Edu Feliz Navidad
532

Wenn Sie vorhaben, ein lokales Commit vollständig rückgängig zu machen, was auch immer Sie am Commit geändert haben, und wenn Sie sich darüber keine Sorgen machen, führen Sie einfach den folgenden Befehl aus.

git reset --hard HEAD^1

(Dieser Befehl ignoriert Ihr gesamtes Commit und Ihre Änderungen gehen vollständig in Ihrem lokalen Arbeitsbaum verloren.) Wenn Sie Ihr Commit rückgängig machen möchten, aber Ihre Änderungen im Staging-Bereich (vor dem Commit genau wie danach git add) möchten, führen Sie den folgenden Befehl aus.

git reset --soft HEAD^1

Jetzt kommen Ihre festgeschriebenen Dateien in den Staging-Bereich. Angenommen, Sie möchten die Dateien auf die Bühne bringen, weil Sie einen falschen Inhalt bearbeiten müssen, und führen dann den folgenden Befehl aus

git reset HEAD

Jetzt werden festgeschriebene Dateien aus dem bereitgestellten Bereich in den nicht bereitgestellten Bereich übertragen. Jetzt können Dateien bearbeitet werden. Was auch immer Sie ändern, Sie möchten sie bearbeiten und hinzufügen und ein neues Commit durchführen.

Mehr

Madhan Ayyasamy
quelle
13
@SMR, In Ihrem Beispiel zeigen alle nur auf den aktuellen HEAD. KOPF ^ = KOPF ^ 1. Sowie HEAD ^ 1 = HEAD ~ 1. Wenn Sie HEAD ~ 2 verwenden, gibt es einen Unterschied zwischen den Symbolen ~ und ^. Wenn Sie ~ 2 verwenden, bedeutet dies "der erste Elternteil des ersten Elternteils" oder "der Großelternteil".
Madhan Ayyasamy
501

Wenn Sie Git Extras installiert haben, können Sie git undodas letzte Commit rückgängig machen. git undo 3macht die letzten drei Commits rückgängig.

nickf
quelle
470

Ich wollte die letzten fünf Commits in unserem gemeinsam genutzten Repository rückgängig machen. Ich habe die Revisions-ID nachgeschlagen, auf die ich zurücksetzen wollte. Dann habe ich folgendes eingegeben.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
neoneye
quelle
25
Das Umschreiben des Verlaufs in einem gemeinsam genutzten Repository ist im Allgemeinen eine sehr schlechte Idee. Ich gehe davon aus, dass Sie wissen, was Sie tun. Ich hoffe nur, dass zukünftige Leser dies auch tun.
Brad Koch
Ja, Rollback ist gefährlich. Stellen Sie sicher, dass sich Ihre Arbeitskopie im gewünschten Zustand befindet, bevor Sie pushen. Beim Drücken werden dann die unerwünschten Commits dauerhaft gelöscht.
Neoneye
6
"Genau wie in der realen Welt braucht man eine Verschwörung, wenn man die Geschichte neu schreiben will: Jeder muss an der Verschwörung beteiligt sein (zumindest jeder, der über die Geschichte Bescheid weiß, dh jeder, der jemals aus dem Zweig gezogen hat). . " Quelle: stackoverflow.com/a/2046748/334451
Mikko Rantalainen
440

Ich bevorzuge die Verwendung git rebase -ifür diesen Job, da eine schöne Liste angezeigt wird, in der ich die Commits auswählen kann, die entfernt werden sollen. Es ist vielleicht nicht so direkt wie einige andere Antworten hier, aber es fühlt sich einfach richtig an .

Wählen Sie aus, wie viele Commits Sie auflisten möchten, und rufen Sie dann wie folgt auf (um die letzten drei zu registrieren).

git rebase -i HEAD~3

Beispielliste

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Dann entfernt Git Commits für jede Zeile, die Sie entfernen.

Steven Penny
quelle
422

So beheben Sie das vorherige lokale Commit

Verwenden Sie git-gui (oder ähnliches), um a auszuführen git commit --amend . Über die GUI können Sie einzelne Dateien zum Commit hinzufügen oder daraus entfernen. Sie können auch die Festschreibungsnachricht ändern.

So machen Sie das vorherige lokale Commit rückgängig

Setzen Sie einfach Ihren Zweig auf den vorherigen Speicherort zurück (z. B. mit gitkoder git rebase). Übernehmen Sie dann Ihre Änderungen von einer gespeicherten Kopie erneut. Nach der Speicherbereinigung in Ihrem lokalen Repository ist das unerwünschte Festschreiben nie aufgetreten. Verwenden Sie dazu all dies in einem einzigen Befehlgit reset HEAD~1 .

Ein Wort der Warnung : Die unachtsame Verwendung von git resetist eine gute Möglichkeit, Ihre Arbeitskopie in einen verwirrenden Zustand zu versetzen. Ich empfehle Git-Neulingen, dies zu vermeiden, wenn sie können.

So machen Sie ein öffentliches Commit rückgängig

Führen Sie einen Reverse Cherry Pick ( Git-Revert ) durch, um die Änderungen rückgängig zu machen.

Wenn Sie noch keine weiteren Änderungen in Ihrem Zweig vorgenommen haben, können Sie einfach ...

git revert --no-edit HEAD

Verschieben Sie dann Ihren aktualisierten Zweig in das freigegebene Repository.

In der Festschreibungshistorie werden beide Festschreibungen getrennt angezeigt .


Erweitert: Korrektur des privaten Zweigs im öffentlichen Repository

Dies kann gefährlich sein - stellen Sie sicher, dass Sie eine lokale Kopie des Zweigs zum Zurücksetzen haben.

Beachten Sie auch: Sie möchten dies nicht tun, wenn möglicherweise jemand anderes an der Zweigstelle arbeitet.

git push --delete (branch_name) ## remove public version of branch

Räumen Sie Ihre Filiale vor Ort auf und wiederholen Sie den Vorgang ...

git push origin (branch_name)

Im Normalfall brauchen Sie sich wahrscheinlich keine Sorgen zu machen, dass Ihr Commit-Verlauf für private Niederlassungen makellos ist. Drücken Sie einfach ein Follow-up-Commit (siehe 'So machen Sie ein öffentliches Commit rückgängig' oben) und führen Sie später eine Squash-Zusammenführung durch , um den Verlauf auszublenden.

nobar
quelle
8
gitk --all $(git reflog | cut -c1-7)&Dies kann hilfreich sein, um die vorherige Revision zu finden, wenn Sie ein Commit "--amend" rückgängig machen möchten.
Nobar
4
Wenn Sie versuchen, geheime Informationen zu entfernen, bevor Sie sie in ein freigegebenes Repository verschieben, hilft Ihnen ein Zurücksetzen nicht, da sich die Informationen weiterhin im Verlauf des vorherigen Commits befinden. Wenn Sie sicherstellen möchten, dass die Änderung für andere niemals sichtbar ist, müssen Sie sie verwendengit reset
Jherico
Ich denke, "privat" / "öffentlich" wäre korrekter "lokal" / "fern".
Nobar
Das Korrigieren eines privaten Zweigs im Remote-Repository kann auch einfach erfolgengit push origin (branch_name) --force
nobar
335

Wenn Sie es dauerhaft rückgängig machen möchten und ein Repository geklont haben

Die Commit-ID kann von gesehen werden

git log 

Dann können Sie tun -

git reset --hard <commit_id>

git push origin <branch_name> -f
Poorva
quelle
Was ist, wenn Sie nicht "<commit_id>" verwenden und einfach "git reset --hard" verwenden? Normalerweise möchte ich nur meine neuesten Updates entfernen, die ich noch nicht festgeschrieben habe, und auf das letzte Festschreiben zurückgreifen, das ich vorgenommen habe, und ich verwende immer "git reset --hard".
Jaime Montoya
3
@JaimeMontoya Um die letzten Änderungen rückgängig zu machen, die Sie verwenden können git reset --hard, aber wenn Sie die letzten "n" Commits hart entfernen müssen, geben Sie eine SHA
Poorva
334

Wenn Sie Junk begangen, aber nicht gepusht haben,

git reset --soft HEAD~1

HEAD ~ 1 ist eine Abkürzung für das Commit vor dem Kopf. Alternativ können Sie sich auf SHA-1 des Hashs beziehen, wenn Sie auf zurücksetzen möchten. Die Option --soft löscht das Commit, lässt jedoch alle geänderten Dateien " Commits to commit", wie der Git-Status es ausdrücken würde.

Wenn Sie Änderungen an den nachverfolgten Dateien im Arbeitsbaum seit dem Festschreiben vor dem Kopf entfernen möchten, verwenden Sie stattdessen " --hard ".

ODER

Wenn Sie bereits gedrückt und jemand gezogen hat, was normalerweise mein Fall ist, können Sie den Git-Reset nicht verwenden . Sie können jedoch einen Git-Revert durchführen ,

git revert HEAD

Dadurch wird ein neues Commit erstellt, das alles umkehrt, was durch das versehentliche Commit eingeführt wurde.

santos_mgr
quelle
Ich bin im 2. Fall, aber wenn ich "git revert HEAD" mache, heißt es "Fehler: Commit [ID] ist eine Zusammenführung, aber es wurde keine Option -m angegeben. Schwerwiegend: Zurücksetzen fehlgeschlagen". Irgendwelche Vorschläge?
Metaforge
2
Erwähnenswert ist wahrscheinlich, dass Sie stattdessen HEAD~1den tatsächlichen Hash verwenden können, der von git log --statoder durch angezeigt wird git reflog- nützlich, wenn Sie mehr als ein Commit rückgängig machen müssen.
ccpizza
284

In SourceTree (GUI für GitHub) können Sie mit der rechten Maustaste auf das Commit klicken und ein 'Reverse Commit' durchführen. Dies sollte Ihre Änderungen rückgängig machen.

Auf dem Terminal:

Sie können alternativ verwenden:

git revert

Oder:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
Varun Parakh
quelle
263

Ein einziger Befehl:

git reset --soft 'HEAD^' 

Es funktioniert hervorragend, das letzte lokale Commit rückgängig zu machen!

Manish Shrivastava
quelle
11
Ich musste git reset --soft "HEAD ^" mit doppelten Anführungszeichen schreiben, da ich es über die Windows-Eingabeaufforderung schreibe.
Ena
253

Setzen Sie es einfach mit dem folgenden Befehl zurück git:

git reset --soft HEAD~1

Erklären Sie: Was git resetbedeutet das ? Es handelt sich im Grunde genommen resetum ein Commit, zu dem Sie zurückkehren möchten. Wenn Sie es dann mit dem --softSchlüssel kombinieren , wird es zurückgehen, aber die Änderungen in Ihren Dateien behalten, damit Sie wieder auf die Bühne zurückkehren Was die Datei gerade hinzugefügt wurde, HEADist der Kopf des Zweigs und wenn Sie mit kombinieren ~1(in diesem Fall verwenden Sie auch HEAD^), wird nur ein Commit zurückgegeben, was Sie wollen ...

Ich erstelle die Schritte in der Abbildung unten detaillierter für Sie, einschließlich aller Schritte, die in realen Situationen auftreten können, und des Festschreibens des Codes:

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

Alireza
quelle
239

Wie mache ich das letzte Git-Commit rückgängig?

Um alles wieder so zu machen, wie es vor dem letzten Commit war, müssen wir das Commit vor HEAD zurücksetzen.

  1. Wenn Sie Ihre vorgenommenen Änderungen nicht beibehalten möchten:

    git reset --hard HEAD^
    
  2. Wenn Sie Ihre Änderungen behalten möchten:

    git reset --soft HEAD^
    

Überprüfen Sie nun Ihr Git-Protokoll. Es wird angezeigt, dass unser letztes Commit entfernt wurde.

Ranjithkumar Ravi
quelle
193

"Setzen Sie den Arbeitsbaum auf das letzte Commit zurück"

git reset --hard HEAD^ 

"Unbekannte Dateien aus dem Arbeitsbaum entfernen"

git clean    

siehe - Git-Kurzreferenz

HINWEIS: Mit diesem Befehl wird Ihr vorheriges Commit gelöscht. Verwenden Sie es daher mit Vorsicht! git reset --hardist sicherer.

Ravi_Parmar
quelle
190

Verwenden Sie Reflog, um einen korrekten Status zu finden

git reflog

vorher reflog REFLOG VOR DEM RESET

Wählen Sie das richtige Reflog (in meinem Fall f3cb6e2) und geben Sie ein

git reset --hard f3cb6e2

Danach wird der Repo-HEAD auf diesen HEADid zurückgesetzt Effekt zurücksetzen NACH RESET LOG zurückgesetzt

Schließlich sieht das Reflog wie auf dem Bild unten aus

reflog nach REFLOG FINAL

Shubham Chaudhary
quelle
164

Erster Lauf:

git reflog

Es zeigt Ihnen alle möglichen Aktionen, die Sie in Ihrem Repository ausgeführt haben, z. B. Festschreiben, Zusammenführen, Ziehen usw.

Dann mach:

git reset --hard ActionIdFromRefLog
U. Ali
quelle
155

Letztes Commit rückgängig machen:

git reset --soft HEAD^ oder git reset --soft HEAD~

Dadurch wird das letzte Commit rückgängig gemacht.

Hier --softbedeutet Zurücksetzen in die Inszenierung.

HEAD~oder HEAD^bedeutet, sich zu bewegen, um vor HEAD zu begehen.


Ersetzen Sie das letzte Commit durch ein neues Commit:

git commit --amend -m "message"

Das letzte Commit wird durch das neue Commit ersetzt.

akshay_rahar
quelle
153

Ein anderer Weg:

Überprüfen Sie den Zweig, den Sie zurücksetzen möchten, und setzen Sie dann Ihre lokale Arbeitskopie auf das Commit zurück, das Sie als letztes auf dem Remote-Server verwenden möchten (alles, was danach passiert, wird auf Wiedersehen). Dazu habe ich in SourceTree mit der rechten Maustaste auf "BRANCHNAME auf dieses Commit zurücksetzen" geklickt und ausgewählt.

Navigieren Sie dann zum lokalen Verzeichnis Ihres Repositorys und führen Sie den folgenden Befehl aus:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Dadurch werden alle Commits nach dem aktuellen in Ihrem lokalen Repository gelöscht, jedoch nur für diesen einen Zweig.

CommaToast
quelle
144

Geben git logSie den letzten Commit-Hash-Code ein, suchen Sie ihn und geben Sie Folgendes ein:

git reset <the previous co>
Peter Mortensen
quelle
139

In meinem Fall habe ich versehentlich einige Dateien festgeschrieben, die ich nicht wollte. Also habe ich folgendes gemacht und es hat funktioniert:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Überprüfen Sie die Ergebnisse mit gitk oder git log --stat

egridasov
quelle
133

Führen Sie dies einfach in Ihrer Befehlszeile aus:

git reset --soft HEAD~ 
ihue
quelle
126

Es gibt viele Möglichkeiten, dies zu tun:

Git-Befehl zum Rückgängigmachen des letzten Commits / vorherigen Commits:

Warnung: Verwenden Sie --hard nicht, wenn Sie nicht wissen, was Sie tun. --hard ist zu gefährlich und kann Ihre Dateien löschen.

Der grundlegende Befehl zum Zurücksetzen des Commits in Git lautet:

$ git reset --hard <COMMIT -ID>

oder

$ git reset --hard HEAD~<n>

COMMIT-ID : ID für das Commit

n: ist die Anzahl der letzten Commits, die Sie zurücksetzen möchten

Sie können die Commit-ID wie folgt erhalten:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

wo d81d3f1 und be20eb8 Commit-ID.

Nun sehen wir uns einige Fälle an:

Angenommen, Sie möchten das letzte Commit 'd81d3f1' zurücksetzen. Hier sind zwei Möglichkeiten:

$ git reset --hard d81d3f1

oder

$ git reset --hard HEAD~1

Angenommen, Sie möchten das Commit 'be20eb8' zurücksetzen:

$ git reset --hard be20eb8

Für detailliertere Informationen können Sie auch einige andere Befehle zum Zurücksetzen des Kopfes auf einen bestimmten Status verwenden:

$ git reset --help
Benutzer3799762
quelle
5
git reset --hard HEAD~1ist zu gefährlich ! Dadurch wird nicht nur das letzte Festschreiben abgebrochen, sondern das Repo wird vollständig auf das vorherige Festschreiben zurückgesetzt. Sie werden also alle Änderungen verlieren, die beim letzten Festschreiben festgeschrieben wurden!
Arnis Juraga
Sie haben Recht, um dies rückgängig zu machen, können Sie verwendengit push -f <remote> HEAD@{1}:<branch>
Benny
Leider benutze ich --hard und meine Dateien werden gelöscht! Ich habe den Kommentar nicht zuerst überprüft, da er reduziert ist. Verwenden Sie nicht --hard, wenn Sie nicht wissen, was Sie tun!
anonym
125

Für ein lokales Commit

git reset --soft HEAD~1

oder wenn Sie sich nicht genau erinnern, um welches Commit es sich handelt, können Sie es verwenden

git rm --cached <file>

Für ein Push-Commit

Die richtige Methode zum Entfernen von Dateien aus dem Repository-Verlauf ist die Verwendung git filter-branch. Das ist,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Ich empfehle Ihnen jedoch, diesen Befehl mit Vorsicht zu verwenden. Lesen Sie mehr unter git-filter-branch (1) Manual Page .

Geoom
quelle
125

Es gibt zwei Hauptszenarien

Sie haben das Commit noch nicht vorangetrieben

Wenn das Problem zusätzliche Dateien waren, die Sie festgeschrieben haben (und die Sie nicht im Repository haben möchten), können Sie sie mit git rmund anschließend mit festschreiben--amend

git rm <pathToFile>

Sie können auch ganze Verzeichnisse -rmit anderen Bash- Befehlen entfernen oder sogar mit diesen kombinieren

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Nach dem Entfernen der Dateien können Sie mit der Option --amend festschreiben

git commit --amend -C HEAD # the -C option is to use the same commit message

Dadurch wird Ihr aktuelles lokales Commit neu geschrieben, wobei die zusätzlichen Dateien entfernt werden. Diese Dateien werden also niemals per Push gesendet und auch von GC aus Ihrem lokalen .git-Repository entfernt.

Sie haben das Commit bereits verschoben

Sie können dieselbe Lösung wie im anderen Szenario anwenden und dann git pushmit der -fOption arbeiten, dies wird jedoch nicht empfohlen da der Remote-Verlauf mit einer abweichenden Änderung überschrieben wird (dies kann Ihr Repository durcheinander bringen).

Stattdessen müssen Sie das Commit ohne --amendausführen (denken Sie daran, dass -amend`: Diese Option schreibt den Verlauf des letzten Commits neu).

dseminara
quelle
125

So setzen Sie alle nicht festgeschriebenen Änderungen dauerhaft zurück, um auf die vorherige Version zurückzusetzen:

git reset --hard HEAD~1
Stern
quelle
23
Vielleicht könnten Sie bei einer Notiz / Warnung, dass sein Befehl das Commit und die Änderungen im Arbeitsverzeichnis wegwirft, ohne weiter zu fragen.
cr7pt0gr4ph7
6
Wenn Sie dies versehentlich tun, ist jedoch nicht alles verloren. Siehe stackoverflow.com/questions/10099258/… , stackoverflow.com/questions/15479501/… und stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959 .
cr7pt0gr4ph7
13
Verwenden --softSie die Änderungen zu halten , wie uncommitted changes, --hardatomisieren das Commit vollständig und wieder zurück nach der anderen. Denken Sie daran, solche Vorgänge nur für Änderungen durchzuführen, die noch nicht gepusht wurden.
Yunus Nedim Mehel
@Zaz: Du hast recht; Vielleicht hätte ich das klarstellen sollen. Möglicherweise können nur Dateien / Änderungen wiederhergestellt werden, die entweder dem Index hinzugefügt (/ staged) oder festgeschrieben wurden. Nicht festgeschriebene, nicht bereitgestellte Änderungen werden , wie Sie sagten, von weggeworfen git reset --hard.
cr7pt0gr4ph7
1
Als Randnotiz: Jedes Mal, wenn eine Datei bereitgestellt wird, wird gitihr Inhalt in ihrer Objektdatenbank gespeichert. Der gespeicherte Inhalt wird nur entfernt, wenn die Speicherbereinigung ausgeführt wird. Es ist daher möglich, die zuletzt bereitgestellte Version einer Datei wiederherzustellen, die zum git reset --hardZeitpunkt der Ausführung noch nicht bereitgestellt wurde (weitere Informationen finden Sie in den oben verlinkten Beiträgen).
cr7pt0gr4ph7