Frage Wie rückgängig machen die letzten Commits in Git?


Ich habe versehentlich falsche Dateien angestellt Git, aber ich habe das Commit noch nicht auf den Server übertragen.

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


17794
2017-07-28 22:22


Ursprung


Antworten:


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. Dadurch bleibt Ihr Arbeitsbaum (der Status Ihrer Dateien auf der Festplatte) unverändert, aber das Commit wird rückgängig gemacht und die Änderungen, die Sie festgelegt haben, werden nicht gesetzt (sodass sie in "Nicht für das Commit bereitgestellte Änderungen" angezeigt werden) git status, und Sie müssen sie erneut hinzufügen, bevor Sie sich verpflichten). Wenn du nur möchte hinzufügen Weitere Änderungen am vorherigen Commit oder Ändern der Commit-Nachricht1, Du könntest benutzen git reset --soft HEAD~ stattdessen, das ist wie git reset HEAD~ (woher HEAD~ ist das gleiche wie HEAD~1) aber lässt Ihre bestehenden Änderungen inszeniert.
  3. Nehmen Sie Korrekturen an funktionierenden Baumdateien vor.
  4. git add alles, was Sie in Ihren neuen Commit aufnehmen möchten.
  5. Übernehmen Sie die Änderungen und verwenden Sie die alte Commit-Nachricht erneut. reset kopierte den alten Kopf nach .git/ORIG_HEAD; commit mit -c ORIG_HEAD öffnet einen Editor, der zunächst die Log-Nachricht des alten Commits enthält und diese editiert werden kann. Wenn Sie die Nachricht nicht bearbeiten müssen, können Sie die -C Möglichkeit.

Beachten Sie jedoch, dass Sie, wenn Sie dem Index neue Änderungen hinzugefügt haben, verwenden commit --amend fügt sie zu Ihrem vorherigen Commit hinzu.

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

git push origin master --force

Sie können sich diese Antwort auch ansehen:

Wie verschiebe HEAD zurück zu einem früheren Ort? (Freistehendes Kopf)

Die obige Antwort wird Ihnen zeigen git reflog welches verwendet wird, um herauszufinden, zu welchem ​​SHA-1 Sie zurückkehren möchten. Sobald Sie den Punkt gefunden haben, auf den Sie die Befehlsfolge rückgängig machen möchten, wie oben erläutert.


1 Beachten Sie jedoch, dass Sie nicht auf ein früheres Commit zurücksetzen müssen, wenn Sie gerade einen Fehler gemacht haben Commit Nachricht. Die einfachere Möglichkeit ist es git reset (um alle Änderungen, die Sie seither gemacht haben, in den Vordergrund zu stellen) und dann git commit --amend, die Ihren Standard-Commit-Nachrichteneditor öffnet, der mit der letzten Commit-Nachricht vorbelegt ist.


19231
2018-06-16 17:27



Das Rückgängigmachen eines Commits ist ein wenig gruselig, wenn Sie nicht wissen, wie es funktioniert. Aber es ist erstaunlich einfach, wenn Sie es verstehen.

Sagen wir, du hast das, wo C dein HEAD ist und (F) der Zustand deiner Dateien ist.

   (F)
A-B-C
    ↑
  master

Du möchtest nuke begehe C und sehe es nie wieder. Du machst das:

git reset --hard HEAD~1

Das Ergebnis ist:

 (F)
A-B
  ↑
master

Jetzt ist B der KOPF. Weil du benutzt hast --hard, Ihre Dateien werden bei Commit B auf ihren Status zurückgesetzt.

Ah, aber angenommen, Commit C war keine Katastrophe, sondern nur ein bisschen daneben. Du möchtest rückgängig machen, aber behalten Sie Ihre Änderungen bei für ein wenig Bearbeitung, bevor Sie ein besseres Commit machen. Beginne wieder von hier, mit C als deinem KOPF:

   (F)
A-B-C
    ↑
  master

Sie können dies tun, indem Sie die --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 den letzten Commit. Wenn Sie ein tun git reset HEAD~1sagen Sie Git, den HEAD-Zeiger um einen Commit zu verschieben. Aber (außer du verwendest --hard) Sie hinterlassen Ihre Dateien so wie sie waren. Also jetzt git status zeigt die Änderungen, die Sie in C eingecheckt haben. Sie haben nichts verloren!

Für die leichteste Berührung können Sie sogar rückgängig machen Sie Ihre commit aber lassen Sie Ihre Dateien und Ihre Index:

git reset --soft HEAD~1

Dies lässt nicht nur Ihre Dateien allein, es lässt sogar Ihre Index allein. Wenn Sie das tun git statussehen Sie, dass sich dieselben Dateien wie zuvor im Index befinden. In der Tat, direkt nach diesem Befehl könnten Sie tun git commit und Sie würden das gleiche Commit wiederholen, das Sie gerade hatten.

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

Nein, da ist immer noch ein Weg, um es zurückzubekommen. Art git reflog und du wirst eine Liste von (Teil-) Commit-Sas sehen, in denen du dich bewegt hast. Finde das Commit, das du zerstört hast, und tu folgendes:

git checkout -b someNewBranchName shaYouDestroyed

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


