Ich suche nach einem Gegenstück zu git commit --amend
Mercurial, dh nach einer Möglichkeit, das Commit zu ändern, mit dem meine Arbeitskopie verknüpft ist. Ich interessiere mich nur für das letzte Commit, nicht für ein willkürliches früheres Commit.
Die Anforderungen für dieses Änderungsverfahren sind:
Wenn möglich, sollten keine Erweiterungen erforderlich sein. Es dürfen keine nicht standardmäßigen Erweiterungen erforderlich sein , dh Erweiterungen, die nicht mit einer offiziellen Mercurial-Installation geliefert werden.
Wenn die Änderungsverpflichtung ein Leiter meiner aktuellen Niederlassung ist, sollte kein neuer Leiter erstellt werden. Wenn das Commit kein Kopf ist, kann ein neuer Kopf erstellt werden.
Das Verfahren sollte so sicher sein , dass ich, wenn die Änderung aus irgendeinem Grund fehlschlägt, die gleiche Arbeitskopie und den gleichen Repository-Status wie vor der Änderung wiederherstellen möchte. Mit anderen Worten, wenn die Änderung selbst fehlschlagen kann, sollte es eine ausfallsichere Prozedur geben, um die Arbeitskopie und den Repository-Status wiederherzustellen. Ich beziehe mich auf "Fehler", die in der Art des Änderungsverfahrens liegen (wie z. B. Konflikte), nicht auf Probleme im Zusammenhang mit dem Dateisystem (wie Zugriffsbeschränkungen, das Nicht-Sperren einer Datei zum Schreiben, ... )
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 (möglicherweise gibt es Dateisystemsperren für bestimmte geänderte Dateien). Dies bedeutet insbesondere, dass ein möglicher Ansatz zu keinem Zeitpunkt ein sauberes Arbeitsverzeichnis erfordern kann.
quelle
Sie haben 3 Möglichkeiten, Commits in Mercurial zu bearbeiten:
hg strip --keep --rev -1
Machen Sie die letzten (1) Commits rückgängig, damit Sie sie erneut ausführen können ( weitere Informationen finden Sie in dieser Antwort ).Verwendung der MQ-Erweiterung , die im Lieferumfang von Mercurial enthalten ist
Auch wenn es nicht mit Mercurial geliefert wird , ist die Histedit- Erweiterung erwähnenswert
Sie können auch einen Blick auf die Seite Bearbeitungsverlauf des Mercurial-Wikis werfen .
Kurz gesagt, die Bearbeitung des Verlaufs ist sehr schwierig und entmutigend . Und wenn Sie Ihre Änderungen bereits vorgenommen 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 der naheliegendste Ansatz zu sein, aber leider wird er nicht mit Mercurial ausgeliefert. Die Verwendung von MQ ist sehr kompliziert, aber Sie können fast alles damit machen.quelle
hg revert myfile
das Löschen rückgängig machen. Möglicherweise wirdhg add
die Datei erneut hinzugefügt, nachdem diesrollback
ebenfalls funktioniert hat.GUI-Äquivalent für
hg commit --amend
:Dies funktioniert auch über die GUI von TortoiseHG (ich verwende v2.5):
Wechseln Sie in die Ansicht "Commit" oder wählen Sie in der Workbench-Ansicht den Eintrag "Arbeitsverzeichnis". Die Schaltfläche "Festschreiben" enthält die Option "Aktuelle Version ändern" (klicken Sie auf den Dropdown-Pfeil der Schaltfläche, um sie zu finden).
Vorbehalt :
Weitere Infos dazu auf dem THG Dev Channel
quelle
Ich stimme auf das ein, was krtek geschrieben hat. Genauer gesagt Lösung 1:
Annahmen:
Lösung:
hg rollback
diese Option, um das letzte Commit rückgängig zu machenDer Rollback macht den letzten Vorgang wirklich rückgängig. Die Arbeitsweise ist recht einfach: Bei normalen Vorgängen in HG werden nur Dateien angehängt. 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.
quelle
Angenommen, Sie haben Ihre Änderungen noch nicht weitergegeben, können Sie Folgendes tun.
Fügen Sie Ihrer .hgrc hinzu:
In Ihrem Repository:
Natürlich müssen Sie nicht mit Revision Null beginnen oder alle Patches platzen lassen, denn für das letzte
hg qpop
genügt nur ein Pop ( ) (siehe unten).Entfernen Sie den letzten Eintrag in der
.hg/patches/series
Datei oder die Patches, die Sie nicht mögen. Nachbestellungen sind ebenfalls möglich.hg qpush -a; hg qfinish -a
.diff
Dateien (nicht angewendete Patches), die sich noch in .hg / patches befinden (sollte in Ihrem Fall eine sein).Wenn Sie nicht wollen , um alle zurücknehmen Ihren Patch, können Sie es durch die Verwendung bearbeiten
hg qimport -r0:tip
(oder ähnlich), dann bearbeiten Sachen und Verwendunghg qrefresh
die Änderungen in die oberste Patch auf Ihrem Stapel zu verschmelzen. Lesen Siehg help qrefresh
.Durch Bearbeiten
.hg/patches/series
können Sie sogar mehrere Patches entfernen oder einige neu anordnen. Wenn Ihre letzte Revision 99 ist, können Sie nur verwendenhg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Natürlich ist dieses Verfahren sehr entmutigt und riskant . Machen Sie eine Sicherungskopie von allem, bevor Sie dies tun!
Als Nebenbemerkung habe ich es zig Mal in privaten Repositories gemacht.
quelle
hg qfold
btwhg import -r<prev>:tip
. Schade, dass es für die vorherige Version keine Abkürzung gibt, wie bei Subversion.Neuere Versionen von Mercurial enthalten die
evolve
Erweiterung, die denhg amend
Befehl bereitstellt . Auf diese Weise können Sie ein Commit ändern, ohne den Verlauf der Vorabänderung in Ihrer Versionskontrolle zu verlieren.Eine vollständige Beschreibung der Erweiterung finden Sie unter https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve
evolve
.quelle
Könnte nicht alle Probleme in der ursprünglichen Frage lösen, aber da dies der De-facto-Beitrag darüber zu sein scheint, wie Quecksilber das vorherige Commit ändern kann, werde ich meine Informationen im Wert von 2 Cent hinzufügen.
Wenn Sie wie ich sind und nur die vorherige Festschreibungsnachricht ändern möchten (Tippfehler beheben usw.), ohne Dateien hinzuzufügen, funktioniert dies
Ohne Einschluss- oder Ausschlussmuster
hg commit
werden standardmäßig alle Dateien im Arbeitsverzeichnis eingeschlossen. Durch das Anwenden eines Musters-X 'glob:**'
werden alle möglichen Dateien ausgeschlossen, sodass nur die Festschreibungsnachricht geändert werden kann.Funktionell ist es dasselbe, als
git commit --amend
ob sich keine Dateien in Index / Stage befinden.quelle
Eine andere Lösung könnte darin bestehen, mit dem
uncommit
Befehl eine bestimmte Datei vom aktuellen Commit auszuschließen.hg uncommit [file/directory]
Dies ist sehr hilfreich, wenn Sie das aktuelle Commit beibehalten und einige Dateien vom Commit abwählen möchten (besonders hilfreich,
files/directories
wenn sie gelöscht wurden).quelle