541 Stimmen

Wie kann ich ein Git-Repository auf einen bestimmten Commit zurücksetzen?

Mein Repo hat im Moment 100 Commits. Ich muss das Repository auf Commit 80 zurücksetzen und alle nachfolgenden Commits entfernen.

Warum?

Dieses Repo ist für die Zusammenführung von verschiedenen Benutzern gedacht. Eine Reihe von Zusammenführungen wurden aufgrund exzessiver Bearbeitung als Commits von mir eingetragen. Das lag an einer falschen Kennzeichnung meiner Remote-Zweige, wo 3 Entwickler als einander gekennzeichnet waren. Ich muss zu diesem Punkt zurückkehren und dann vorwärts ziehen.

Ich wollte, wie in diesem Beispiel, eine neue Basis erstellen: Wie kann ich einen Commit auf GitHub entfernen?

Git will jedoch, dass ich eine Menge Konfliktmanagement betreibe. Gibt es einen einfacheren Weg?

1112voto

jtdubs Punkte 13137
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Anmerkung: Wie in den Kommentaren unten geschrieben, Dies ist in einer kollaborativen Umgebung gefährlich: Sie schreiben die Geschichte um.

45voto

Nick Res Punkte 2214

Um die letzte Übertragung rückgängig zu machen, gehe ich folgendermaßen vor:

Erstens:

git log

die allerletzte SHA-ID zum Rückgängigmachen erhalten.

git revert SHA

Dadurch wird ein neuer Commit erzeugt, der genau das Gegenteil von Ihrem Commit macht. Dann können Sie diesen neuen Commit pushen, um Ihre Anwendung in den vorherigen Zustand zu versetzen, und Ihr Git-Verlauf wird diese Änderungen entsprechend anzeigen.

Das ist gut, wenn man etwas, das man gerade gemacht hat, sofort wiederholen will, was bei mir häufiger der Fall ist.

Wie Mike bereits erwähnt hat, können Sie auch dies tun:

git revert HEAD

20voto

CommaToast Punkte 10365

Eine andere Möglichkeit:

Checken Sie den Zweig aus, den Sie rückgängig machen wollen, und setzen Sie dann Ihre lokale Arbeitskopie auf den Commit zurück, der der letzte auf dem entfernten Server sein soll (alles, was danach kommt, wird sich verabschieden). Um dies zu tun, habe ich in SourceTree mit der rechten Maustaste auf den Zweig geklickt und "BRANCHNAME auf diesen Commit zurücksetzen" gewählt.

Wechseln Sie dann in das lokale Verzeichnis Ihres Repositorys und führen Sie diesen Befehl aus:

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

Dies löscht alle Übertragungen nach der aktuellen in Ihrem lokalen Repository, aber nur für diesen einen Zweig.

10voto

Ion Lesan Punkte 307

Die meisten Vorschläge gehen davon aus, dass Sie die letzten 20 Commits irgendwie zerstören müssen, weshalb es "Geschichte neu schreiben" bedeutet, aber das müssen Sie nicht.

Erstellen Sie einfach einen neuen Zweig von Commit #80 und arbeiten Sie an diesem Zweig weiter. Die anderen 20 Commits bleiben auf dem alten verwaisten Zweig.

Wenn Sie unbedingt wollen, dass Ihre neue Verzweigung denselben Namen trägt, denken Sie daran, dass Verzweigungen im Grunde nur Etiketten sind. Benennen Sie Ihre alte Verzweigung einfach in etwas anderes um und erstellen Sie dann die neue Verzweigung bei Commit #80 mit dem von Ihnen gewünschten Namen.

5voto

Richard Nader Punkte 41

Wenn ich einen Zweig vom Master aktualisiere, stelle ich fest, dass ich manchmal zu viel klicke und den Zweig auch in den Master überführe. Ich habe einen Weg gefunden, das rückgängig zu machen.

Wenn Ihr letzter Commit ein Merge war, ist ein wenig mehr Liebe nötig:

git revert -m 1 HEAD

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