J'ai une paire de commits qui ne devraient vraiment en être qu'un. Si j'utilisais git, j'utiliserais:
git rebase -i <some-commit-before>
puis écrasez-les.
Puis-je faire ça dans Mercurial? Si c'est le cas, comment?
Oui, vous pouvez le faire en utilisant mercurial sans aucune extension en concaténant les ensembles de modifications .
Alternativement, si vous souhaitez utiliser une extension, vous pouvez utiliser:
Mon préféré est la
hg strip --keep
commande. Et puis je valide tous les changements en un seul commit.C'est le moyen le plus rapide et le plus confortable pour moi, car j'aime faire de nombreux petits engagements au cours de mon travail quotidien;)
Remarque 1:
strip
nécessite une extension intégréemq
pour être activée.Remarque 2: Mon client Git / Mercurial préféré (SmartGit / Hg) ajoute par défaut un
--keep
paramètre pendantstrip
. Et ce qui est encore plus pratique: il propose une option appeléejoin commits
:]la source
hg strip --keep --rev [rev]
Oùrev
est le numéro de révision du premier commit que vous voulez écraser avec le dernier--rev
est facultatif, la commande complète esthg strip --keep [rev]
hg help strip
donnehg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
, et omettre la révision me donneabort: empty revision set
.hg strip
n'est pas la meilleure idée. Ce n'est pas vraiment sûr. Essayezhg histedit
, peut-être même essayez d'utiliser l'extension evolve.L' extension Rebase a fonctionné comme un charme. Pour écraser 2 commits:
Le point est un raccourci pour la révision actuelle.
C'est encore plus facile lorsque vous avez quelques commits sur une branche et que vous souhaitez les réduire en un seul:
Comment ça marche:
(à partir de http://mercurial-scm.org/wiki/RebaseExtension#Collapsing )
la source
evolve
est une extension de mercurial qui nous aide à avoir une histoire mutable sûre, mais elle est encore expérimentale. Vous pouvez l'utiliser en le clonant à partir de son dépôt et en l'ajoutant dans votre .hgrc comme ceci.En supposant que vous avez cloné le dépôt évolutif dans votre répertoire personnel. Maintenant, vous êtes prêt à partir. Vous pouvez également rechercher de l'aide par
hg help fold
.Commande de pliage
Vous dites
fold
d'écraser / plier une chaîne linéaire de commits qui n'est pas interrompue. Ce que fait fold, c'est qu'il crée un nouvel ensemble de modifications qui contient les modifications de tous les ensembles de modifications et marque toutes ces validations comme obsolètes. Vous pouvez avoir une vue plus approfondie de cela dans docs .Supposons maintenant que vous ayez l'historique suivant.
Vous voulez écraser
e
,f
etg
. Tu peux faireLe résultat sera
où
h
est l'ensemble de modifications contenant les modifications des trois validationse
,f
etg
.Vous pouvez également plier les changesets à partir du milieu de l'historique, c'est-à-dire que vous ne devez pas nécessairement choisir une chaîne qui inclut la pointe. Supposons que vous vouliez plier
b
,c
etd
. Tu peux faireCela entraînera
où
i
est pliée de l' ensemble de modificationsb
,c
,d
etj
est le même que ChangeSeth
. Le guide de l'utilisateur Evolve est une lecture incontournable.la source
--keep
option de rebase couvre cela (suivi en marquant les révisions comme secrètes, ou en utilisant une bande dessus une fois que vous avez vérifié le résultat). Même déplacer des révisions entre d'autres révisions est possible avec une séquence de deux commandes de rebase.Avec Mercurial 4.8 (novembre 2018, 9 ans plus tard), vous pouviez envisager la nouvelle commande
hg absorb
(c'était une fonctionnalité expérimentale auparavant ).Voir " Absorption des changements de validation dans Mercurial 4.8 "
la source
Je pense que
chistedit
(intégré depuis Mercurial 2.3) est le plus proche derebase -i
celui qui est purement Mercurial (chistedit
est la version interactive dehistedit
). Une fois dans histedit, lafold
commande correspond aux rebasessquash
et lesroll
commandes aux rebasesfixup
. Consultez la documentation histedit pour plus d'informations.Voici un exemple simple. Supposons que vous ayez les éléments suivants et que vous souhaitiez déplacer toutes les modifications de 1e21c4b1 dans la révision précédente tout en conservant le message de la révision précédente.
Vous pouvez exécuter
hg chistedit -r b4a738a4
pour modifier l'historique vers b4a738a4. Dans chistedit, vous passez ensuite le curseur sur 1e21c4b1 et appuyez surr
pour indiquer que vous souhaitez lancer cette révision. Notez que l'ordre dans histedit (du plus ancien au plus récent) est inversé dehg log
(du plus récent au plus ancien).Après avoir choisi vos modifications, vous choisissez
c
de les valider. Le résultat est le suivant:@ bfa4a3be drees pointe | Un engagement o 788aa028 drees | Trucs plus anciens
Si vous êtes relativement nouveau pour eux, alors
histedit
peut être un meilleur choix quechistedit
parce qu'il fournit les descriptions de commande dans le fichier histedit pour référence. Il faut juste un peu plus d'édition pour définir les commandes en utilisant l'édition de texte normale (tout comme le rebase normal).Remarque, pour utiliser l'un
histedit
ou l' autre ouchistedit
vous devez ajouterhistedit
à vos extensions dans votre ~ / .hgrc:J'ai suggéré
chistedit
car il est le plus procherebase -i
et fonctionne n'importe où dans l'histoire. Si vous voulez vraiment simplement subsumer / modifier la révision actuelle dans la précédente, alors @G. Lastrip
suggestion de Demecki peut être bonne car ce qui se passe est clair. Il est intégré depuis Mercuria 2.8. Pour obtenir les résultats équivalents ci-dessus, vous pouvez effectuer les opérations suivantes:Remarque
strip
, comme histedit, doit être activé dans votre ~ / .hgrc:la source
Supposons que vous vouliez écraser (unir) les 2 derniers commits.
Trouver un numéro de révision
sortie possible:
Branche de réinitialisation logicielle
Valider à nouveau les modifications
Remarques
strip
nécessite une extension intégrée pour être activée. Créez / modifiez le~/.hgrc
fichier de configuration avec le contenu suivant:la source
J'utilise:
la source