Ich habe mich versehentlich für den falschen Zweig entschieden. Wie lösche ich dieses Commit?
948
Löschen Sie das letzte Commit und behalten Sie die von Ihnen geleistete Arbeit bei:
git reset --soft HEAD~1
Löschen Sie das letzte Commit und zerstören Sie die von Ihnen geleistete Arbeit :
git reset --hard HEAD~1
git reset --hard origin
git remote
Herkunft für mich,git reset --hard origin
sagtfatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. Warum?git reset HEAD~1
behält auch alle Ihre Änderungen bei, hinterlässt jedoch einen leeren Index, anstatt alles beizubehalten (wie es die--soft
Option tun würde).Ich frage mich, warum die beste Antwort, die ich gefunden habe, nur in den Kommentaren ist! ( von Daenyth mit 86 Stimmen )
Dieser Befehl synchronisiert das lokale Repository mit dem Remote-Repository und entfernt alle Änderungen, die Sie an Ihrem lokalen Repository vorgenommen haben. Sie können auch Folgendes tun, um den genauen Zweig abzurufen, den Sie im Ursprung haben.
quelle
git reset --hard origin/<branch>
git reset --soft origin/<branch>
wenn Sie das Commit loswerden möchten, aber die lokale Arbeit beibehalten möchten.fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, Sie müssen den Zweig wiegit reset --hard origin/feature/my-cool-stuff
Löschen Sie es nicht: für nur ein Commit
git cherry-pick
reicht aus.Aber wenn Sie mehrere Commits in der falschen Filiale hatten, ist dies der Ort
git rebase --onto
scheint das:Angenommen, Sie haben Folgendes:
, dann können Sie es markieren
master
und verschieben, wo Sie sein möchten:Setzen Sie den Zweig zurück, wo er hätte sein sollen:
und verschieben Sie schließlich Ihre Commits (wenden Sie sie erneut an und machen Sie tatsächlich neue Commits)
quelle
Machen Sie ein
git rebase -i FAR_ENOUGH_BACK
und lassen Sie die Zeile für das Commit fallen, das Sie nicht möchten.quelle
Wenn Sie dieses Commit in einen anderen Zweig verschieben möchten, rufen Sie die SHA des betreffenden Commits ab
Wechseln Sie dann den aktuellen Zweig
Und
cherry-pick
das verpflichten sichother-branch
quelle
git reset --hard HEAD~1
anschließende Festschreiben. Ich denke, die Verwendung vonreset --soft
Zweigstellenwechsel und erneutes Festschreiben hätte zusätzliche Arbeit gespart. Andererseits habe ich SourceTree verwendet, um die meisten meiner grundlegenden Aufgaben zu erledigen, und nur nach meinem Fehler eine Befehlszeile damit.Als Referenz glaube ich, dass Sie Commits aus Ihrem aktuellen Zweig nicht nur mit git reset --hard, sondern auch mit dem folgenden Befehl "hart abschneiden" können:
Wenn Sie sich nicht für das Auschecken interessieren, können Sie den Zweig auf Folgendes einstellen:
Dies wäre eine programmatische Methode, um beispielsweise Commits aus einem Zweig zu entfernen, um neue Commits in diesen Zweig zu kopieren (mithilfe von rebase).
Angenommen, Sie haben einen Zweig, der vom Master getrennt ist, weil Sie Quellen von einem anderen Speicherort genommen und in den Zweig kopiert haben.
Sie haben jetzt einen Zweig, in dem Sie Änderungen vorgenommen haben. Nennen wir ihn "Thema".
Sie erstellen jetzt ein Duplikat Ihres Themenzweigs und stützen es dann erneut auf den Quellcode-Speicherauszug, der sich im Zweig "Speicherauszug" befindet:
Jetzt werden Ihre Änderungen in branch topic_duplicate basierend auf dem Startpunkt von "dump" erneut angewendet, aber nur die Commits, die seit "master" stattgefunden haben. Ihre Änderungen seit dem Master werden nun erneut auf "dump" angewendet, aber das Ergebnis endet in "topic_duplicate".
Sie können dann "dump" durch "topic_duplicate" ersetzen, indem Sie Folgendes tun:
Oder mit
Oder einfach durch Entsorgen der Müllkippe
Vielleicht können Sie auch einfach nach dem Löschen des aktuellen "topic_duplicate" eine Auswahl treffen.
Ich versuche zu sagen, dass Sie, wenn Sie den aktuellen "doppelten" Zweig basierend auf einem anderen Vorfahren aktualisieren möchten, zuerst die zuvor "cherrypicked" Commits löschen müssen, indem Sie ein
git reset --hard <last-commit-to-retain>
oder ausführengit branch -f topic_duplicate <last-commit-to-retain>
und dann die anderen Commits kopieren (vom Haupt- Commit) Themenzweig) entweder durch Umbasieren oder durch Kirschernte.Das erneute Basieren funktioniert nur in einem Zweig, in dem bereits Commits vorhanden sind. Daher müssen Sie Ihren Themenzweig jedes Mal duplizieren, wenn Sie dies tun möchten.
Cherrypicking ist viel einfacher:
Die gesamte Sequenz läuft also auf Folgendes hinaus:
Wenn Ihr Zweig mit doppelten Themen ausgecheckt wurde. Dadurch würden zuvor ausgewählte Informationen aus dem aktuellen Duplikat entfernt und alle Änderungen in "Thema" erneut auf Ihren aktuellen "Speicherauszug" (anderer Vorfahr) angewendet. Es scheint eine recht bequeme Möglichkeit zu sein, Ihre Entwicklung auf den "echten" Upstream-Master zu stützen, während Sie einen anderen "Downstream" -Master verwenden, um zu überprüfen, ob Ihre lokalen Änderungen auch noch für diesen gelten. Alternativ können Sie einfach ein Diff generieren und es dann außerhalb eines Git-Quellbaums anwenden. Auf diese Weise können Sie jedoch eine aktuelle modifizierte (gepatchte) Version beibehalten, die auf der Version Ihrer Distribution basiert, während Ihre eigentliche Entwicklung gegen den tatsächlichen Upstream-Master gerichtet ist.
Also nur um zu demonstrieren:
Hoffe das hilft jemandem. Ich wollte das umschreiben, aber ich kann es jetzt nicht schaffen. Grüße.
quelle
Der folgende Befehl hat für mich funktioniert, alle lokal festgeschriebenen Änderungen werden gelöscht und local wird auf den gleichen Wert wie Remote Origin / Master Branch zurückgesetzt.
quelle