219 votes

Mercurial : Comment faire pour modifier le dernier commit ?

Je suis à la recherche d'un contre-partie de l' git commit --amend dans Mercurial, c'est à dire un moyen de modifier le commit qui ma copie de travail est lié. Les exigences de cette modification de la procédure sont les suivantes:

  • si possible, il ne devrait pas nécessiter d'extensions. Il doit pas exiger des extensions par défaut, c'est à dire des extensions qui ne viennent pas avec un officiel Mercurial installation.

  • si l'engager à modifier est une tête de ma branche, aucune nouvelle de la tête doit être créé. Si la validation n'est pas à la tête, une nouvelle tête peut être créé.

  • la procédure devrait être sûr que si pour quelque raison que ce soit, modifiant échoue, je veux avoir la même copie de travail et d'un dépôt de l'état restauré comme avant la modification. Avec d'autres mots, si la modification elle-même peut échouer, il devrait y avoir un fail-safe procédure de restauration de la copie de travail et d'un dépôt de l'état. Je fais allusion à des "échecs" qui tiennent à la nature de la modification de la procédure (comme par exemple, des conflits), pas de système de fichiers liés à des problèmes (comme les restrictions d'accès, de ne pas être en mesure de verrouiller un fichier pour l'écriture, ...)

Mise à jour (1):

  • la procédure doit être automatisable, de sorte qu'il peut être effectuée par un client graphique sans aucune intervention de l'utilisateur.

Mise à jour (2):

  • les fichiers dans le répertoire de travail ne doit pas être touché (il peut y avoir de système de fichiers verrous sur certains fichiers modifiés). En particulier, cela signifie qu'une approche possible peut à aucun moment besoin d'un répertoire de travail est propre.

296voto

Chris Phillips Points 2923

Avec la version de Mercurial 2.2, vous pouvez utiliser l' --amend option avec hg commit de mettre à jour le dernier commit avec le répertoire de travail courant

À partir de la ligne de commande référence:

L' --amend indicateur peut être utilisé pour modifier le parent du répertoire de travail avec un nouveau commit qui contient les modifications dans le parent en plus de celles déjà signalées par hg état, si il y a de tout. L'ancien commit est stocké dans une sauvegarde de l'ensemble .hg/bande-sauvegarde (voir hg help bundle et hg aider à dégrouper sur la façon de restaurer).

Message, l'utilisateur et la date sont prises à partir de la version modifiée de commettre moins d'indication contraire. Lorsqu'un message n'est pas spécifié sur la ligne de commande, l'éditeur s'ouvre avec le message de la version modifiée de la commettre.

La grande chose est que ce mécanisme est "safe", parce qu'il repose sur le relativement nouveau "Phases" pour éviter des mises à jour qui allait changer l'histoire qui a déjà été mis à disposition en dehors du référentiel local.

55voto

krtek Points 15497

Vous avez 3 options pour modifier engage dans Mercurial :

  1. hg rollback annuler le dernier commit, de sorte que vous pouvez le faire à nouveau. Cela ne fonctionne que sur le dernier commit si il n'était pas poussé vers le serveur distant

  2. À l'aide de la MQ extension, qui est livré avec Mercurial

  3. Même si elle n'est pas livré avec Mercurial, la Histedit extension vaut la peine de mentionner

Vous pouvez également avoir un aperçu de l' Historique des modifications de la page de l'Mercurial wiki.

En bref, l'édition de l'histoire est vraiment dur et découragé. Et si vous avez déjà poussé vos modifications, il n'y a presque rien que vous pouvez faire, sauf si vous avez un contrôle total de tous les autres clones.

Je ne suis pas vraiment familier avec l' git commit --amend de commande, mais autant que je sache, Histedit est ce qui semble être le plus proche de l'approche, mais malheureusement il n'est pas livré avec Mercurial. La MQ est vraiment compliqué à utiliser, mais vous pouvez faire presque n'importe quoi avec elle.

39voto

Cristi Diaconescu Points 7955

GUI équivalent pour hg commit --amend:

Cela fonctionne aussi à partir de TortoiseHG de l'interface graphique GUI (je suis en utilisant v2.5):

Swich à 'Commit' voir ou, dans le workbench, sélectionnez le "répertoire de travail". 'Commit' bouton a une option nommée "Modifier l'actuelle révision" (cliquez sur le bouton de la flèche de la liste déroulante pour le trouver).

enter image description here

          ||
          ||
          \/

enter image description here

Caveat emptor:

Cette option supplémentaire ne sera activée que si l'mercurial version est au moins 2.2.0, et si la révision en cours n'est pas public, n'est pas un patch, et n'a pas de les enfants. [...]

En cliquant sur le bouton d'appel 'commit --amend' à 'modifier' la révision.

Plus d'infos à ce sujet sur le THG dev channel

7voto

hochl Points 5353

En supposant que vous n'avez pas encore propagé vos modifications, voici ce que vous pouvez faire.

  • Ajouter à votre .hgrc:

    [extensions]
    mq =
    
  • Dans votre référentiel:

    hg qimport -r0:tip
    hg qpop -a
    

    Bien sûr, vous n'avez pas besoin de commencer avec la révision de zéro ou de la pop tous les patchs, pour la dernière juste un pop (hg qpop) suffit (voir ci-dessous).

  • supprimer la dernière entrée dans l' .hg/patches/series le fichier, ou les patchs que vous n'aimez pas. Réorganisation est possible aussi.

  • hg qpush -a; hg qfinish -a
  • supprimer l' .diff fichiers (non imputées patchs) encore .hg/patches (devrait être dans votre cas).

Si vous ne voulez pas à reprendre tous de votre patch, vous pouvez la modifier en utilisant hg qimport -r0:tip (ou similaire), puis de modifier des trucs et de les utiliser hg qrefresh de fusionner les modifications dans le premier patch sur votre tapis. Lire hg help qrefresh.

En modifiant .hg/patches/series, vous pouvez même supprimer plusieurs patchs, ou de réorganiser certains. Si votre dernière révision est de 99, vous pouvez simplement utiliser hg 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é. Faire une sauvegarde de tout ce que vous faites avant cette!

Au passage, j'ai fait des millions de fois sur privé uniquement des dépôts.

7voto

Lucero Points 38928

Je suis d'accord dans ce krtek a écrit. Plus précisément solution 1:

Hypothèses:

  • vous avez commis une (!) l'ensemble de modifications, mais n'ont pas poussé encore
  • vous souhaitez modifier cet ensemble de modifications (par exemple, ajouter, supprimer ou modifier des fichiers et/ou le message de commit)

Solution:

  • utiliser hg rollback pour annuler le dernier commit
  • s'engager à nouveau avec les nouveaux changements dans la place

La restauration vraiment annule la dernière opération. Sa façon de travailler est assez simple: les opérations normales de HG ne l'ajout de fichiers; cela inclut un commit. Mercurial garde la trace du fichier longueurs de la dernière transaction et peut donc tout à fait annuler une étape en tronquant les fichiers vers leur ancien longueurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X