Ich habe ein paar Commits, die eigentlich nur eines sein sollten. Wenn ich Git verwenden würde, würde ich verwenden:
git rebase -i <some-commit-before>
und dann zerquetsche sie.
Kann ich das in mercurial machen? Wenn das so ist, wie?
Ich habe ein paar Commits, die eigentlich nur eines sein sollten. Wenn ich Git verwenden würde, würde ich verwenden:
git rebase -i <some-commit-before>
und dann zerquetsche sie.
Kann ich das in mercurial machen? Wenn das so ist, wie?
Antworten:
Ja, Sie können dies mit mercurial ohne Erweiterungen tun, indem Sie Changesets verketten .
Wenn Sie eine Erweiterung verwenden möchten, können Sie alternativ Folgendes verwenden:
Mein Favorit ist hg strip --keep
Befehl. Und dann begebe ich alle Änderungen in einem Commit.
Es ist der schnellste und bequemste Weg für mich, weil ich während meiner täglichen Arbeit gerne viele kleine Aufgaben mache;)
Hinweis 1: Zum strip
Aktivieren ist eine integrierte Erweiterung erforderlich mq
.
Hinweis 2: Mein Lieblings-Git / Mercurial-Client (SmartGit / Hg) wird während standardmäßig an einen --keep
Parameter angehängt strip
. Und was noch bequemer ist: Es bietet eine Option namens join commits
:]
hg strip --keep --rev [rev]
Wo rev
ist die Revisionsnummer des ersten Commits, das Sie mit dem letzten
--rev
ist optional, voller Befehl isthg strip --keep [rev]
hg help strip
gibt hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, und das Weglassen der Überarbeitung gibt mir abort: empty revision set
.
hg strip
ist nicht die beste Idee. Es ist nicht gerade sicher. Versuchen Sie es hg histedit
, vielleicht sogar mit der Evolve-Erweiterung.
Die Rebase-Erweiterung wirkte wie ein Zauber. So quetschen Sie 2 Commits:
$ hg rebase --dest .~2 --base . --collapse
Punkt ist eine Verknüpfung für die aktuelle Revision.
Es ist noch einfacher, wenn Sie ein paar Commits für einen Zweig haben und sie alle zu einem zusammenfassen möchten:
$ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
So funktioniert das:
(von http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
Wenn Sie diese Antwort lesen, können Sie jede andere in dieser Antwort erwähnte Option vergessen und den
fold
Befehl aus der Evolve-Erweiterung verwenden .
evolve
ist eine Erweiterung von mercurial, die uns dabei hilft, eine sichere veränderbare Geschichte zu haben. Es ist jedoch immer noch experimentell. Sie können es verwenden, indem Sie es aus dem Repo klonen und wie folgt in Ihre .hgrc-Datei einfügen.
[extensions]
evolve = ~/evolve/hgext/evolve.py
Angenommen, Sie haben das Evolutions-Repo in Ihrem Home-Verzeichnis geklont. Jetzt können Sie loslegen. Sie können auch Hilfe von suchen hg help fold
.
Sie weisen fold
an, eine lineare Kette von Commits zu quetschen / zu falten, die nicht unterbrochen ist. Falz erstellt ein neues Änderungsset, das Änderungen aus allen Änderungssätzen enthält, und markiert alle diese Commits als veraltet. Sie können dies unter docs genauer untersuchen .
Angenommen, Sie haben die folgende Geschichte.
a -> b -> c -> d -> e -> f -> g
Sie wollen quetschen e
, f
und g
. Du kannst tun
hg up g
hg fold -r e
Das Ergebnis wird sein
a -> b -> c -> d -> h
Wo h
ist das Änderungsset, das Änderungen aus allen drei Commits enthält e
, f
undg
.
Sie können auch Änderungssätze aus der Mitte des Verlaufs falten, dh Sie müssen nicht unbedingt eine Kette auswählen, die die Spitze enthält. Angenommen , Sie falten möchten b
, c
und d
. Du kannst tun
hg up d
hg fold -r b
hg evolve --all
Dies führt zu
a -> i -> j
wobei i
die gefaltete changeset von b
, c
, d
und j
ist der gleiche wie changeset h
.
Evolve Benutzerhandbuch ist ein Muss zu lesen.
--keep
Option zum erneuten Basieren deckt dies jedoch ab (gefolgt vom Markieren von Revisionen als geheim oder dem Verwenden von Streifen, sobald Sie das Ergebnis überprüft haben). Selbst das Verschieben von Revisionen zwischen anderen Revisionen ist mit einer Folge von zwei Rebase-Befehlen möglich.
Mit Mercurial 4.8 (November 2018, 9 Jahre später) konnten Sie den neuen Befehl in Betracht ziehen hg absorb
(es war zuvor eine experimentelle Funktion ).
Siehe " Absorbieren von Commit-Änderungen in Mercurial 4.8 "
Die absorb-Erweiterung übernimmt jede Änderung in Ihrem Arbeitsverzeichnis, ermittelt, welche Commits in Ihrer Serie diese Zeile geändert haben, und ändert die Änderung automatisch in dieses Commit.
Wenn es Unklarheiten gibt (dh mehrere Commits, die dieselbe Zeile geändert haben), ignoriert absorb diese Änderung einfach und belässt sie in Ihrem Arbeitsverzeichnis, um sie manuell aufzulösen.
hg absorb
Findet auf technischer Ebene alle nicht festgeschriebenen Änderungen und versucht, jede geänderte Zeile einem eindeutigen vorherigen Commit zuzuordnen.
Für jede Änderung, die sauber zugeordnet werden kann, werden die nicht festgeschriebenen Änderungen in das entsprechende vorherige Festschreiben übernommen. Von der Operation betroffene Commits werden automatisch neu basiert.
Wenn eine Änderung nicht einem eindeutigen vorherigen Commit zugeordnet werden kann, bleibt sie nicht festgeschrieben, und Benutzer können auf einen vorhandenen Workflow zurückgreifen (zhg histedit
. B. mithilfe von ).Die automatische Umschreibungslogik von
hg absorb
wird implementiert, indem der Verlauf der Zeilen verfolgt wird: Dies unterscheidet sich grundlegend von dem Ansatz vonhg histedit
odergit rebase
, der sich in der Regel auf Zusammenführungsstrategien stützt , die auf der 3-Wege-Zusammenführung basieren , um eine neue Version einer Datei bei mehrfacher Eingabe abzuleiten Versionen.Dieser Ansatz kombiniert mit der Tatsache, dass hg absorb Änderungen mit einem mehrdeutigen Anwendungs-Commit überspringt, bedeutet, dass hg absorb niemals auf Zusammenführungskonflikte stößt!
Wenn Sie Zeilen mit mehrdeutigen Anwendungszielen ignorieren, wird der Patch möglicherweise immer sauber angewendet, wenn Sie eine klassische 3-Wege-Zusammenführung verwenden. Diese Aussage klingt logisch richtig. Dies ist jedoch nicht
hg absorb
der Fall : Kann Zusammenführungskonflikte vermeiden, wenn die Zusammenführung von durchgeführt wirdhg histedit
odergit rebase -i
fehlschlagen würde.
Ich denke chistedit
(eingebaut seit Mercurial 2.3) ist dem rebase -i
reinen Mercurial am nächsten ( chistedit
ist die interaktive Version von histedit
). Sobald der fold
Befehl in histedit vorliegt, wird er den Rebases squash
und der roll
Befehl den Rebases zugeordnet fixup
. Siehe histedit Dokumenten.
Hier ist ein einfaches Beispiel. Angenommen, Sie haben Folgendes und möchten alle Änderungen von 1e21c4b1 in die vorherige Revision verschieben und nur die Nachricht der vorherigen Revision beibehalten.
@ 1e21c4b1 drees tip
| A commit you want to squash
o b4a738a4 drees
| A commit
o 788aa028 drees
| Older stuff
Sie können hg chistedit -r b4a738a4
den Verlauf zurück zu b4a738a4 bearbeiten. In chistedit bewegen Sie sich dann auf 1e21c4b1 und drücken, r
um anzuzeigen, dass Sie diese Revision rollen möchten. Beachten Sie, dass die Reihenfolge in histedit (älteste bis neueste) von hg log
(neueste bis älteste) umgekehrt ist .
#0 pick 160:b4a738a49916 A commit
#1 ^roll 161:1e21c4b1500c
Nachdem Sie Ihre Änderungen ausgewählt haben, wählen Sie c
legen Sie sie fest. Das Ergebnis ist folgendes:
@ bfa4a3be drees tipp | Ein Commit o 788aa028 drees | Älteres Zeug
Wenn Sie für sie relativ neu sind, histedit
kann eine bessere Wahl sein alschistedit
weil die Befehlsbeschreibungen in der histedit-Datei als Referenz bereitgestellt werden. Es dauert nur ein bisschen mehr Bearbeitung, um die Befehle mit normaler Textbearbeitung festzulegen (genau wie bei normaler Rebase).
Beachten Sie , verwenden entweder histedit
oder chistedit
müssen Sie hinzufügen , histedit
um Ihre Erweiterungen in Ihrer ~ / .hgrc:
[extensions]
histedit =
Ich schlug vor, chistedit
da es am nächsten ist rebase -i
und überall in der Geschichte funktioniert. Wenn Sie wirklich nur die aktuelle Version in die vorherige überarbeiten / optimieren möchten, dann @G. Demeckis strip
Vorschlag kann gut sein, da klar ist, was passiert. Es ist seit Mercuria 2.8 eingebaut. Um die oben genannten äquivalenten Ergebnisse zu erhalten, können Sie Folgendes tun:
hg strip .
hg add
hg commit --amend
Beachten Sie strip
, dass wie bei histedit in Ihrem ~ / .hgrc Folgendes aktiviert sein muss:
[extensions]
strip =
Nehmen wir an, Sie möchten 2 der letzten Commits quetschen (vereinen).
Suchen Sie eine Revisionsnummer
hg log -G -l 3
mögliche Ausgabe:
@ changeset: 156:a922d923cf6f
| branch: default
| tag: tip
| user: naXa!
| date: Thu Dec 13 15:45:58 2018 +0300
| summary: commit message 3
|
o changeset: 155:5feb73422486
| branch: default
| user: naXa!
| date: Thu Dec 13 15:22:15 2018 +0300
| summary: commit message 2
|
o changeset: 154:2e490482bd75
| branch: default
~ user: naXa!
date: Thu Dec 13 03:28:27 2018 +0300
summary: commit message 1
Soft-Reset-Zweig
hg strip --keep -r 155
Änderungen erneut festschreiben
hg commit -m "new commit message"
strip
erfordert die Aktivierung einer integrierten Erweiterung. Erstellen / Bearbeiten der ~/.hgrc
Konfigurationsdatei mit folgendem Inhalt:
[extensions]
strip =