Ich habe "versehentlich" einen Commit auf GitHub veröffentlicht.
Ist es möglich, diese Übertragung zu entfernen?
Ich möchte mein GitHub-Repository so zurücksetzen, wie es vor diesem Commit war.
Ich habe "versehentlich" einen Commit auf GitHub veröffentlicht.
Ist es möglich, diese Übertragung zu entfernen?
Ich möchte mein GitHub-Repository so zurücksetzen, wie es vor diesem Commit war.
Anmerkung: siehe eine Alternative zu
git rebase -i
in den Kommentaren unten.
git reset --soft HEAD^
Entfernen Sie zunächst den Commit in Ihrem lokalen Repository. Sie können dies tun mit git rebase -i
. Wenn es zum Beispiel Ihre letzte Übertragung ist, können Sie Folgendes tun git rebase -i HEAD~2
und löschen Sie die zweite Zeile in dem sich öffnenden Editorfenster.
Erzwingen Sie dann den Push zu GitHub mit git push origin +branchName --force
Ver Git Magic Kapitel 5: Lektionen der Geschichte - und noch einige mehr für weitere Informationen (z.B. wenn Sie ältere Commits entfernen wollen).
Oh, und wenn Ihr Arbeitsbaum schmutzig ist, müssen Sie eine git stash
zuerst und dann eine git stash apply
nach.
Genauer gesagt, Sie /müssen/ stashen, weil git rebase -i Sie nicht lässt, wenn Sie einen schmutzigen Baum haben.
Es ist überhaupt keine Änderung des lokalen Baums erforderlich, um den Anforderungen der Benutzer gerecht zu werden.
Beachten Sie, dass das Entfernen eines Commits diesen vollständig löscht und nicht nur "entkoppelt". Ich glaube nicht, dass sie wiederhergestellt werden kann.
Das hat auch gut funktioniert! Es entfernt den Push von Github, aber lässt mein lokales Repository intakt. Danke!
Nun, ja. Es tut nur das, worum Sie gebeten haben. :) Ihr Repository und das entfernte Repository müssen keine übereinstimmenden Verweise haben.
Beachten Sie jedoch, dass dadurch nur der Verzweigungszeiger verschoben wird. Der versehentlich verschobene Commit ist immer noch im entfernten Repo vorhanden. Im Fall von GitHub bedeutet dies, dass sie immer noch zu sehen ist, wenn Sie den SHA-1-Hash kennen (z. B. aus dem Verlauf der Benutzeraktivitäten).
Für eine einfache Rückgängigmachung, wenn es nur ein Fehler ist (vielleicht haben Sie ein Repo geforkt, dann endete pushing auf das Original statt auf eine neue) hier ist eine weitere Möglichkeit:
git reset --hard 71c27777543ccfcb0376dcdd8f6777df055ef479
Ersetzen Sie diese Nummer durch die Nummer der Übergabe, zu der Sie zurückkehren möchten.
Alles, was seither passiert ist, wird gelöscht, sobald Sie erneut drücken. Dazu wäre der nächste Schritt:
git push --force
WARNUNG: Dadurch wird Ihre Historie umgeschrieben, Sie verlieren den Commit und es ist generell nicht sehr angenehm, dies in einer kollaborativen Umgebung zu tun.
Ja, das war das Einfachste und Beste für mich. Mein Dev-Fork musste zurückgenommen werden, bevor ich einen PR für etwas anderes senden konnte. Ich hätte meine Änderungen von vornherein in einem Zweig ablegen sollen.
Dies funktioniert bei ungeschützten Zweigen. Wenn der Github-Zweig geschützt ist, schlägt der erzwungene Push fehl.
git log
um den Commit herauszufinden, den Sie rückgängig machen wollen
git push origin +7f6d03:master
während 7f6d03 der Commit vor dem fälschlicherweise verschobenen Commit ist. +
war für force push
Und das war's.
Hier ist ein sehr guter Leitfaden, der Ihr Problem löst, leicht und einfach!
Dies funktioniert bei mir, wenn ich ein paar zuletzt veröffentlichte Commits aus einem Branch löschen möchte.
Nachdem ich einen Moment lang versucht hatte, herauszufinden, warum dieser Befehl nicht funktionierte, wiesen Sie mich eindeutig darauf hin, dass ich hier die letzte gewünschte Übergabe einfügen sollte. Und ich habe versucht, die erste Übergabe zu machen, weshalb ich die Meldung erhielt, dass sie bereits aktuell sei.
Beachten Sie, dass diese Lösung funktioniert, wenn der zu entfernende Commit der letzte Commit ist.
1 - Kopieren Sie die Commit-Referenz, zu der Sie zurückkehren möchten, aus dem Protokoll:
git log
2 - Setzen Sie git auf die Commit-Referenz zurück:
git reset <commit_ref>
3 - Speichern Sie die lokalen Änderungen aus dem falschen Commit, um sie später nach dem Pushen an den Remote zu verwenden:
git stash
4 - Übertragen Sie die Änderungen in das entfernte Repository (-f oder --force):
git push -f
5 - Holen Sie die gespeicherten Änderungen in das lokale Repository zurück:
git stash apply
7 - Falls Sie nicht verfolgte/neue Dateien in den Änderungen haben, müssen Sie diese vor dem Commit zu Git hinzufügen:
git add .
6 - Fügen Sie die zusätzlichen Änderungen hinzu, die Sie benötigen, und übertragen Sie dann die benötigten Dateien (oder verwenden Sie einen Punkt '.' anstelle der Angabe der einzelnen Dateinamen, um alle Dateien im lokalen Repository zu übertragen:
git commit -m "<new_commit_message>" <file1> <file2> ...
o
git commit -m "<new_commit_message>" .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
233 Stimmen
Ein Wort der Warnung : Tun Sie dies niemals, wenn Sie viele Leute haben, die Ihrem Projektarchiv folgen, Sie werden deren lokales Projektarchiv aus der Synchronisation bringen, wenn sie die letzten Änderungen eingezogen haben. Wenn es sich um einen Fehler handelt, können Sie einfach eine weitere Übergabe durchführen und den Fehler rückgängig machen. Wenn es sich um ein Passwort handelt, sollten Sie stattdessen das Passwort ändern und sich nicht beeilen, es zu löschen. Dinge erzwingen ist nicht frei von Nachteilen.
182 Stimmen
Ein Wort der Warnung 2: Auf die Übergabe kann weiterhin direkt über SHA1 zugegriffen werden. Force push löscht die Übergabe nicht, sondern erstellt eine neue und verschiebt den Dateizeiger auf diese. Um einen Commit wirklich zu löschen, müssen Sie das gesamte Projektarchiv löschen.
31 Stimmen
@Gustav "... Sie müssen das gesamte Repo löschen." - Oder zwingen Sie einfach die Garbage Collection.
0 Stimmen
Ich war auf der Suche nach einer Möglichkeit, einen Commit über die Github-Oberfläche rückgängig zu machen. Für diese Frage würde ich vorschlagen, einen neuen Commit zu pushen, der die Änderung rückgängig macht, anstatt die Geschichte neu zu schreiben.
6 Stimmen
Was WOC1 betrifft, so erhalten die Follower beim nächsten Ziehen automatisch den neuen Verlauf und verlieren den alten, was durchaus akzeptabel zu sein scheint. Das Problem ist, wenn andere Personen neue Arbeit geleistet haben nach Ihre Übergabe: dann verursachen Sie eine erhebliche Menge an Ärger für sie (sie müssen ihre Änderungen in die neue Historie übernehmen). Das macht einen Force Push akzeptabler nach 1 Minute als nach 1 Woche (weniger Follower ausgesetzt), und akzeptabler für Projekte, die Menschen utilice aber nicht ändern. (sie werden nicht bemerken, dass die Zeitlinie geändert wurde).
0 Stimmen
Verwandt: Die letzte Git-Übertragung rückgängig machen? .
12 Stimmen
Bitbucket-Version dieser Frage .
2 Stimmen
Re WOC2 : die Übergabe ist über das Reflog zugänglich, aber nur vorübergehend , solange reflog nicht abgelaufen ist.
git fsck --no-reflogs
wird es zeigen. Versuchen Sie, reflog zum Auslaufen zu zwingen:git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.pruneExpire=now gc
2 Stimmen
@IQAndreas Sobald Sie einen Commit auf GitHub veröffentlicht haben, sollten Sie alle darin enthaltenen Daten als kompromittiert betrachten .
0 Stimmen
Das ist vielleicht total verrückt, aber wie wäre es, wenn du den Zweig komplett von GitHub entfernst und dann deinen lokalen Zweig auf GitHub veröffentlichst? (wenn man bedenkt, dass man der Einzige ist, der an diesem Zweig arbeitet, oder wenn man die möglichen Konsequenzen kennt und sich darum kümmern kann)