Wie kann ich ein "Git Commit" lokal und auf einer Fernbedienung nach "Git Push" rückgängig machen?

242

Ich habe git commitgefolgt von einem durchgeführt git push. Wie kann ich diese Änderung sowohl in lokalen als auch in Remote-Repositorys rückgängig machen?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael [email protected]>
Date:   Tue Jun 11 12:24:23 2011 -0700
Michael
quelle

Antworten:

400
git reset --hard HEAD~1
git push -f <remote> <branch>

(Beispiel Push: git push -f origin bugfix/bug123)

Dadurch wird das letzte Commit rückgängig gemacht und der aktualisierte Verlauf auf die Fernbedienung übertragen. Sie müssen das übergeben, -fda Sie den Upstream-Verlauf in der Fernbedienung ersetzen.

Alexander Groß
quelle
24
Alternativ verwenden git reset --hard <the-sha-you-want-to-return-to>.
Alexander Groß
2
Die Referenz heißt HEAD (case sensitive)
dunni
26
Seien Sie auch vorsichtig - AFAIK, Sie sollten dies nicht tun, wenn andere Leute aus dem Repo gezogen haben.
Amadan
1
@BipinVayalu Dies wirkt sich auf den Zweig aus, in dem Sie sich gerade befinden. Genauer gesagt, der KOPF. Der HEAD wird meistens an einen Zweig "angehängt" (zeigt auf einen Zweignamen, anstatt direkt auf ein Commit zu zeigen). Im Allgemeinen wirkt sich dies also auf den Zweig aus, auf den HEAD zeigt. Verwenden git log --decorate --onelineSie diese Option, um herauszufinden, wohin Ihr KOPF zeigt.
Alexander Groß
4
git reset HEAD~1wenn Sie nicht möchten, dass Ihre Änderungen weg sind (nicht bereitgestellte Änderungen). Ändern, git push -f [origin] [branch]
festschreiben
161

Führen Sie im Allgemeinen ein "inverses" Commit durch, indem Sie Folgendes verwenden:

git revert 364705c

Senden Sie es dann wie gewohnt an die Fernbedienung:

git push

Dadurch wird das Commit nicht gelöscht: Es wird ein zusätzliches Commit ausgeführt, das alles rückgängig macht, was beim ersten Commit ausgeführt wurde. Alles andere, nicht wirklich sicher, besonders wenn die Änderungen bereits weitergegeben wurden.

Amadan
quelle
9
Dies ist eine sicherere (also wahrscheinlich bessere) Antwort als die von Alexander Groß (die gewählte Antwort).
Graeck
6
@Graeck Jede der Lösungen hat ihre Auswirkungen und Vorzüge.
Alexander Groß
5
Dies sollte die akzeptierte Antwort sein. Es wird empfohlen, die Geschichte niemals zu überschreiben, noch mehr, wenn Sie mit einem Team zusammenarbeiten. git resetwird nur akzeptiert, wenn Sie die Änderungen noch nicht auf den Server übertragen haben.
Josue Alexander Ibarra
17
@ JosueIbarra Ich bin nicht einverstanden für alle Fälle. In den meisten Fällen sollten Sie den Verlauf nicht überschreiben. Ich glaube jedoch, dass es legitime Fälle gibt, in denen Sie unbedingt sollten. Zum Beispiel haben Sie versehentlich Ihre Geheimdatei festgeschrieben und hochgeschoben. Das sollte nicht im Git Repo sein. So können Sie es mit der akzeptierten Antwort hier schnell entfernen.
Bfcoder
11
@bfcoder Wenn Sie ein "Geheimnis" in ein Remote-Repo verschoben haben, ist es kein Geheimnis mehr. Und die richtige Lösung besteht darin, ein neues Geheimnis zu schaffen und nicht zu versuchen, Ihren Fehler zu verbergen.
Erbsman
41

Zunächst einmal entspannen.

"Nichts ist unter unserer Kontrolle. Unsere Kontrolle ist bloße Illusion.", "Irren ist menschlich"

Ich verstehe, dass Sie Ihren Code unbeabsichtigt angeschoben haben remote-master. Das wird in Ordnung sein.

1. Ermitteln Sie zunächst den SHA-1Wert des Commits, den Sie zurückgeben möchten, z. B. Commit für den Hauptzweig. Führen Sie Folgendes aus:

git log

Sie werden eine Reihe von 'f650a9e398ad9ca606b25513bd4af9fe ...' wie Zeichenfolgen zusammen mit jedem der Commits sehen. Kopieren Sie diese Nummer aus dem Commit, das Sie zurückgeben möchten .

2. Geben Sie nun den folgenden Befehl ein:

git reset --hard your_that_copied_string_but_without_quote_mark

Sie sollten eine Meldung wie "HEAD is now at" sehen. du bist klar. Was es gerade getan hat, ist, diese Änderung lokal zu reflektieren.

3. Geben Sie nun den folgenden Befehl ein:

git push -f

du solltest sehen wie

"Warnung: push.default ist nicht gesetzt; sein impliziter Wert hat sich geändert in ..... ... Gesamt 0 (Delta 0), wiederverwendet 0 (Delta 0) ... ... your_branch_name -> master (erzwungene Aktualisierung) . "

Jetzt ist alles klar. Überprüfen Sie den Master erneut mit "git log". Ihr Fixed_destination_Commit sollte ganz oben auf der Liste stehen.

Gern geschehen (im Voraus;))

AKTUALISIEREN:

Nun sind die Änderungen, die Sie vorgenommen haben, bevor all diese begonnen haben, jetzt weg. Wenn Sie diese harten Arbeiten wieder zurückbringen möchten, ist dies möglich. Dank git reflog und git cherry-pick Befehlen.

Dafür würde ich vorschlagen, diesem Blog oder diesem Beitrag zu folgen .

kmonsoor
quelle
Es ist eine gute Maßnahme, die Fernbedienung und den Zweig auch anzugeben, wenn Sie "git push -f" ausführen, aber "git push -f" funktioniert die meiste Zeit trotzdem
Robson
8

git reset HEAD~1wenn Sie nicht möchten, dass Ihre Änderungen weg sind (nicht bereitgestellte Änderungen). Ändern, festschreiben und erneut drückengit push -f [origin] [branch]

softvar
quelle
3

Sie können eine interaktive Rebase durchführen:

git rebase -i <commit>

Dadurch wird Ihr Standardeditor aufgerufen. Löschen Sie einfach die Zeile mit dem Commit, das Sie entfernen möchten, um dieses Commit zu löschen.

Sie benötigen natürlich Zugriff auf das Remote-Repository, um diese Änderung auch dort anzuwenden.

Siehe diese Frage: Git: Entfernen ausgewählter Commits aus dem Repository

Jack Edmonds
quelle
3

Versuchen Sie es mit

git reset --hard <commit id> 

Bitte beachten Sie: Hier wird die Commit-ID die ID des Commits angeben, zu dem Sie wechseln möchten, nicht jedoch die ID, die Sie zurücksetzen möchten. Dies war der einzige Punkt, an dem ich auch stecken blieb.

dann drücken

git push -f <remote> <branch>
Mohit Dhawan
quelle
2

Alternative:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Erzwingen Sie den Hauptzweig des Ursprungs-Remote-Repositorys auf das übergeordnete Element des letzten Commits

MicRum
quelle