227 votes

Existe-t-il un moyen de supprimer les commits locaux dans Mercurial ?

Je continue donc à faire une erreur stupide dans Mercurial. Souvent, je commence à travailler sans faire de "hg pull" et de "hg update". Quand j'essaie de pousser mes changements, j'obtiens une erreur.

Existe-t-il un moyen de supprimer mon Commits locaux afin d'éviter de créer plusieurs têtes, branches, etc. Je veux juste supprimer mes commits locaux, fusionner mes changements avec l'astuce, puis re-commiter. Cela semble simple, n'est-ce pas ? Je n'arrive pas à trouver un moyen d'effacer facilement les commits locaux. Commits locaux afin de pouvoir fusionner proprement avec la pointe.

Encore une fois, j'essaie seulement d'effacer les commits locaux faits avec "hg ci". Je ne veux pas modifier les fichiers, revenir en arrière, etc.

0 votes

15 votes

Il ne s'agit pas d'une erreur stupide, mais d'un flux de travail normal lorsque plusieurs personnes travaillent simultanément sur le même référentiel.

265voto

Samaursa Points 4696

Activer la fonction " bande "et tapez ce qui suit :

hg strip #changeset# --keep

#changeset# est le hachage du jeu de modifications à supprimer. Cela supprimera le jeu de modifications en question y compris les ensembles de modifications qui en découlent et laissera votre répertoire de travail intact . Si vous souhaitez également annuler les modifications apportées à votre code, supprimez l'option --keep option.

Pour plus d'informations, consultez le site Extension de la bande .

Si vous obtenez le message "unkown command 'strip'", il se peut que vous deviez l'activer. Pour ce faire, trouvez le fichier .hgrc o Mercurial.ini et y ajouter ce qui suit :

[extensions]
strip =

Notez que (comme Juozas l'a mentionné dans son commentaire) avoir plusieurs têtes est un flux de travail normal dans Mercurial. Vous ne devez pas utiliser la commande strip pour lutter contre cela. Au lieu de cela, vous devriez fusionner votre tête avec la tête entrante, résoudre les conflits éventuels, tester, puis pousser.

En strip est utile lorsque vous voulez vraiment vous débarrasser des changesets qui polluent la branche. En fait, si vous êtes dans cette question et vous souhaitez supprimer complètement tous les ensembles de modifications "projet". de façon permanente, consultez la meilleure réponse qui suggère essentiellement de faire :

hg strip 'roots(outgoing())'

8 votes

@Bharath : Vous devez activer l'extension

1 votes

Depuis mercurial 2.8, le strip est une extension autonome, il suffit donc de strip = est très bien. Nouveautés pour Mercurial 2.8

23voto

Tom Leys Points 10453

Réponse moderne (seulement pertinente après Mercurial 2.1) :

Utilisation Phases et marquez la ou les révisions que vous ne souhaitez pas partager comme étant secrètes (privées). Ainsi, lorsque vous pousserez, elles ne seront pas envoyées.

Dans TortoiseHG, vous pouvez faire un clic droit sur un commit pour changer sa phase.

En outre : Vous pouvez également utiliser l'extension "rebase" pour déplacer vos commits locaux vers la tête du dépôt partagé après avoir tiré.

0 votes

Privé == secret maintenant

17voto

Ry4an Points 56453

Comme tout le monde l'a souligné, vous devriez probablement tirer et ensuite fusionner les têtes, mais si vous voulez vraiment vous débarrasser de vos commits sans aucun des éléments suivants EditionHistoire vous pouvez alors vous contenter de hg clone -r votre dépôt pour récupérer tous les changements sauf ceux-là.

Cela ne les supprime pas du référentiel original, mais crée un nouveau clone qui ne les contient pas. Vous pouvez ensuite supprimer le dépôt que vous avez modifié (si vous le souhaitez).

0 votes

Est-ce que "hg clone -r" supprime les modifications locales ? Je veux juste supprimer les commits locaux pour garder les choses simples.

4 votes

Il ne les supprime pas du référentiel cloné, mais il crée un nouveau clone qui ne les contient pas. Vous pouvez ensuite supprimer le dépôt que vous avez modifié si vous le souhaitez.

10voto

too much php Points 27983

Vous pouvez contourner ce problème encore plus facilement grâce à la fonction Rebase extension il suffit d'utiliser hg pull --rebase et vos commits sont automatiquement recomposés dans la révision tirée, évitant ainsi le problème de branchement.

1 votes

Au prix d'un historique imprécis et d'une corruption possible en cas d'erreur.

5voto

neo Points 474

Si vous êtes familier avec git, vous serez heureux d'utiliser histedit qui fonctionne comme git rebase -i .

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