2083 Stimmen

Wie kann ich einen Commit auf GitHub entfernen?

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.

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.

26voto

george mano Punkte 5421

Um die Übertragung aus dem entfernten Repository zu löschen:

 git push -f origin last_known_good_commit:branch_name

Um die Übertragung aus Ihrem lokalen Repository zu löschen:

git reset --hard HEAD~1

Link

12voto

loopbackbee Punkte 20085

Wenn Sie dies tun, weil Sie sensible Daten in einer Übertragung haben, ist die Verwendung der anderen Antworten hier nicht sicher (mit Ausnahme derjenigen von subutux, auf die ich noch eingehen werde).

El github-Leitfaden zu diesem Thema empfiehlt die Verwendung eines externen Tools, aber ich bevorzuge die Verwendung des integrierten Tools.

Erstens, ein Backup Ihres Repositorys erstellen . Dann:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \
--prune-empty --tag-name-filter cat -- --all

Hiernach, sicherstellen, dass sich das Repository im gewünschten Zustand befindet . Sie können einen Vergleich mit dem Backup durchführen.

Wenn Sie sicher sind, dass es richtig ist, dann:

#get rid of old unreferenced commits (including the data you want to remove)
git gc --prune=now
git push origin --force --all

Sie sollten die lokale Sicherung für eine Weile aufbewahren, nur für den Fall.

2 Stimmen

Verwandt: stackoverflow.com/questions/872565/ Ich denke, dass diese Methode nicht ausreicht, da die Daten immer noch über die Übergabe zugänglich sind.

11voto

orb Punkte 1233

Suchen Sie auf Github die ref spec des Commits, der der Kopf Ihres Zweigs werden soll, und verwenden Sie den folgenden Befehl:

git push origin +[ref]:[branchName]

In Ihrem Fall, wenn Sie nur einen Commit zurückgehen wollen, suchen Sie den Anfang der Referenz für diesen Commit, z.B. 7f6d03, und den Namen des Zweiges, den Sie ändern wollen, z.B. master, und gehen Sie wie folgt vor:

git push origin +7f6d03:master

Das Pluszeichen wird interpretiert als --force Dies wird notwendig sein, da Sie die Geschichte neu schreiben.

Beachten Sie, dass Sie immer, wenn Sie --force eine Übergabe können Sie möglicherweise die Geschichte anderer Leute umschreiben, die Ihren Zweig zusammenführen. Wenn Sie das Problem jedoch schnell erkennen (bevor jemand anderes Ihren Zweig zusammenführt), werden Sie keine Probleme haben.

7voto

Kent Aguilar Punkte 4350

Führen Sie diesen Befehl in Ihrem Terminal aus.

git reset HEAD~n

Sie können die letzten n Commits aus dem lokalen Repo entfernen, z.B. HEAD~2. Fahren Sie mit Force Git Push für Ihr Repository fort.

git push -f origin <branch>

Ich hoffe, das hilft!

4voto

Carlos Mafla Punkte 470

Um die Verzweigungs- und Zusammenführungsstruktur zu erhalten, ist es wichtig, die --preserve-merges bei der Neuberechnung zu verwenden:

git rebase --preserve-merges -i HEAD^^

0 Stimmen

Hinweis: Es wird nicht empfohlen, die --preserve-merges y --interactive zusammen. Siehe die BUGS-Abschnitt auf rebase

CodeJaeger.com

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.

Powered by:

X