2009-08-13 5 views
435

Hier Verhängnis, was ich auf meinem tat angeblich seiner stabilen Niederlassung ...ein ‚git push‘

% git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded alpha-0.3.0 to master. 
% git status 
# On branch alpha-0.3.0 
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits. 
# 
nothing to commit (working directory clean) 
% git push 
Fetching remote heads... 
    refs/ 
    refs/heads/ 
    refs/tags/ 
    refs/remotes/ 
'refs/heads/master': up-to-date 
updating 'refs/heads/alpha-0.3.0' 
    from cc4b63bebb6e6dd04407f8788938244b78c50285 
    to 83c9191dea88d146400853af5eb7555f252001b0 
    done 
'refs/heads/unstable': up-to-date 
Updating remote server info 

Das ist alles einen Fehler war, wie ich später realisiert. Ich möchte diesen gesamten Prozess rückgängig machen und den Alpha-0.3.0-Zweig wieder auf den ursprünglichen Zustand zurücksetzen.

Was soll ich tun?

+0

diese stackoverflow post vielleicht? http://stackoverflow.com/questions/134882/undoing-a-git-rebase – Steen

+4

Es ist nicht wirklich die gleiche Situation, das Rückgängigmachen einer Rebase ist ein lokales Repository-Szenario, das Rückgängigmachen eines Git-Push beinhaltet ein Remote-Repository und kann mehr sein schwierig, je nachdem, welchen Zugang Sie haben. –

+0

Steen - du hast Recht - ich sollte es wahrscheinlich haben. Ich dachte mir, dass das gesegnete Repository, von dem alle ausgehen, eher eine Admin-Aufgabe ist und daher hierhin gehört, wo der allgemeine clientseitige Git eine Stackoverflow-Frage ist. – Cyrus

Antwort

697

Sie müssen sicherstellen, dass keine anderen Benutzer dieses Repositorys die falschen Änderungen abrufen oder versuchen, auf die Commits zu bauen, die Sie entfernen möchten, da Sie den Verlauf zurückspulen möchten.

Dann müssen Sie "zwingen", die alte Referenz zu drücken.

git push -f origin last_known_good_commit:branch_name 

oder in Ihrem Fall

git push -f origin cc4b63bebb6:alpha-0.3.0 

Sie receive.denyNonFastForwards Set auf der Remote-Repository haben. Wenn dies der Fall ist, erhalten Sie eine Fehlermeldung, die den Ausdruck [remote rejected] enthält.

In diesem Szenario müssen Sie die Verzweigung löschen und neu erstellen.

git push origin :alpha-0.3.0 
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0 

Wenn dies nicht funktioniert - vielleicht, weil Sie receive.denyDeletes gesetzt haben, dann haben Sie direkten Zugriff auf das Repository haben. Im Remote-Repository müssen Sie dann den folgenden Installationsbefehl ausführen.

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8 
+12

Eine perfekte und gut erklärte Antwort - vielen Dank. Für jeden, der stolpert darüber, aus akademischen Gründen versuchte ich beide der ersten beiden Ansätze, und beide arbeiteten - offensichtlich, wenn der erste funktioniert, ist es der sauberste Ansatz. Wenn ich Sie 10 mal Charles UP würde, würde ich. :) – Cyrus

+133

Für schnelle Referenz, hier die erste Zeile 'git push -f Herkunft last_known_good_commit: branch_name' – philfreo

+5

git push -f Herkunft cc4b63bebb6: alpha-0.3.0 => dies half mir, Hinweis alpha-0.3.0 ist Der Name der Verzweigung und cc4b63bebb6 ist die Commit-ID, zu der wir zurückkehren möchten. Nachdem wir diesen Befehl ausgeführt haben, befinden wir uns in cc4b63bebb6 commit id. – kumar

120

Ich glaube, dass Sie dies auch tun können:

git checkout alpha-0.3.0 
git reset --hard cc4b63bebb6 
git push origin +alpha-0.3.0 

Dies ist auf die letzte Methode sehr ähnlich ist, außer Sie müssen in der Remote-Repo nicht verarschen.

+8

Das funktionierte auch für mich, aber es ist erwähnenswert, dass dies die Geschichte auf der Fernbedienung "neu schreiben" wird. Das mag sein, was du willst, aber vielleicht nicht! – Tom

+1

+1 für diese Antwort, die mir wirklich geholfen hat. Ich wollte auch hinzufügen (und klarstellen), dass die Commit-ID (die hinter dem Parameter "'hard" steht) die ID der Commits sein sollte, auf die Sie Ihre Verzweigung zurücksetzen möchten. –

+0

wie kommt es, wenn ich 'git pull' tun, bekomme ich so etwas wie:' fe88549..50a8083 Master -> origin/master Bereits up-to-date.' – Michelle

