web-dev-qa-db-fra.com

Comment supprimer une branche accidentelle dans TortoiseHg?

(Je suis un nouveau venu relatif à TortoiseHg, alors supportez-moi :-) J'utilise TortoiseHg sur deux machines pour communiquer avec mon référentiel de sources distant. J'ai apporté des modifications sur une machine, je les ai validées et j'ai essayé de les envoyer dans le référentiel distant MAIS j'ai oublié de commencer par extraire d'abord le dernier code. La Push m'a donné quelques lignes de sortie, suggérant que j'ai peut-être oublié de tirer en premier (vrai!) Et mentionnant quelque chose comme "Abort: Push crée de nouvelles branches distantes ...".

Alors j'ai fait un pull, qui a ajouté plusieurs nœuds à la tête de mon graphique dans l'explorateur de référentiel. Le problème est que le Push que j'ai essayé de faire apparaît maintenant sous forme de branche dans l'explorateur de référentiels. En regardant du côté serveur (codeplex), il ne montre aucun signe de ma tentative de Push, indiquant que cette branche accidentelle est toujours locale sur ma machine.

Comment pourrais-je enlever cette branche accidentelle? J'ai essayé de sélectionner ce nœud dans le graphique, puis de "revenir" mais cela ne semblait rien faire. Je me demande s'il serait plus simple de simplement supprimer mon arborescence de répertoires sur mon ordinateur local et de procéder à une extraction totalement nouvelle et propre du serveur ...?

21
Michael Sorens

Commencez par vous assurer que vous avez validé tous vos changements locaux. Fusionnez ensuite les branches en appelant hg merge et validez le résultat.

Cela devrait vous ramener à une seule branche, réunissant les deux têtes.

17
sth

J'avais une branche que je ne voulais pas, mais j'ai constaté que je ne pouvais pas la fusionner (ou qu'il était très difficile pour moi de savoir comment fusionner) car elle contenait un conflit basé sur un changement de cas de nom de fichier.

Finalement, j'ai décidé de hg commit --close-branch. Comme la branche n’existait que sur mon dépôt local, et non sur le dépôt que j’avais cloné, le hg Push suivant n’a même pas pris la peine de pousser la branche fermée vers le dépôt principal! Très pratique. À ce stade, tout ce que je devais faire pour l'éliminer complètement était de supprimer mon dépôt local et de le cloner de nouveau du "maître".

7
user1593861

Faites un "Fusionner avec" et cochez la case "Annuler toutes les modifications de la révision de la cible de fusion (autre)". Bien sûr, vous devez vous assurer que la cible affichée comme cible de la fusion est bien celle que vous voulez jeter avant de cliquer sur le bouton Fusionner.

5
mhenry1384

Dans l'explorateur de référentiel, choisissez le premier tour de vos modifications locales, puis cliquez avec le bouton droit de la souris sur le bout de la branche que vous venez de tirer et choisissez "Rebaser sur le dessus de la sélection" ou "Modifier l'historique -> Rebaser sur le dessus de la sélection" en fonction de votre choix. version client. Cela "re-basera" vos tours sur ceux qui sont tirés.

De plus, pour éviter cela à l'avenir ...

Dans l'explorateur de référentiel, choisissez Outils-> Paramètres. Dans le menu déroulant situé en haut à gauche, choisissez "Paramètres globaux de l'utilisateur". Cela s'applique donc à tous les référentiels. Ensuite, choisissez Synchroniser à gauche. Dans "After Pull Operation", choisissez "rebase". Cela fera en sorte que vos révisions locales soient "rebasées" sur les révisions que vous venez de tirer, plutôt que de les laisser dans une branche différente.

Voici comment je le fais et c'est probablement ce que vous voulez généralement.

Pour plus d'informations, voir projet de base et extension de base .

2
Kyle Heironimus

Voici comment procéder avec l'outil de ligne de commande. Je suppose que cela peut facilement être associé à TortoiseHg (bien que je ne sois pas sûr, car je ne l'utilise jamais ...) Quoi qu'il en soit, comme cela devrait être fait de temps en temps, je pense qu'il n'y a aucun problème à utiliser le terminal ici .

Un exemple de configuration

Supposons que votre référentiel distant ressemble à ceci:

@  changeset:   3:a4c18a1fba12
|  tag:         tip
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Localement, vous n'avez pas commis 4, vous avez donc commis quelque chose directement sur le commit 3:

@  changeset:   3:39526003350f
|  tag:         tip
|  summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Donc, vous essayez de pousser, et obtenez ce message:

$ hg Push
pushing to ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
remote has heads on branch 'default' that are not known locally: a4c18a1fba12
abort: Push creates new remote head 39526003350f!
(pull and merge or see "hg help Push" for details about pushing new heads)

Comme demandé, vous le tirez:

$ hg pull
pulling from ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

Vous l'avez maintenant ...

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4
|
| @  changeset:   3:39526003350f
|/   summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

... mais vous préférez ne pas fusionner comme demandé. Vous voulez avoir ceci à la place:

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Et ensuite, vous voulez le pousser vers le dépôt distant.

Comment obtenez-vous cela?

Le résoudre

Pour cela, vous ne pouvez pas avez poussé le "commit 4 effectué localement". En outre, il n'y a aucun moyen de le mettre après la nouvelle télécommande est validée. Cela dit, nous pouvons obtenir ce que nous avons demandé.

Cela dit, il vous suffit de redéfinir votre commit local sur le nouveau commit distant:

$ hg rebase --source 3 --dest 4

Si vous avez de la chance, cela suffira.

Gérer les conflits

Si vous êtes malchanceux, vous pouvez avoir des conflits:

$ hg rebase --source 3 --dest 4
rebasing 3:39526003350f "commit 4 made locally"
merging test.txt
warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark')
unresolved conflicts (see hg resolve, then hg rebase --continue)

Ensuite, il suffit de résoudre les conflits (en les modifiant manuellement):

$ hg st
M test.txt
$ nano test.txt # Edit and save

... marquer le fichier comme résolu ...

$ hg resolve --mark
(no more unresolved files)
continue: hg rebase --continue

... et procéder à la rebase:

 $ hg rebase --continue
rebasing 3:39526003350f "commit 4 made locally"
saved backup bundle to /home/adam/software/Mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg

Voici votre nouvelle histoire:

@  changeset:   4:ca31fe8a15f0
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Maintenant, appuyez dessus:

$ hg Push
pushing to ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

Ces jours-là, ce n'est plus aussi complexe qu'auparavant, non? :)

0
brandizzi