it-swarm.com.de

Mercurial: Wie kann man das letzte Commit ändern?

Ich suche in Mercurial nach einem Gegenstück von git commit --amend, d. H. Nach einer Möglichkeit, das Commit zu ändern, mit dem meine Arbeitskopie verknüpft ist. Die Voraussetzungen für dieses Änderungsverfahren sind:

  • wenn möglich, sollte es keine Erweiterungen erfordern. Es muss keine nicht standardmäßigen Erweiterungen erfordern Erweiterungen, die nicht mit einer offiziellen Mercurial-Installation geliefert werden.

  • wenn das Commit zum Ändern ein Leiter meiner aktuellen Niederlassung ist, sollte kein neuer Leiter erstellt werden. Wenn das Commit nicht head ist, kann ein neuer head erstellt werden.

  • die Prozedur sollte safe so sein, dass, wenn aus irgendeinem Grund die Änderung fehlschlägt, ich die gleiche Arbeitskopie und denselben Repository-Status wie vor der Änderung wiederherstellen möchte. Mit anderen Worten, wenn die Änderung selbst fehlschlagen kann, sollte eine fehlersichere Prozedur zum Wiederherstellen der Arbeitskopie und des Repository-Status vorhanden sein. Ich beziehe mich auf "Fehler", die in der Natur der Änderungsprozedur liegen (wie z. B. Konflikte), nicht auf Dateisystemprobleme (wie Zugriffsbeschränkungen, nicht in der Lage, eine Datei zum Schreiben zu sperren, ... )

Update (1):

  • die Prozedur muss automatisierbar sein, damit sie von einem GUI-Client ausgeführt werden kann, ohne dass eine Benutzerinteraktion erforderlich ist.

Update (2):

  • dateien im Arbeitsverzeichnis dürfen nicht berührt werden (bestimmte modifizierte Dateien enthalten möglicherweise Dateisystemsperren). Dies bedeutet insbesondere, dass ein möglicher Ansatz zu keinem Zeitpunkt ein sauberes Arbeitsverzeichnis erfordert.
201
mstrap

Mit der Veröffentlichung von Mercurial 2.2 können Sie die Option --amend zusammen mit hg commit verwenden, um das letzte Commit mit dem aktuellen Arbeitsverzeichnis zu aktualisieren

Aus der Befehlszeilenreferenz :

Das Flag --amend kann verwendet werden, um das übergeordnete Element des Arbeitsverzeichnisses durch ein neues Commit zu ändern, das die Änderungen im übergeordneten Element zusätzlich zu den derzeit vom Status hg gemeldeten Änderungen enthält, sofern vorhanden. Das alte Commit wird in einem Backup-Bundle in .hg/strip-backup gespeichert (siehe hg help bundle und hg help, wie es wiederhergestellt werden kann).

Nachricht, Benutzer und Datum stammen aus dem geänderten Commit, sofern nicht anders angegeben. Wenn in der Befehlszeile keine Nachricht angegeben ist, wird der Editor mit der Nachricht des geänderten Commits geöffnet.

Das Tolle ist, dass dieser Mechanismus "sicher" ist, weil er auf der relativ neuen "Phasen" -Funktion beruht, um Updates zu verhindern, die den Verlauf ändern würden, der bereits außerhalb des lokalen Repositorys verfügbar gemacht wurde.

276
Chris Phillips

Sie haben 3 Möglichkeiten, Commits in Mercurial zu bearbeiten:

  1. hg strip --keep --rev -1 macht das letzte (1) Commit (s) rückgängig, sodass Sie es erneut tun können (siehe diese Antwort für weitere Informationen).

  2. Verwendung der MQ-Erweiterung , die mit Mercurial geliefert wird 

  3. Auch wenn es nicht mit Mercurial ausgeliefert wird, ist die Erweiterung Histedit erwähnenswert

Sie können auch die Seite Bearbeitungshistorie des Mercurial-Wikis einsehen.

Kurz gesagt, das Editieren von Historien ist sehr schwierig und entmutigt. Wenn Sie Ihre Änderungen bereits durchgesetzt haben, können Sie kaum etwas tun, außer wenn Sie die vollständige Kontrolle über alle anderen Klone haben.

Ich bin mit dem git commit --amend-Befehl nicht wirklich vertraut, aber AFAIK, Histedit scheint die engste Annäherung zu sein, wird aber leider nicht mit Mercurial ausgeliefert. MQ ist wirklich kompliziert zu bedienen, aber Sie können damit fast alles machen.

51
krtek

GUI-Äquivalent für hg commit --amend:

Dies funktioniert auch von TortoiseHGs GUI (ich verwende Version 2.5):

Wechseln Sie in die Ansicht 'Festschreiben' oder wählen Sie in der Workbench-Ansicht den Eintrag 'Arbeitsverzeichnis' aus. Die Schaltfläche 'Übernehmen' hat die Option 'Aktuelle Revision ändern' (klicken Sie auf den Dropdown-Pfeil der Schaltfläche, um sie zu finden ). 

enter image description here

          ||
          ||
          \/

