Wie kann ich ein Github-Repository auf ein bestimmtes Commit zurücksetzen?


431

Mein Github hat momentan 100 Commits. Ich muss das Repository zurücksetzen, um 80 festzuschreiben, und alle nachfolgenden entfernen.

Warum? Dieses Repo soll zum Zusammenführen von verschiedenen Benutzern dienen. Aufgrund übermäßiger Bearbeitung wurden einige Zusammenführungen von mir als Commits vorgenommen. Das lag an einer Fehlbezeichnung meiner Remote-Niederlassungen, bei denen 3 Entwickler als einander gekennzeichnet wurden. Ich muss auf diesen Punkt zurücksetzen und dann nach vorne ziehen.

Ich wollte wie in diesem Beispiel neu starten: Wie kann ich ein Commit auf GitHub entfernen?

Git möchte jedoch, dass ich viel Konfliktmanagement mache. Gibt es einen einfacheren Weg?

Antworten:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Hinweis: Wie in den Kommentaren unten beschrieben, ist die Verwendung in einer kollaborativen Umgebung gefährlich: Sie schreiben den Verlauf neu


43
Leute, tu es git push -f origin branch. Ich hatte gerade eine schlechte Zeit, weil ich das verpasst habe.
Sumit M Asok

21
ACHTUNG! Sie werden alle Ihre Commits vor Ort verlieren, und wenn Sie pushen, gibt es keinen Weg zurück
Thomas

8
Das ist nicht wahr, Sie können die alten Commits mit Git Reflog erhalten
Jan Schaefer

27
Sie müssen möglicherweise git push origin HEAD --forcestattdessen tun, git push -f origin branchda dies mir einen error: src refspec branch does not match any.Fehler gab
Kettenrad12

1
Ja, danke Jungs. Ich habe es geschafft zu tun, was ich wollte. Ich habe zuerst einen separaten Zweig von dem vor dem Commit erstellt, den ich zurücksetzen wollte. Lokal geklont. Dann haben Sie Ihre Empfehlungen auf diese Kopie angewendet, auf diese Weise habe ich meine Hauptniederlassung nicht kompromittiert ...
Gauthier Boaglio

21

Um das letzte Commit rückgängig zu machen, mache ich Folgendes:

Zuerst:

git log

Holen Sie sich die neueste SHA-ID zum Rückgängigmachen.

git revert SHA

Dadurch wird ein neues Commit erstellt, das genau das Gegenteil von Ihrem Commit bewirkt. Dann können Sie dieses neue Commit verschieben, um Ihre App in den vorherigen Zustand zu versetzen, und Ihr Git-Verlauf zeigt diese Änderungen entsprechend an.

Dies ist gut für eine sofortige Wiederholung von etwas, das Sie gerade begangen haben, was bei mir häufiger der Fall ist.

Wie Mike sagte, können Sie dies auch tun:

git revert HEAD

8
git revert HEADwird das letzte Commit zurücksetzen, ohne den Hash nachschlagen zu müssen.
Mike Baranczak

Dies ist eine Lösung, wenn Sie Commits überhaupt nicht löschen möchten. In diesem Fall sind jedoch alle Müll-Commits weiterhin vorhanden, sodass ein Kloner sie zurücksetzen oder auschecken kann. Wenn Sie dies verhindern möchten, MÜSSEN Sie einen Druck erzwingen.
cst1992

19

Ein anderer Weg:

Überprüfen Sie den Zweig, den Sie zurücksetzen möchten, und setzen Sie dann Ihre lokale Arbeitskopie auf das Commit zurück, das Sie als letztes auf dem Remote-Server verwenden möchten (alles, was danach passiert, wird auf Wiedersehen). Dazu habe ich in SourceTree mit der rechten Maustaste auf "BRANCHNAME auf dieses Commit zurücksetzen" geklickt und ausgewählt.

Navigieren Sie dann zum lokalen Verzeichnis Ihres Repositorys und führen Sie den folgenden Befehl aus:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Dadurch werden alle Commits nach dem aktuellen in Ihrem lokalen Repository gelöscht, jedoch nur für diesen einen Zweig.


1
Zu Ihrer Information "REPOSITORY_NAME" wird so etwas wie https: /me@github.com/me/repo_name.git
Tim

3
Es wäre hilfreicher, wenn Sie diesen Befehl auflösen und erklären würden.
cst1992

3

Die meisten Vorschläge gehen davon aus, dass Sie die letzten 20 Commits irgendwie zerstören müssen, weshalb dies "Umschreiben des Verlaufs" bedeutet, dies aber nicht muss.

Erstellen Sie einfach einen neuen Zweig aus dem Commit Nr. 80 und arbeiten Sie in Zukunft an diesem Zweig. Die anderen 20 Commits bleiben in der alten verwaisten Filiale.

Wenn Sie unbedingt möchten, dass Ihr neuer Zweig denselben Namen hat, denken Sie daran, dass es sich bei dem Zweig im Grunde nur um Beschriftungen handelt. Benennen Sie einfach Ihren alten Zweig in einen anderen Zweig um und erstellen Sie den neuen Zweig bei Commit Nr. 80 mit dem gewünschten Namen.


Ich vermute, dass dies auch problematisch mit allen lokalen Versionen der Geschichte des interessierenden Zweigs zu tun hat.
Ragerdl

2

Wenn ich Zweigaktualisierungen vom Master aus durchführe, stelle ich fest, dass ich manchmal überklicke und den Zweig auch mit dem Master verschmelze. Es wurde ein Weg gefunden, dies rückgängig zu machen.

Wenn Ihr letztes Commit eine Fusion war, ist etwas mehr Liebe erforderlich:

git revert -m 1 HEAD


1

In Github können Sie den Remote-Zweig in der Github-Benutzeroberfläche auf der Registerkarte "Zweige" auf einfache Weise löschen. Sie müssen sicherstellen, dass die folgenden Einstellungen entfernt werden, damit der Zweig löschbar ist:

  1. Kein Standardzweig
  2. Keine Eröffnungsanfragen.
  3. Der Zweig ist nicht geschützt.

Erstellen Sie es jetzt in Ihrem lokalen Repository neu, um auf den vorherigen Festschreibungspunkt zu verweisen. und fügen Sie es wieder zu Remote Repo hinzu.

git checkout -b master 734c2b9b   # replace with your commit point

Schieben Sie dann den lokalen Zweig auf Remote

git push -u origin master

Fügen Sie den Standardzweig und den Zweigschutz usw. wieder hinzu.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.