1328 Stimmen

Wie lösche ich nicht gepushte Git-Commits?

Ich habe aus Versehen in den falschen Branch committet. Wie kann ich diesen Commit löschen?

8voto

Atul Sureka Punkte 2863

Der folgende Befehl hat bei mir funktioniert, alle lokalen committed Änderungen wurden verworfen & lokal wurde auf den gleichen Stand wie der remote origin/master Branch zurückgesetzt.

git reset --hard origin

3voto

Xennex81 Punkte 379

Zu Ihrer Information, ich glaube, Sie können "hart schneiden" Commits nicht nur mit git reset --hard aus Ihrem aktuellen Branch nehmen, sondern auch mit folgendem Befehl:

git checkout -B  

Tatsächlich, wenn Sie nicht daran interessiert sind, auszuchecken, können Sie den Branch mit folgendem Befehl auf was auch immer Sie möchten setzen:

git branch -f  

Dies wäre ein programmatischer Weg, um Commits aus einem Branch zu entfernen, zum Beispiel, um neue Commits darauf zu kopieren (unter Verwendung von rebase).

Angenommen, Sie haben einen Branch, der von master getrennt ist, weil Sie Quellen aus einem anderen Ort genommen und in den Branch eingefügt haben.

Jetzt haben Sie einen Branch, auf dem Sie Änderungen angewendet haben, nennen wir ihn "thema".

Jetzt werden Sie eine Kopie Ihres Thema-Branches erstellen und ihn dann auf den Quellcodedump umstellen, der im Branch "dump" liegt:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

Jetzt werden Ihre Änderungen im Branch topic_duplicate basierend auf dem Ausgangspunkt von "dump" wieder angewendet, aber nur die Commits, die seit "master" passiert sind. Also werden Ihre Änderungen seit master wieder auf "dump" angewendet, aber das Ergebnis landet in "topic_duplicate".

Dann könnten Sie "dump" durch "topic_duplicate" ersetzen, indem Sie folgendes tun:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Oder mit

git branch -M topic_duplicate dump

Oder einfach durch Ablehnen des Dumps

git branch -D dump

Vielleicht könnten Sie auch einfach cherry-picken, nachdem Sie den aktuellen "topic_duplicate" gelöscht haben.

Was ich versuche zu sagen ist, dass wenn Sie den aktuellen "Duplikat"-Branch basierend auf einem anderen Vorfahren aktualisieren möchten, müssen Sie zuerst die zuvor "cherrypickten" Commits löschen, indem Sie einen git reset --hard oder git branch -f topic_duplicate machen und dann die anderen Commits (vom Hauptthema-Branch) entweder durch Rebase oder Cherry-Picking kopieren.

Rebase funktioniert nur auf einem Branch, der bereits die Commits hat, also müssen Sie Ihren Thema-Branch jedes Mal duplizieren, wenn Sie das tun möchten.

Cherry-Picking ist viel einfacher:

git cherry-pick master..topic

Also wird die gesamte Sequenz darauf hinauslaufen:

git reset --hard 
git cherry-pick master..topic

Wenn Ihr Thema-Duplikat-Branch ausgecheckt wurde. Das würde zuvor-cherry-gepickte Commits vom aktuellen Duplikat entfernen und alle Änderungen, die in "thema" geschehen, einfach wieder auf Ihren aktuellen "dump" (anderer Vorfahre) anwenden. Es scheint ein ziemlich bequemer Weg zu sein, Ihre Entwicklung auf dem "echten" Upstream-Master zu basieren, während Sie einen anderen "downstream" Master verwenden, um zu überprüfen, ob Ihre lokalen Änderungen auch noch zutreffen. Alternativ könnten Sie einfach einen Diff erzeugen und dann außerhalb eines Git-Source-Baums anwenden. Aber auf diese Weise können Sie eine aktualisierte modifizierte (gepatchte) Version behalten, die auf der Version Ihrer Distribution basiert, während Ihre eigentliche Entwicklung gegen den wirklichen Upstream-Master gerichtet ist.

Also nur zur Demonstration:

  • reset wird Ihren Branch auf einen anderen Commit zeigen lassen (--hard überprüft auch den vorherigen Commit, --soft hält hinzugefügte Dateien im Index (die beim nächsten Commit mitkommi tiert würden) und der Standardwert (--mixed) wird den vorherigen Commit nicht auschecken (löscht Ihre lokalen Änderungen), aber er wird den Index leeren (noch nichts wurde für den Commit hinzugefügt)
  • Sie können einen Branch einfach zwingen, auf einen anderen Commit zu zeigen
  • Sie können dies auch sofort machen, während Sie auf diesen Commit auschecken
  • rebase funktioniert auf den Commits in Ihrem aktuellen Branch
  • cherry-picking bedeutet, von einem anderen Branch zu kopieren

Hoffentlich hilft dies jemandem. Ich wollte dies neu schreiben, aber ich schaffe es jetzt nicht. Grüße.

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