Mercurial: comment modifier le dernier commit?

je cherche une contre-partie de git commit --amend dans Mercurial, c'est-à-dire une façon de modifier la propagation à laquelle ma copie de travail est liée. Les prescriptions applicables à cette procédure de modification sont les suivantes:

  • si possible, il ne devrait pas exiger d'extensions. Il doit ne pas exiger des extensions non par défaut , c'est-à-dire des extensions qui ne viennent pas avec une installation Mercuriale officielle.

  • si le s'engager à modifier est une tête de ma branche, pas de nouveaux tête devrait être créée. Si la commit n'est pas head, une nouvelle head peut être créée.

  • la procédure doit être sûre de telle sorte que si, pour quelque raison que ce soit, la modification échoue, je souhaite que la copie de travail et l'état du dépôt soient restaurés comme avant la modification. Avec d'autres mots, si la modification elle-même peut échouer, il devrait y avoir un procédure de sécurité intégrée pour restaurer l'état de la copie de travail et du dépôt. Je fais référence aux" échecs " qui résident dans la nature de la procédure de modification (comme les conflits), pas aux problèmes liés au système de fichiers (comme les restrictions d'accès, ne pas pouvoir verrouiller un fichier pour l'écriture, ...)

mise à Jour (1):

  • la procédure doit être automatique , afin qu'elle puisse être exécuté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 de système de fichiers sur certains fichiers modifiés). Cela signifie en particulier qu'une approche possible ne peut en aucun cas exiger un répertoire de travail propre.
198
demandé sur Gangnus 2011-11-18 17:04:02

6 réponses

avec la sortie de Mercurial 2.2 , vous pouvez utiliser l'option --amend avec hg commit pour mettre à jour la dernière propagation avec le répertoire courant

De la "151970920 de la commande" ligne de référence :

le drapeau --amend peut être utilisé pour modifier le parent du répertoire de travail avec une nouvelle commit qui contient les changements dans le parent en plus de ceux actuellement rapportés par statut hg, s'il y en a. L'ancienne propagation est stockée dans un paquet de sauvegarde.hg/bande-sauvegarde (voir hg help bundle et hg aider à dégrouper sur la façon de restaurer).

Le Message

, l'utilisateur et la date sont tirés de la propagation modifiée, sauf indication contraire. Lorsqu'un message n'est pas spécifié sur la ligne de commande, l'éditeur s'ouvre avec le message de la propagation modifiée.

la grande chose est que ce mécanisme est "sûr", parce qu'il repose sur le fonction "Phases" relativement nouvelle pour empêcher les mises à jour qui changeraient l'histoire déjà disponible à l'extérieur du dépôt local.

272
répondu Chris Phillips 2016-06-29 14:27:16

vous avez 3 options pour éditer commits dans Mercurial:

  1. hg strip --keep --rev -1 annulez le (S) dernier(s) commit (s), ainsi vous pouvez le refaire (voir cette réponse pour plus d'informations).

  2. utilisant le mq extension , qui est expédié avec Mercurial

  3. même s'il n'est pas livré avec Mercurial, le Histedit extension vaut la peine de mentionner

vous pouvez aussi jeter un oeil sur la page Histoire de L'édition du Wiki mercuriel.

en bref, l'histoire de l'édition est vraiment difficile et découragé . Et si vous avez déjà poussé vos changements, il n'y a à peine rien que vous puissiez faire, sauf si vous avez le contrôle total de tous les autres clones.

Je ne suis pas vraiment familier avec la commande git commit --amend , mais AFAIK, Histedit est ce qui semble être l'approche la plus proche, mais malheureusement il n'est pas livré avec Mercurial. MQ est vraiment compliqué à utiliser, mais vous pouvez faire presque tout avec elle.

50
répondu krtek 2018-02-22 10:09:40

équivalent GUI pour hg commit --amend :

cela fonctionne aussi à partir de GUI de TortoiseHG (j'utilise v2.5):

Swich à la vue' Commit 'ou, dans la vue workbench, sélectionnez l'entrée' working directory'. Le bouton' Commit 'a une option appelée' modifier la révision en cours ' (cliquez sur la flèche pour la trouver).

enter image description here

          ||
          ||
          \/

enter image description here

Caveat emptor :

cette option supplémentaire ne sera activée que si la version mercurial est au minimum 2.2.0, et si la révision actuelle n'est pas publique, n'est pas un patch et n'a pas enfant. [...]

en cliquant sur le bouton Appeler 'commit --amend' à 'modifier' la révision.

plus d'informations sur ce sur le THG dev channel

36
répondu Cristi Diaconescu 2013-01-04 11:04:08

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

  • ajouter à votre .hgrc:

    [extensions]
    mq =
    
  • dans votre dépôt:

    hg qimport -r0:tip
    hg qpop -a
    

    bien sûr, il n'est pas nécessaire de commencer par la révision zéro ou pop tous les patches, pour le dernier pop ( hg qpop ) suffit (voir ci-dessous).

  • supprimez la dernière entrée du fichier .hg/patches/series , ou les correctifs que vous n'aimez pas. La réorganisation est également possible.

  • hg qpush -a; hg qfinish -a
  • supprime les fichiers .diff (correctifs non appliqués) toujours présents .hg/patches (devrait être dans votre cas).

Si vous ne veulent pas à reprendre tous les de votre patch, vous pouvez le modifier à l'aide de hg qimport -r0:tip (ou similaire), ensuite, éditez stuff et utilisez hg qrefresh pour fusionner les modifications dans le patch le plus élevé de votre pile. Lire hg help qrefresh .

en éditant .hg/patches/series , vous pouvez même supprimer plusieurs patches, ou en commander de nouveaux. Si votre dernière révision est 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écouragée et risquée . Faire une sauvegarde de tout avant de le faire!

comme sidenote, Je l'ai fait des millions de fois dans des dépôts privés.

8
répondu hochl 2011-11-18 14:15:31

Je m'accorde sur ce que krtek a écrit. Plus spécifiquement solution 1:

suppositions:

  • vous avez commis une (!) changeset mais ne l'ont pas encore poussé
  • vous voulez modifier ce jeu de modifications (par exemple ajouter, supprimer ou modifier des fichiers et/ou le message de propagation)

Solution:

  • utilisation hg rollback pour annuler le dernier commit
  • s'engager de nouveau avec les nouveaux changements, en place

La restauration vraiment annule la dernière opération. Sa façon de travailler est très simple: les opérations normales dans HG ne s'ajouteront qu'aux fichiers, ce qui inclut un commit. Mercurial garde trace des longueurs de fichier de la dernière transaction et peut donc défaire complètement une étape en tronquant les fichiers à leurs anciennes longueurs.

6
répondu Lucero 2011-11-18 13:47:33

les versions récentes de Mercurial comprennent l'extension evolve qui fournit la commande hg amend . Cela permet de modifier une propagation sans perdre l'historique des pré-modifications dans votre contrôle de version.

hg modifier [OPTION]... [FICHIER.]..

alias: refresh

combiner un ensemble de modifications avec des mises à jour et le remplacer par un nouveau

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).

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'extension evolve .

0
répondu Karl Bartel 2018-03-06 12:12:42