Je recherche une contrepartie git commit --amend
dans Mercurial, c'est-à-dire un moyen de modifier le commit auquel ma copie de travail est liée. Je ne suis intéressé que par le dernier commit, pas par un commit antérieur arbitraire.
Les exigences de cette procédure de modification sont les suivantes:
si possible, il ne devrait nécessiter aucune extension. Il ne doit pas nécessiter d'extensions autres que celles par défaut , c'est-à-dire des extensions qui ne sont pas fournies avec une installation Mercurial officielle.
si l'engagement de modification est un responsable de ma branche actuelle, aucun nouveau responsable ne doit être créé. Si le commit n'est pas head, un nouveau head peut être créé.
la procédure doit être sécurisée de telle sorte que si, pour une raison quelconque, la modification échoue, je souhaite que le même état de copie de travail et de référentiel soit restauré qu'avant la modification. En d'autres termes, si la modification elle-même peut échouer, il devrait y avoir une procédure de sécurité intégrée pour restaurer l'état de la copie de travail et du référentiel. Je fais référence aux "échecs" qui relèvent de la nature de la procédure de modification (comme par exemple les conflits), pas aux problèmes liés au système de fichiers (comme les restrictions d'accès, le fait de ne pas pouvoir verrouiller un fichier pour l'écriture, ... )
Mise à jour (1):
- la procédure doit être automatisable , afin qu'elle puisse être effectuée par un client GUI sans aucune interaction utilisateur requise.
Mise à jour (2):
- les fichiers du répertoire de travail ne doivent pas être touchés (il peut y avoir des verrous du système de fichiers sur certains fichiers modifiés). Cela signifie notamment qu'une approche possible ne peut à aucun moment nécessiter un répertoire de travail propre.
Vous avez 3 options pour modifier les validations dans Mercurial:
hg strip --keep --rev -1
annulez le (s) dernier (s) commit (s), vous pouvez donc recommencer (voir cette réponse pour plus d'informations).Utilisation de l' extension MQ , fournie avec Mercurial
Même si elle n'est pas livrée avec Mercurial, l' extension Histedit mérite d'être mentionnée
Vous pouvez également consulter la page Historique de modification du wiki Mercurial.
En bref, l'édition de l'historique est vraiment difficile et découragée . Et si vous avez déjà poussé vos modifications, vous ne pouvez presque rien faire, sauf si vous avez le contrôle total de tous les autres clones.
Je ne connais pas vraiment la
git commit --amend
commande, mais AFAIK, Histedit est ce qui semble être l'approche la plus proche, mais malheureusement, elle n'est pas livrée avec Mercurial. MQ est vraiment compliqué à utiliser, mais vous pouvez presque tout faire avec.la source
hg revert myfile
pour annuler la suppression. Peut-être ré-ajouter avechg add
le fichier après lerollback
fonctionne également.Équivalent GUI pour
hg commit --amend
:Cela fonctionne également à partir de l'interface graphique de TortoiseHG (j'utilise la v2.5):
Passez à la vue «Valider» ou, dans la vue du plan de travail, sélectionnez l'entrée «Répertoire de travail». Le bouton «Valider» a une option nommée «Modifier la révision actuelle» (cliquez sur la flèche déroulante du bouton pour la trouver).
Caveat emptor :
Plus d'informations à ce sujet sur la chaîne de développement THG
la source
Je suis à l'écoute de ce que krtek a écrit. Plus spécifiquement, solution 1:
Hypothèses:
Solution:
hg rollback
pour annuler le dernier commitLa restauration annule vraiment la dernière opération. Sa façon de travailler est assez simple: les opérations normales dans HG ne s'ajouteront qu'aux fichiers; cela inclut un commit. Mercurial garde une trace de la longueur des fichiers de la dernière transaction et peut donc annuler complètement une étape en tronquant les fichiers à leur ancienne longueur.
la source
En supposant que vous n'avez pas encore propagé vos modifications, voici ce que vous pouvez faire.
Ajoutez à votre .hgrc:
Dans votre référentiel:
Bien sûr, vous n'avez pas besoin de commencer par la révision zéro ou de supprimer tous les correctifs, car la dernière seule pop (
hg qpop
) suffit (voir ci-dessous).supprimez la dernière entrée du
.hg/patches/series
fichier ou les correctifs que vous n'aimez pas. La réorganisation est également possible.hg qpush -a; hg qfinish -a
.diff
fichiers (correctifs non appliqués) toujours dans .hg / correctifs (devrait être l'un dans votre cas).Si vous ne voulez pas reprendre tout votre patch, vous pouvez le modifier en utilisant
hg qimport -r0:tip
(ou similaire), puis éditer des trucs et utiliserhg qrefresh
pour fusionner les modifications dans le patch le plus haut de votre pile. Lisezhg help qrefresh
.En éditant
.hg/patches/series
, vous pouvez même supprimer plusieurs correctifs ou en réorganiser certains. Si votre dernière révision est 99, vous pouvez simplement utiliserhg qimport -r98:tip; hg qpop; [edit series file]; hg qpush -a; hg qfinish -a
.Bien sûr, cette procédure est fortement déconseillée et risquée . Faites une sauvegarde de tout avant de faire cela!
En tant que sidenote, je l'ai fait des millions de fois sur des référentiels privés uniquement.
la source
hg qfold
, btwhg import -r<prev>:tip
. Un pitoyable il n'y a pas de raccourci pour la version précédente, comme dans subversion.Les versions récentes de Mercurial incluent l'
evolve
extension qui fournit lahg amend
commande. Cela permet de modifier un commit sans perdre l'historique de pré-modification dans votre contrôle de version.Voir https://www.mercurial-scm.org/doc/evolution/user-guide.html#example-3-amend-a-changeset-with-evolve pour une description complète de l'
evolve
extension.la source
Cela ne résoudra peut-être pas tous les problèmes de la question d'origine, mais comme cela semble être le post de facto sur la façon dont mercurial peut modifier le commit précédent, j'ajouterai mes 2 cents d'informations.
Si vous êtes comme moi et que vous souhaitez uniquement modifier le message de validation précédent (corriger une faute de frappe, etc.) sans ajouter de fichiers, cela fonctionnera
Sans aucun motif d'inclusion ou d'exclusion
hg commit
, tous les fichiers du répertoire de travail seront inclus par défaut. L'application d'un modèle-X 'glob:**'
exclura tous les fichiers possibles, ne permettant que de modifier le message de validation.Fonctionnellement, c'est la même chose que
git commit --amend
lorsqu'il n'y a pas de fichiers dans l'index / l'étape.la source
Une autre solution pourrait être d'utiliser la
uncommit
commande pour exclure un fichier spécifique de la validation en cours.hg uncommit [file/directory]
Ceci est très utile lorsque vous souhaitez conserver la validation actuelle et désélectionner certains fichiers de la validation (particulièrement utile pour
files/directories
avoir été supprimé).la source