Comment abandonner une fusion hg?

131

Je suis nouveau dans la collaboration avec Mercurial. Ma situation:

  • Un autre programmeur a changé la version 1 d'un fichier pour remplacer les retraits de 4 espaces par un retrait de 2 espaces. (Ie a changé chaque ligne.) Appelez cela rev 2, poussé vers le repo distant.
  • J'ai commis des changements de fond rev 1 avec divers changements de code dans mon espace de travail local. Appelez ça rev 3.
  • J'ai hg pulled et hg merged sans une idée claire de ce qui se passait.
  • Les conflits sont innombrables et pas vraiment substantiels.

Je souhaite donc vraiment avoir changé mon dépôt local en retraits de 2 espaces avant de fusionner; alors la fusion sera triviale (je suppose). Mais je n'arrive pas à reculer. Je pense que j'en ai besoin hg update -r 3mais ça le dit abort: outstanding uncommitted merges.

Comment puis-je annuler la fusion, modifier l'espacement dans mon dépôt local et refondre?

Grumdrig
la source

Réponses:

127

Vous pouvez annuler les modifications non validées avec l'indicateur -C (ou --clean):

hg update -C -r 3

ATTENTION: tout ce qui n'a pas été commis sera parti!

Après cela, vous devriez probablement utiliser une sorte d'outil de formatage de code pour effectuer toute l'opération, ou au moins une recherche et un remplacement par des expressions régulières. Quelque chose d'aussi simple que de remplacer ce qui correspond ^____(utilisez 4 espaces au lieu de traits de soulignement) par __(2 espaces), répété plusieurs fois (à moins que vous n'ayez un code imbriqué insensé) devrait fonctionner.

R. Martinho Fernandes
la source
Oh merci. Vous devez avoir répondu correctement quand je l'ai compris moi-même. Je suis dans emacs, tout M-x indent-regioncomme le tour de réindentation.
Grumdrig
6
Il convient de noter que les fichiers non suivis ne seront pas supprimés.
djsutho
132

BTW: si vous inversez simplement la fusion que vous avez faite et que 3 n'est pas votre numéro de révision, vous pouvez le faire:

hg update -C -r .
math
la source
24
Pour quelqu'un comme moi qui au début n'a pas compris comment cela fonctionne: le point .est un raccourci vers la révision précédente.
Jeroen Wiert Pluimers
1
très bonne réponse! devrait être meilleur
Oleg Abrazhaev
1
@Thymine: D'après ce hg help updateque j'obtiens: si aucun jeu de modifications n'est spécifié, mettez à jour la pointe de la branche nommée actuelle ... et la pointe peut ne pas toujours être votre révision actuelle sur laquelle vous travaillez. Je ne l'ai pas testé, pour l'instant ..
math
1
Ah c'est un bon détail à savoir ... en fait, je vais supprimer mon commentaire en prétendant que le départ -r .est le même
Thymine
Simple et très utile.
Naveen Kumar V le
33

Pour annuler une fusion non validée, utilisez

hg update --clean

qui va extraire une copie propre du parent de fusion d'origine, perdant toutes les modifications.

Tao
la source
2

J'avais apparemment juste besoin de le faire hg update -C -r 3, ce qui écrase mes fichiers locaux avec la révision à l'esprit (ce que je pensais hg updatefaire; mais j'avais tort.) Merci pour mon aide!

Grumdrig
la source
2
L'ajout de -Cou --cleanest la façon dont vous dites à Mercurial de continuer, même s'il rejettera certains fichiers modifiés. Vous avez raison, cela vous hg update -r Xmènera normalement à la révision X, mais lorsque vous êtes dans une fusion, vous devez insister un peu plus :-)
Martin Geisler
7
Je pense que "hg revert --all --cancelmerge" serait beaucoup plus intuitif.
Warren P