Also mache ich immer wieder einen dummen Fehler in Mercurial. Oft beginne ich mit der Arbeit, ohne ein "hg pull" und ein "hg update" durchzuführen. Wenn ich versuche, meine Änderungen zu übertragen, wird eine Fehlermeldung angezeigt.
Gibt es eine Möglichkeit, meine lokalen Commits zu löschen, damit ich nicht mehrere Köpfe, Zweige usw. erstellen kann? Ich möchte nur meine lokalen Commits löschen, meine Änderungen mit dem Tipp zusammenführen und dann erneut festschreiben. Klingt einfach, oder? Ich kann anscheinend keine Möglichkeit finden, lokale Commits einfach zu löschen, damit ich sie sauber mit dem Tipp zusammenführen kann.
Wieder versuche ich nur lokale Commits zu löschen, die mit "hg ci" gemacht wurden. Ich möchte keine Dateien ändern, zurücksetzen usw.
Antworten:
Aktivieren Sie die Erweiterung " Streifen " und geben Sie Folgendes ein:
Wo
#changeset#
ist der Hash für das Änderungsset, das Sie entfernen möchten? Dadurch wird der Änderungssatz einschließlich der von ihm abgeleiteten Änderungssätze entfernt und Ihr Arbeitsverzeichnis bleibt unberührt . Wenn Sie auch Ihre festgeschriebenen Codeänderungen rückgängig machen möchten, entfernen Sie die--keep
Option.Weitere Informationen finden Sie in der Streifenerweiterung .
Wenn Sie den "unbekannten Befehl 'strip'" erhalten, müssen Sie ihn möglicherweise aktivieren. Suchen Sie dazu die Datei
.hgrc
oderMercurial.ini
und fügen Sie Folgendes hinzu:Beachten Sie, dass (wie Juozas in seinem Kommentar erwähnt hat) das Vorhandensein mehrerer Köpfe in Mercurial ein normaler Workflow ist. Sie sollten den Befehl strip nicht verwenden, um das zu bekämpfen. Stattdessen sollten Sie Ihren Kopf mit dem eingehenden Kopf zusammenführen, Konflikte lösen, testen und dann pushen.
Der
strip
Befehl ist nützlich, wenn Sie Änderungssätze, die den Zweig verschmutzen, wirklich entfernen möchten. Wenn Sie sich in der Situation dieser Frage befinden und alle "Entwurfs" -Änderungssätze dauerhaft vollständig entfernen möchten , lesen Sie die Top-Antwort , die im Grunde Folgendes empfiehlt:quelle
strip =
in Ordnung. WhatsNew für Mercurial 2.8Wenn Sie Hg Tortoise verwenden, aktivieren Sie einfach die Erweiterung " Strip " in:
right click
Wählen Sie dann die untere Revision aus, von der aus Sie mit dem Striping beginnen möchten, indem Sie darauf klicken und Folgendes auswählen:Genau wie dieser:
In diesem Beispiel wird es von der 19. bis zur letzten festgeschriebenen Revision gelöscht (22).
quelle
File/Settings/Extensions/
Ich wünschte, ich könnte mehr Stimmen hinzufügen. Vielen Dank!--keep
und TortoiseHg bietet diese Option nicht an. Also ... müssen Sie es an der Kommandozeile mit tunhg strip -r . --keep
.Moderne Antwort (nur relevant nach Mercurial 2.1):
Verwenden Sie Phasen und markieren Sie die Revision (en), die Sie nicht freigeben möchten, als geheim (privat). Auf diese Weise werden sie beim Senden nicht gesendet.
In TortoiseHG können Sie mit der rechten Maustaste auf ein Commit klicken, um dessen Phase zu ändern.
Außerdem: Sie können die Erweiterung "rebase" auch verwenden, um Ihre lokalen Commits nach dem Abrufen an den Kopf des freigegebenen Repositorys zu verschieben.
quelle
Wie alle anderen darauf hinweisen, sollten Sie wahrscheinlich nur die Köpfe ziehen und dann zusammenführen. Wenn Sie Ihre Commits jedoch wirklich ohne eines der EditingHistory- Tools loswerden möchten, können Sie nur
hg clone -r
Ihr Repo verwenden, um alle Änderungen außer diesen zu erhalten.Dadurch werden sie nicht aus dem ursprünglichen Repository gelöscht, es wird jedoch ein neuer Klon erstellt, der sie nicht enthält. Dann können Sie das von Ihnen geänderte Repo löschen (wenn Sie möchten).
quelle
Ich bin auch auf dieses Problem gestoßen. Ich habe 2 gemacht
commit
und wollte beide Commits zurücksetzen und löschen.Aber
hg rollback
rollt einfach zurück zum letzten Commit, nicht zu den 2 Commits. Zu diesem Zeitpunkt habe ich das nicht bemerkt und den Code geändert.Als ich herausfand,
hg rollback
dass gerade ein Commit zurückgesetzt wurde, stellte ich fest, dass ich es verwenden konntehg strip #changeset#
. Also habe ichhg log -l 10
die letzten 10 Commits gefunden und das richtige Änderungsset erhalten, das ich wolltestrip
.Was heißt
abort: local changes found
das Dies bedeutet, dasshg
Änderungen am Code gefunden wurden, die noch nicht festgeschrieben wurden. Um dies zu lösen, sollten Siehg diff
den Code speichern, den Sie geändert haben, undhg revert
undhg strip #changeset#
. Genau wie dieser:Nachdem Sie die oben genannten
patch
Schritte ausgeführt haben, können Sie die Diff-Datei und Ihren Code wieder zu Ihrem Projekt hinzufügen.quelle
Mit der Rebase-Erweiterung können Sie dies noch einfacher umgehen. Verwenden
hg pull --rebase
Sie sie einfach, und Ihre Commits werden automatisch wieder in die gezogene Revision übernommen, um das Verzweigungsproblem zu vermeiden.quelle
Wenn Sie mit git vertraut sind, verwenden Sie gerne histedit , das wie folgt funktioniert
git rebase -i
.quelle
hg strip
ist was Sie suchen. Es ist analog,git reset
wenn Sie mit Git vertraut sind.Konsole verwenden:
Sie müssen die Revisionsnummer kennen.
hg log -l 10
. Dieser Befehl zeigt die letzten 10 Commits an. Finden Sie das Commit, das Sie suchen. Sie benötigen eine 4-stellige Nummer aus der Änderungssatzzeilechangeset: 5888:ba6205914681
Dann
hg strip -r 5888 --keep
. Dadurch wird der Datensatz des Commits entfernt, aber alle Dateien bleiben geändert, und Sie können sie erneut festschreiben. (Wenn Sie Dateien löschen möchten, um nur --keep zu entfernenhg strip -r 5888
quelle
[Hg Tortoise 4.6.1] Wenn es sich um eine kürzlich durchgeführte Aktion handelt, können Sie die Aktion "Rollback / Rückgängig" verwenden (Strg + U).
quelle
Zusätzlich zu Samaursas hervorragender Antwort können Sie die
evolve
Erweiterungprune
als sichere und wiederherstellbare Version verwendenstrip
, mit der Sie zurückkehren können, falls Sie etwas falsch machen.Ich habe diesen Alias auf meinem
.hgrc
:Beachten Sie, dass
prune
auch hat--keep
, genau wiestrip
zu halten , das Arbeitsverzeichnis intakt so dass Sie die Dateien zu verpflichten .quelle