31

Die akzeptierte Lösung (von @charles bailey) ist sehr gefährlich, wenn Sie in einem gemeinsamen Repo arbeiten.

Als Best Practice sollten alle Commits, die an ein Remote-Repository übergeben werden, als "unveränderlich" betrachtet werden. Use 'git revert' statt: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

+0

Was genau sind die Anweisungen, die Sie verschreiben? Du scheinst nur alte Links zu haben. – jww

14

Ein anderer Weg, dies zu tun:

  1. einem anderen Zweig erstellen
  2. Kasse die vorherige auf diesem Zweig begehen
  3. mit "git checkout"
  4. schieben Sie den neuen Zweig.
  5. löschen die alte Zweig & den Lösch (Verwendung git push origin --delete <branch_name>)
  6. benennen Sie die neue Niederlassung in den alten Zweig
  7. Push erneut drücken.
+2

Dieser sieht wie eine echte Lösung aus, wenn Sie bereits falsche Repos in Repo –

24

Ein Weg, dies zu tun, ohne die Änderungen zu verlieren, man wollte:

git reset cc4b63b 
git stash 
git push -f origin alpha-0.3.0 
git stash pop 

Dann können Sie die Dateien wählen Sie

68

git revert ist weniger gefährlich schieben gemeint, als einige der Ansätze hier vorgeschlagen :

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650 
[master 71738a9] Revert "Issue #482 - Fixed bug." 
4 files changed, 30 insertions(+), 42 deletions(-) 
prompt> git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 
prompt> 

ersetzen 35f6af6f77f116ef922e3d75bc80a4a466f92650 mit Ihrem eigenen begehen.

+2

haben Wie komme ich auf die ID 35f6af6f77f116ef922e3d75bc80a4a466f92650? Diese Antwort wäre besser, wenn Sie das erklären könnten. – Volomike

+1

@Volomike (und Googling Devs der Zukunft), diese Frage beschreibt viele Möglichkeiten, es zu erhalten: [Versionskontrolle und Hash-Frage auf SO] (http://StackOverflow.com/Questions/949314/How-ToRetrieve-the -hash-for-the-current-commit-in-git) – Jaime

+0

Dies ist die richtige Antwort, denn mit "git reset" sollten Sie nicht pushen können (Updates wurden abgelehnt, weil die Spitze Ihres aktuellen Zweiges hinter der Fernbedienung liegt Gegenstück) oder Sie müssen den Zug erzwingen, der nicht wirklich sauber ist. –

5
git push origin +7f6d03:master 

Dies wird Ihre Repo erwähnt zurückkehren begehen Nummer

+0

Dies ist die einfachste Antwort. Sie sind ein Live-Sparer. –

6

Undo mehrere begeht git --hard 0ad5a7a6 zurückgesetzt (Geben Sie einfach SHA1-Hash-Commit)

Undo begehen letzte

git reset --hard HEAD ~ 1 (Änderungen am letzten Commit werden entfernt) git reset --soft HEAD ~ 1 (Änderungen am letzten Commit werden als nicht erzwungene lokale Modifikationen verfügbar sein)

-1

Dies wird die letzte geschoben begehen in dem Remote-Zweig (Master oder Ihre Niederlassung) löschen:

git push origin +HEAD^:master  
+0

ja! Das hat bei der Arbeit mit GitHub funktioniert. Vielen Dank. – cukabeka

+0

Nein! Das hat etwas Superartiges getan, das die Änderungen nicht rückgängig gemacht hat. –

+1

Dies löschte nur meine lokalen Dateien, die in früheren Commit verwendet wurden. haben Sie wahrscheinlich davor gewarnt, Remote-Zweig zu überprüfen. Ich weiß jetzt nicht, wie ich das Durcheinander lösen soll. – WebComer

1

Szenario 1: Wenn Sie die letzte rückgängig machen wollen verpflichten sagen 8123b7e04b3, unten ist der Befehl (das für mich gearbeitet):

git push origin +8123b7e04b3^:master 

Ausgang wie unten aussieht:

Total 0 (delta 0), reused 0 (delta 0) 
To https://testlocation/code.git 
+ 8123b7e...92bc500 8123b7e04b3^ -> master (forced update) 

Zusätzliche Informationen: Szenario 2: In einigen Situation, können Sie wiederherstellen möchten zurück, was Sie gerade undo'ed durch den vorherigen Befehl (im Grunde die Undo rückgängig machen), dann verwenden Sie die folgenden Befehl ein:

git reset --hard 8123b7e04b3 

Ausgang:

HEAD is now at cc6206c Comment_that_was_entered_for_commit 

Mehr Infos hier: https://github.com/blog/2019-how-to-undo-almost-anything-with-git