Angenommen, ich habe ein lokales und ein entferntes Mercurial-Repository. Jetzt arbeite ich an einer Funktion. Ich arbeite daran und wenn ich denke, dass es fertig ist, lege ich das Änderungsset fest. Wenn ich es ein bisschen mehr teste, finde ich, dass ich diese Funktion weiter verbessern kann, indem ich etwas im Code optimiere. Ich mache die Änderung und verpflichte mich. 20 Minuten später stelle ich fest, dass diese neue Funktion einen Fehler enthält, also behebe ich ihn und begebe ihn auch.
Ich habe jetzt 3 Änderungssätze, die ich wirklich gerne als einen Änderungssatz mit der Meldung "Implementieren von Feature X" an das Remote-Repository senden möchte.
Wie kann ich das ohne großen Aufwand tun? Ich glaube, ich könnte es mit Patches machen, aber es scheint viel Arbeit zu sein.
quelle
Antworten:
Wie wäre es mit der Collapse Extension ?
quelle
hg rebase --collapse
. Schauen Sie sich das hg-Wiki mit dem Befehl rebase an. Da diese Frage das dritte Gesamtsuchergebnis und das erste im Stackoverflow ist, dachte ich, dass Informationen nützlich sein könnten.hg rebase
mit--collapse
innerhalb eines einzelnen Zweigs verwenden.Die histedit- Erweiterung ist genau das, wonach Sie suchen.
oder
zeigt eine Liste der ausgehenden Änderungssätze an. Aus der Liste können Sie
histedit fordert Sie zur Eingabe der neuen Festschreibungsnachricht der gefalteten Änderungssätze auf, die standardmäßig die beiden Nachrichten enthält, wobei "\ n *** \ n" sie trennt.
Sie können ähnliche Ergebnisse auch mit der Erweiterung mq erzielen, dies ist jedoch viel schwieriger.
Sie können die Collapse-Erweiterung auch verwenden, um nur das Falten durchzuführen. Sie bietet jedoch keine so schöne Benutzeroberfläche und keine Möglichkeit, die resultierende Commit-Nachricht zu bearbeiten. Durch das Bearbeiten der resultierenden Festschreibungsnachricht kann auch die endgültige Nachricht bereinigt werden, was ich am Ende immer verwende.
quelle
Ja, Sie können dies mit Patches tun: Nehmen wir an, Ihre Arbeit befindet sich in den Änderungssätzen 100 bis einschließlich 110
Erstellen Sie einen Patch:
% hg export -o mypatch 100:110 --git
Update auf 99:
% hg update 99
Wenden Sie den Patch mit --no-commit an (andernfalls erhalten Sie alle Ihre Änderungssätze zurück):
% hg import --no-commit mypatch
Übernehmen Sie alle Änderungen auf einmal:
% hg commit
Sie haben jetzt zwei Köpfe (110 und 111), die in Bezug auf die Dateien, die sie in Ihrem Arbeitsverzeichnis erstellen, gleichwertig sein sollten.
% hg strip 100
OK, jetzt, wo ich alles dargelegt habe, scheint es langwierig zu sein, aber nachdem ich es ein paar Mal selbst gemacht habe, finde ich es nicht zu mühsam ...
quelle
hg strip --keep
und dann alles in einem einzigen Commit festschreiben?hg strip
wird jedoch ein Backup im.hg/strip-backup/
Verzeichnis abgelegt . Ich denke, es ist nicht so sichergit reflog
, bietet aber dennoch eine Art Rettung.Wenn Sie TortoiseHg verwenden, können Sie mit nur zwei Revisionen auswählen (verwenden Sie STRG, um nicht nachfolgende Revisionen auszuwählen), mit der rechten Maustaste klicken und "Verlauf komprimieren" auswählen .
Danach erhalten Sie ab der ersten Änderung, die Sie zuvor ausgewählt haben, eine neue Änderungsliste in neuem Kopf. Sie enthält alle Nachkommen-Änderungslisten zwischen den von Ihnen ausgewählten.
Sie können alte Änderungslisten einfach entfernen, wenn Sie sie nicht mehr benötigen: Verwenden Sie dafür MQ- Erweiterungen. Wiederum in TortoiseHg: Klicken Sie mit der rechten Maustaste auf die erste Änderungsliste, die mit allen Nachkommen entfernt werden muss: "Verlauf ändern -> Entfernen" .
quelle
Meine bevorzugte Methode zur Verwendung von mq für diese Faltung ist die Verwendung von TortoiseHg, wie hier beschrieben . Dies kann jedoch einfach über die Befehlszeile erfolgen:
(Es gibt vielleicht einen besseren Weg, um den qfold-Schritt auszuführen, aber ich bin mir dessen nicht bewusst, da ich normalerweise TortoiseHg für diese Operation verwende.)
Es scheint zunächst etwas kompliziert zu sein, aber sobald Sie mit der Verwendung von mq begonnen haben, ist es ziemlich einfach und natürlich - und Sie können mit mq alle möglichen anderen Dinge tun, die ziemlich praktisch sein können!
quelle
hg collapse
undhg histedit
sind die besten Wege. Oder besser gesagt, es wäre der beste Weg, wenn sie zuverlässig funktionieren würden ... Ich musstehistedit
innerhalb von drei Minuten mit einem Stack-Dump abstürzen.Collapse
ist nicht viel besser.Ich dachte, ich könnte zwei andere BKMs teilen:
hg rebase --collapse
Diese Erweiterung wird mit Mercurial vertrieben. Ich hatte noch keine Probleme damit. Möglicherweise müssen Sie einige Spiele spielen, um
hg rebase
Einschränkungen zu umgehen. Grundsätzlich ist es nicht so, dass ein Vorfahr auf demselben Vorfahren mit demselben Namen oder Standard neu erstellt wird, obwohl dies zulässig ist, wenn zwischen (benannten) Zweigen eine Neubasis vorgenommen wird.Verschieben Sie das Repository (
foo/.hg
) in das Arbeitsverzeichnis (bar
) und seine Dateien. Nicht umgekehrt.Einige Leute haben darüber gesprochen, zwei Klonbäume zu erstellen und Dateien zwischen ihnen zu kopieren. Oder zwischen ihnen flicken. Stattdessen ist es einfacher, die
.hg
Verzeichnisse zu verschieben.Dies funktioniert so lange, wie die wahren Repositorys, die
.hg
Bäume, unabhängig vom Arbeitsverzeichnis und seinen Dateien sind.Wenn sie nicht unabhängig sind ...
quelle
histedit
ist eine sehr gute Option für diese Aufgabe. Ich vertraue ihm immer noch nicht, da ich eine Git-Rebase -i mache, aber es stürzt nicht ab. Zumindest neuere Versionen lassen Sie auf einem temporären Zweig, wenn etwas schrecklich schief geht, so dass die Änderungssätze das einzige Mal entfernt werden ist, nachdem der neue Zweig festgeschrieben wurde.Ich habe Mercurial noch nie benutzt, aber das klingt sehr nach dem, worüber Martin Fowler vor nicht allzu langer Zeit in seinem Blog gesprochen hat:
http://martinfowler.com/bliki/MercurialSquashCommit.html
quelle
Warum nicht einfach
hg strip --keep
befehlen?Dann können Sie alle Änderungen als ein Commit festschreiben.
quelle
HistEdit wird tun, was Sie wollen, aber es ist wahrscheinlich übertrieben. Wenn Sie nur einige Änderungssätze zusammenfalten müssen, erledigt die Collapse Extension die Aufgabe.
quelle
Angenommen, Sie haben zwei unveröffentlichte Commits
THIS
undTHAT
Commits in Mercurial und möchten, dass sie sich anTHIS
Punkt :: zu einem einzigen Commit verbinden.Überprüfen Sie, ob Ihre Commits nicht veröffentlicht wurden ::
Update zum
LAST
Festschreiben ::und Import Commits bis zu
THIS
in MQ ::Entfernen Sie alle Patches und wenden Sie nur zuerst an
THIS
::Join with
THAT
::HINWEIS Um den Namen zu finden,
THATNAME
verwenden Sie ::Wenden Sie alle Patches an und verschieben Sie sie in den Repository-Verlauf ::
Mein Blog-Beitrag zum Thema ist Beitritt zu zwei Commits in Mercurial .
quelle
Ja,
strip --keep
funktioniert für die Frage des Autors. Aber es war etwas anders als bei anderen, zum Beispiel, wenn Sie eine Version von 1 bis 30 haben, aber nur die Version 12-15 reduzieren möchten. Andere Lösungen funktionieren aber nichtstrip --keep
.quelle