Mercurial: comment défaire le dernier commit?

j'ai accidentellement fait un commit dans mon dépôt local. Pour être plus précis, j'ai engagé des changements dans de nombreux fichiers à la fois, alors que je voulais les propager un à la fois.

Comment puis-je annuler ce commit et obtenir ma copie de travail retour à l'état où il était avant la livraison afin que je puisse faire ce que j'aurais fait en premier lieu?

je n'ai pas poussé ou tiré, ou quoi que ce soit d'autre depuis le commettre.


vous pouvez soupçonner qu'il s'agit d'un double, donc je vais expliquer pourquoi les questions suivantes sont différentes, ou ne pas répondre à ma question:

Mercurial annuler le dernier commit

une réponse à celle-ci indique que vous pouvez faire cela avec hg commit --amend , mais n'explique pas comment ou donner un exemple de faire cela. L'aide mercurail ne me l'épelle pas non plus.

Comment faites-vous pour" reculer " le dernier coming sur Mercurial?

indique d'utiliser hg rollback . Cette commande est apparemment dépréciée, j'ai essayé de l'utiliser de toute façon, mais j'ai eu le message: aucune information de retour disponible . Une honte que cela ne fonctionne pas car ce serait une façon très intuitive d'atteindre ce que je veux.

24
demandé sur DaveInCaz 2015-07-04 20:58:31

4 réponses

basé sur des informations de cette question :

hg strip --keep --rev .

--keep: do not modify working directory during strip

--rev . (le point indique le dernier commit. lire sid0 de réponse concernant descendants)


pour les personnes plus familiarisées avec la langue gitane, vous recherchez git reset --mixed HEAD^

hard qui rejetterait vos modifications, de faire votre travail de "disparaître" (je suppose que ce n'est pas une option)

soft annulerait la propagation, mais maintiendrait les fichiers déjà engagés indexés (c'est-à-dire suivis)

mixed garde vos fichiers modifiés en place, mais dit à l'index de défaire la propagation. en langue gitane: git st dirait Changes not staged for commit


Voir aussi git-reset docs , Différence git reset soft/mixte , git/hg Commande d'équivalence de la table

31
répondu maosmurf 2018-07-18 18:15:17

Ok, je pense que j'ai trouvé la réponse, c'est pour activer l'extension strip , et utiliser la commande suivante:

hg strip -r -1 --keep

ceci supprime la dernière révision de la repotiory (le bit -r -1 ), et l'option --keep signifie qu'aucune modification n'est apportée à la copie de travail. Ainsi, vous finissez avec une copie de travail exactement comme elle était juste avant la propagation, et pas de dernière propagation dans le dépôt.

Je ne suis pas un expert en mercure, alors utilisez à votre propres risques.

22
répondu crobar 2015-07-04 19:17:11

ce que je ferais dans cette situation est de faire une nouvelle branche qui a les changements que je veux avant que je n'ai jamais pensé à enlever le mauvais changement-ensemble. Dans ce cas, je vais devoir revenir à la révision avant de faire le mauvais commit, refaire mes modifications et ensuite faire plusieurs commits, un pour chaque fichier.

étape par étape:

1) Revenir avant le mauvais commit.

% cd <top of repo>
% hg log -l 5
<identify the last good revision>
% hg update -r <last good revision number>

2) Refaire les modifications: j'aimerais obtenir un patch qui décrit les changements que je veux, et de l'appliquer à l'arbre. (Je suppose que tip indique actuellement où nous avons commencé)

% hg diff -r .:tip | patch -p1
patching file a/b/c/d
patching file a/b/e/f

3) Faire de nouveaux commits: Nous sommes maintenant de retour à l'état avant vous engager voulu se séparer. Faire hg status et regardez les fichiers modifiés, assurez-vous que tout est comme vous le souhaitez. À ce moment, vous pouvez soit propager les fichiers un par un en les nommant sur la ligne de commande, ou utiliser une extension comme record ou crecord pour sélectionner de manière interactive.

% hg commit a/b/c/d
% hg commit a/b/e/f

...ou...

% hg crecord
<select files in UI>
% hg crecord
<select files in UI>

vous finirez avec une pension qui ressemble à ceci:

o----o----B
      \
       \
        --o----o----o----T

où B est le vieux Bad commit, et T la nouvelle pointe de la pension. Si vous voulez que cette branche soit fermée, pour qu'elle n'apparaisse pas dans logs / etc, vous pouvez...

% hg update -r <revision B>
% hg commit --close_branch
% hg update -r tip

si vous voulez l'enlever complètement, vous pouvez l'enlever.

% hg strip -r <revision B>

quoi qu'il en soit, votre journal ressemblera à rien.

1
répondu Paul S 2015-07-10 13:48:21

commenter et développer sur le post de @crobar cause # de personnages n'est pas suffisant.

lors d'une propagation locale (no push) puis hg strip -r -1 --keep , il supprime votre propagation précédente et préserve votre liste de fichiers en attente d'être commmittés. fondamentalement, c'est un plein d'annuler. si j'utilise hg stripe -r -1 sans le --keep , il supprime toujours votre commit précédent, mais quand j'essaye de lister les fichiers à être engagés il ne peut pas trouver de changement donc je ne recommande pas de faire cela.

si je fais une commit puis une push (à distance) puis faire hg strip -r -1 --keep , il fait exactement ce qu'il est censé faire mais quand vous faites une autre commit puis push, il crée une autre branche.

I.E. 

o----o----Branch(local)
      \
       \
        --o----o----o----Branch(with previous push)

ma source/ référence: tester ces scénarios

0
répondu Denise Michelle del Bando 2017-05-26 15:08:41