Git – Push-Commits rückgängig machen

Ich habe ein Projekt in einem Remote-Repository, synchronisiert mit einem lokalen Repository (Entwicklung) und dem Server-Repository (prod). Ich habe einige bereits vorgenommene Änderungen vorgenommen, die bereits auf den Server übertragen wurden. Jetzt möchte ich diese Änderungen rückgängig machen. Also konnte ich die Änderungen vor den Änderungen überprüfen und die neuen Änderungen festschreiben, aber ich vermute, dass es Probleme geben wird, sie erneut an die Remote-Station zu übertragen. Irgendwelche Vorschläge, wie ich vorgehen sollte?

Sie können einzelne Commits zurücksetzen mit:

 git revert  

Dadurch wird ein neues Commit erstellt, das die Änderungen des angegebenen Commits zurücknimmt. Beachten Sie, dass es nur dieses bestimmte Commit zurücknimmt und danach nicht festschreibt. Wenn Sie eine Reihe von Commits rückgängig machen möchten, können Sie Folgendes tun:

 git revert .. 

Es setzt die Commits zwischen und einschließlich der angegebenen Commits zurück.

Auf der Manpage git-revert finden Sie weitere Informationen zum Befehl git revert . Sehen Sie sich diese Antwort an, um weitere Informationen zum Zurücksetzen von Commits zu erhalten.

Eine Lösung, die keine Spuren des “Undo” hinterlässt.

HINWEIS: Tun Sie dies nicht, wenn jemand bereits Ihre Änderung vorgenommen hat (ich würde dies nur auf meinem persönlichen Repo verwenden)

machen:

 git reset  

Dadurch werden alle Aktualisierungen lokal überprüft (so dass git status alle aktualisierten Dateien auflistet).

dann “tu deine Arbeit” und wiederhole deine Änderungen (Hinweis: dieser Schritt ist optional)

 git commit -am "blabla" 

In diesem Moment unterscheidet sich Ihr lokaler Baum von der Fernbedienung

 git push -f   

Drücken und Remote erzwingen, um diesen Push zu berücksichtigen und den vorherigen zu entfernen (die Angabe von remote-name und branch-name ist nicht obligatorisch, es wird jedoch empfohlen, die Aktualisierung aller Zweige mit Update-Flag zu vermeiden).

!! Aufpassen, dass einige Tags immer noch zeigen, entfernte Commit !! Wie lösche ich ein Remote-Tag

Was ich in diesen Fällen mache ist:

  • Bewegen Sie den Cursor auf dem Server zurück zum letzten bekannten guten Commit:

     git push -f origin : 
  • Lokal, mach dasselbe:

     git reset --hard  # ^^^^^^ # optional 



Sehen Sie sich ein vollständiges Beispiel für einen Zweig my_new_branch , den ich für diesen Zweck erstellt habe:

 $ git branch my_new_branch 

Dies ist der jüngste Verlauf nach dem Hinzufügen von ein paar Sachen zu myfile.py :

 $ git log commit 80143bcaaca77963a47c211a9cbe664d5448d546 Author: me Date: Wed Mar 23 12:48:03 2016 +0100 Adding new stuff in myfile.py commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Ich möchte das letzte Commit loswerden, das bereits gepusht wurde, also laufe ich:

 $ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch Total 0 (delta 0), reused 0 (delta 0) To git@github.com:me/myrepo.git + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update) 

Nett! Jetzt sehe ich, dass die Datei, die bei diesem Commit geändert wurde ( myfile.py ) in “nicht für das Commit myfile.py gestellt” myfile.py :

 $ git status On branch my_new_branch Your branch is up-to-date with 'origin/my_new_branch'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: myfile.py no changes added to commit (use "git add" and/or "git commit -a") 

Da ich diese Änderungen nicht möchte, verschiebe ich den Cursor auch nur lokal:

 $ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e HEAD is now at b4zad07 Initial commit 

Also HEAD ist im vorherigen Commit, sowohl lokal als auch remote:

 $ git log commit b4zad078237fa48746a4feb6517fa409f6bf238e Author: me Date: Tue Mar 18 12:46:59 2016 +0100 Initial commit 

Sie können REVERT (oder Sie können es auch DELETE nennen ) das Git Commit BEIDE lokal und remote ausführen, wenn Sie die folgenden Schritte über die git-Befehlszeile ausführen.

Führen Sie den folgenden Befehl aus, um die Commit-ID anzuzeigen, die Sie zurücksetzen möchten

 git log --oneline --decorate --graph 

Du wirst wie ein folgender Screenshot bekommen Bildbeschreibung hier eingeben

Wenn Sie auch remote (über das Webinterface) überprüfen, können Sie sehen, dass dies wie unten gezeigt ist

Bildbeschreibung hier eingeben

Wie auf dem Screenshot sind Sie derzeit auf der Commit-ID e110322. Sie möchten jedoch auf 030bbf6 BEIDE LOKAL und REMOTELY zurückkehren .

Führen Sie die folgenden Schritte aus, um DELETE / REVERT lokal und remote zu committen


Zuerst wird lokal zurückgesetzt, um die ID 030bbf6 zu übergeben

 git reset --hard 030bbf6 

gefolgt von

 git clean -f -d 

Diese beiden Befehle clean force werden auf die Stufe 030bbf6 zurückgesetzt, wie unten im Snapshot gezeigt

Bildbeschreibung hier eingeben

Wenn Sie jetzt git status ausführen, sehen Sie, dass Sie TWO Commits HINTER von der Remote-Zweigstelle sind, wie unten gezeigt Bildbeschreibung hier eingeben

Führen Sie die folgenden Schritte aus, um Ihre Indizes zu aktualisieren (falls Aktualisierungen vorhanden sind). Es wird empfohlen, dass Sie alle Entwickler bitten, keine Pull-Anforderungen in der Remote-Hauptverzweigung zu akzeptieren.

 git fetch --all 

Sobald Sie damit fertig sind, müssen Sie dieses Commit durch Drücken des + Symbols vor der Verzweigung, wie unten gezeigt, forcieren. Ich habe hier als Masterzweig verwendet , Sie können ihn durch irgendeinen ersetzen

Bildbeschreibung hier eingeben Code

 git push -u origin +master 

jetzt, wenn Sie die Web-Schnittstelle von Remote sehen, dann Commit sollte auch zurückgesetzt werden.

Bildbeschreibung hier eingeben

 git revert HEAD -m 1 

In der obigen Codezeile. “Letztes Argument repräsentiert”

  • 1 – setzt ein commits zurück.

  • 2 – setzt die letzten beiden Commits zurück.

  • n – setzt die letzten n Commits zurück.

Sie müssen nach diesem Befehl drücken, um den Effekt auf Remote zu übernehmen. Sie haben andere Optionen wie zum Beispiel den scope der zu rückzulegenden Commits anzugeben. Dies ist eine der Optionen.


Später benutze git commit -am "COMMIT_MESSAGE" dann git push oder git push -f