enter image description here

Caveat-Emptor:

Diese zusätzliche Option wird nur aktiviert, wenn die Mercurial-Version mindestens .__ ist. 2.2.0, und wenn die aktuelle Version nicht öffentlich ist, ist es kein Patch und hat keine Kinder. [...] 

Durch Klicken auf die Schaltfläche wird .__ aufgerufen. 'Commit --amend' die Revision überarbeiten '. 

Mehr Infos dazu auf dem THG-Entwickler-Kanal

37

Angenommen, Sie haben Ihre Änderungen noch nicht übernommen, können Sie Folgendes tun.

  • Fügen Sie Ihrer .hgrc hinzu:

    [extensions]
    mq =
    
  • In Ihrem Repository:

    hg qimport -r0:tip
    hg qpop -a
    

    Natürlich müssen Sie nicht mit der Revision 0 beginnen oder alle Patches installieren, denn die letzte Version (hg qpop) reicht aus (siehe unten).

  • entfernen Sie den letzten Eintrag in der Datei .hg/patches/series oder die Patches, die Ihnen nicht gefallen. Nachbestellungen sind ebenfalls möglich.

  • hg qpush -a; hg qfinish -a
  • entfernen Sie die .diff-Dateien (nicht angewendete Patches), die sich noch in .hg/patches befinden (sollte in Ihrem Fall eine sein).

Wenn Sie Ihren Patch nicht möchtenalle zurücknehmen, können Sie ihn mit hg qimport -r0:tip (oder ähnlichem) bearbeiten, dann bearbeiten und hg qrefresh verwenden, um die Änderungen zusammenzuführen in den obersten Patch auf Ihrem Stapel. Lesen Sie hg help qrefresh.

Durch Bearbeiten von .hg/patches/series können Sie sogar mehrere Patches entfernen oder einige neu anordnen. Wenn Ihre letzte Revision 99 ist, können Sie einfach hg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a verwenden.

Natürlich ist dieses Verfahren sehr entmutigt und riskant. Backup erstellen von allem, bevor Sie dies tun!

Als Randnotiz habe ich es zig-mal in privaten Repositories gemacht.

7
hochl

Ich stelle mich ein, was krtek geschrieben hat. Genauer gesagt Lösung 1:

Annahmen:

  • sie haben ein (!) Changeset festgelegt, aber noch nicht verschoben
  • sie möchten dieses Änderungsset ändern (z. B. Dateien hinzufügen, entfernen oder ändern und/oder die Festschreibungsnachricht).

Lösung:

  • verwenden Sie hg rollback, um den letzten Commit rückgängig zu machen
  • mit den neuen Änderungen erneut festlegen

Der Rollback macht den letzten Vorgang wirklich rückgängig. Seine Arbeitsweise ist ziemlich einfach: Normaler Betrieb in HG hängt nur an Dateien an; Dies beinhaltet ein Commit. Mercurial verfolgt die Dateilängen der letzten Transaktion und kann daher einen Schritt vollständig rückgängig machen, indem die Dateien auf ihre alten Längen zurückgeschnitten werden.

7
Lucero

Neuere Versionen von Mercurial enthalten die Erweiterung evolve, die den Befehl hg amend bereitstellt. Dies ermöglicht das Ändern eines Commits, ohne den Verlauf vor dem Ändern in Ihrer Versionskontrolle zu verlieren.

hg ändern [OPTION] ... [DATEI] ...

aliase: Aktualisieren

kombinieren Sie ein Changeset mit Updates und ersetzen Sie es durch ein neues

Commits a new changeset incorporating both the changes to the given files
and all the changes from the current parent changeset into the repository.

See 'hg commit' for details about committing changes.

If you don't specify -m, the parent's message will be reused.

Behind the scenes, Mercurial first commits the update as a regular child
of the current parent. Then it creates a new commit on the parent's
parents with the updated contents. Then it changes the working copy parent
to this new combined changeset. Finally, the old changeset and its update
are hidden from 'hg log' (unless you use --hidden with log).

Unter https://www.Mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve finden Sie eine vollständige Beschreibung der Erweiterung evolve.

0
Karl Bartel

Könnte nicht alle Probleme in der ursprünglichen Frage lösen, aber da dies de facto der Beitrag zu sein scheint, wie Mercurial das vorherige Commit ändern kann, füge ich meine 2-Cent-Informationen hinzu.

Wenn Sie wie ich sind und nur die vorherige Festschreibungsmeldung ändern möchten (Tippfehler beheben usw.), ohne Dateien hinzuzufügen, funktioniert dies

hg commit -X 'glob:**' --amend

Ohne Einschluss- oder Ausschlussmuster schließt hg commit standardmäßig alle Dateien im Arbeitsverzeichnis ein. Durch das Anwenden des Musters -X 'glob:**' werden alle möglichen Dateien ausgeschlossen, sodass nur die Commit-Nachricht geändert werden kann.

Funktionell ist es dasselbe wie git commit --amend, wenn sich keine Dateien in index/stage befinden.

0
kaskelotti