9726
2018-05-29 18:16



Das hat eine Weile gedauert, bis ich herausgefunden habe, vielleicht hilft das jemandem ...

Es gibt zwei Möglichkeiten, Ihren letzten Commit rückgängig zu machen, je nachdem, ob Sie Ihren Commit bereits öffentlich gemacht haben (Push in Ihr Remote-Repository):

So machen Sie ein lokales Commit rückgängig

Nehmen wir an, ich habe lokal committed, aber jetzt möchte ich dieses Commit 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 wiederherzustellen, wie es vor dem letzten Commit war, müssen wir es tun reset zum Commit vorher 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 log zeigt an, dass unser letzter Commit entfernt wurde.

Wie man eine öffentliche Verpflichtung rückgängig macht

Wenn Sie Ihre Commits bereits veröffentlicht haben, sollten Sie ein neues Commit erstellen, das die Änderungen zurücknimmt, die Sie bei Ihrem vorherigen Commit (aktueller HEAD) vorgenommen haben.

git revert HEAD

Ihre Änderungen werden nun zurückgesetzt 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-Grundlagen - Dinge rückgängig machen


1744
2018-05-29 18:13



Hinzufügen / Entfernen von Dateien, um die Dinge wie gewünscht zu gestalten:

git rm classdir
git add sourcedir

Ändern Sie dann das Commit:

git commit --amend

Das vorherige fehlerhafte Commit wird bearbeitet, um den neuen Indexzustand widerzuspiegeln - mit anderen Worten, es wird so sein, als ob Sie nie den Fehler gemacht hätten.

Beachten Sie, dass Sie dies nur tun sollten, wenn Sie noch nicht gedrängt haben. Wenn Sie gedrängt haben, müssen Sie nur eine Korrektur normal machen.


1623
2017-07-31 09:39



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 löscht die Änderungen an der .java Dateien (und alle anderen Dateien), die Sie festschreiben wollten.

Das hard reset zu HEAD-1 wird Ihre Arbeitskopie vor dem falschen Commit in den Status des Commits setzen.


875
2018-05-25 16:04



Um das letzte Commit zu ändern

Ersetzen Sie die Dateien im Index:

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

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

git commit --amend

Oder, wenn es sich um einen geteilten Zweig handelt, machen Sie einen neuen Commit:

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


(um ein vorheriges Commit zu ändernNutze das Tolle interaktive Rebase)


ProTip: Hinzufügen *.class zu einem Gitignore um das wieder zu verhindern.


Um einen 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 reset.

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

git reset @~N

Woher N ist die Anzahl der Commits vor HEAD, und @~ setzt auf den vorherigen Commit zurück.

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

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

Auschecken git help reset, speziell die Abschnitte auf --soft  --mixed und --hard, für ein besseres Verständnis dessen, was dies tut.

Reflog

Wenn du versaust, kannst du immer den 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



677
2018-01-31 07:06



Benutzen git revert commit-id

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


547
2017-12-13 10:18



Wenn Sie ein lokales Commit vollständig rückgängig machen möchten, was auch immer Sie an dem Commit vorgenommen haben, und wenn Sie sich darüber keine Gedanken machen, tun Sie einfach den folgenden Befehl.

git reset --hard HEAD^1

(Dieser Befehl ignoriert Ihr gesamtes Commit und Ihre Änderungen gehen vollständig von Ihrem lokalen Arbeitsbaum verloren). Wenn Sie Ihr Commit rückgängig machen wollen, aber Ihre Änderungen im Staging-Bereich wollen (vor dem Commit wie danach) git add) dann den folgenden Befehl ausführen.

git reset --soft HEAD^1

Jetzt kommen Ihre festgeschriebenen Dateien in den Bereitstellungsbereich. Angenommen, Sie möchten die Dateien auflösen, da Sie einige falsche Eingaben bearbeiten müssen. Führen Sie anschließend den folgenden Befehl aus

git reset HEAD

Jetzt übergebene Dateien kommen aus dem gestaffelten Bereich in den nicht gesicherten Bereich. Jetzt sind die Dateien fertig zum Bearbeiten, also was auch immer du änderst, du willst bearbeiten gehen und es hinzufügen und ein neues / neues Commit machen.

Mehr


440
2018-04-06 13:58



Wenn Sie haben Git Extras installiert, können Sie ausführen git undo um das letzte Commit rückgängig zu machen. git undo 3 wird die letzten 3 Commits rückgängig machen.


430
2017-10-25 03:41



Ich wollte die letzten 5 Commits in unserem gemeinsamen Repository rückgängig machen. Ich sah die Revision ID auf, zu der ich zurückkehren wollte. Dann tippte ich folgendes ein.

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 git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

398



Ich bevorzuge es zu benutzen git rebase -i für diesen Job, weil eine nette Liste auftaucht, wo ich die commits wählen kann, um loszuwerden. Es ist vielleicht nicht so direkt wie andere Antworten hier, aber es ist einfach fühlt sich richtig an.

Wählen Sie, wie viele Commits Sie auflisten möchten, und rufen Sie sie dann auf (um die letzten drei einzutragen)

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 die Commits für jede Zeile, die Sie entfernen.


380