Wie lösche ich die letzten n Commits auf Github und lokal?

127

Ich versuche, die letzten 2 Commits aus einem meiner GitHub-Repositorys zu löschen. Ich habe es wie hier vorgeschlagen versucht : git push -f origin HEAD^^:master. Es scheint, dass es funktioniert, da die letzten beiden Commits entfernt werden.

Dann habe ich sie aus meinem lokalen Repository mit gelöscht git rebase -i HEAD~2. Ich entferne die Zeilen, die sich auf diese Commits beziehen, und überprüfe, git logob sie korrekt entfernt wurden.

Danach nehme ich einige Änderungen in meinem lokalen Repository vor, mache ein neues Commit und drücke auf GitHub. Das Problem ist, dass ich in meinem GitHub-Konto die beiden vorherigen Commits habe, die ich zu löschen versucht habe.

Ich denke, das Problem liegt in meinem lokalen Repository, denn wenn ich mein Github-Repository in mein lokales Repository klone und hier einige Änderungen vornehme, werden diese alten Commits beim Push eines neuen Commits nicht an GitHub übertragen.

Irgendeine Idee?

Ivan Fernandez
quelle

Antworten:

199

Um die letzten beiden Commits lokal zu entfernen, würde ich Folgendes verwenden:

git reset --hard HEAD^^

Rebase ist eine völlig andere Operation, die Ihnen hier nicht weiterhilft.

KL-7
quelle
23
Wenn Sie diese Änderung bereits in ein Remote-Repository übertragen haben. Sie können es mit Git Push -f
Ivan Fernandez
Können Sie dies für die letzten n Commits verallgemeinern?
user_19
6
@ user_19 können Sie Dinge wie git reset --hard HEAD^4oder tun git reset --hard HEAD~4. Es kann jedoch etwas kompliziert werden, wenn Ihr Verlauf Zusammenführungen enthält. Weitere Informationen zum Festlegen von Revisionen finden Sie im entsprechenden Abschnitt hier .
KL-7
2
Wenn ich die letzten 7 Commits löschen wollte, dann ?? Muss ich 7 mal ^ nach HEAD setzen ... bitte klären Sie mich
Gagan Gami
4
@GaganGami, ich denke du würdest es tun git reset --hard HEAD~7, aber bitte korrigiere mich, wenn ich falsch liege .
Con Antonakos
104

Wenn Sie die 2 (zwei) letzten Commits entfernen möchten, gibt es einen einfachen Befehl, um dies zu tun:

git reset --hard HEAD~2

Sie können die 2für eine beliebige Anzahl von letzten Commits ändern, die Sie entfernen möchten.

Und um diese Änderung auf remote zu übertragen, müssen Sie a git pushmit dem Parameter force ( -f) ausführen:

git push -f

Allerdings empfehle ich nicht jeden zu tun gitBefehl mit -foder --hardOptionen beteiligt , wenn es neue Commits auf Remote (Github) nach diesen Commits , dass Sie entfernen möchten. In diesem Fall immer verwenden git revert.

Dherik
quelle
Bleiben die Änderungen, die ich vorgenommen habe?
Zuhayer Tahir
@SymfonyUser, nein. Wenn Sie den hardBefehl ausgeführt haben, verlieren Sie diese beiden Commits. Wenn Sie die Änderungen speichern möchten, erstellen Sie eine diffDatei mit diesen Commits, bevor Sie den Reset anwenden.
Dherik
3
@ZuhayerTahir wenn Sie nur wollen rückgängig machen die Begehung der letzten 5 Commits dann tun gerade git reset HEAD~5(nicht verwenden hard). Auf diese Weise erhalten Sie Ihre Änderungen in einem bereitgestellten Zustand (dh nicht festgeschrieben). Für mich sehen Sie diese Antwort .
Honig
@Honey Vielen Dank für Ihre Antwort. Ich bin zu dem gleichen Schluss gekommen.
Zuhayer Tahir
29

Folgendes funktioniert für mich

git reset HEAD~n

Es entfernt die letzten nCommits aus dem lokalen Repo, da HEAD^nur eines entfernt wird. Wenn Sie diese Änderungen von der Fernbedienung entfernen müssen, müssen Sie möglicherweise Push erzwingen, da Sie sich hinter der Fernbedienung befinden.

git push -f origin <branch>
Sial01
quelle