50 votes

Comment annuler une fusion (sans commit) ?

Je viens de faire un svn merge pour fusionner les changements du tronc vers une branche :

$ svn merge -r328:HEAD file:///home/user/svn/repos/proj/trunk .
--- Merging r388 through r500 into '.':
A    foo
A    bar
   C baz1
   C baz2
U    duh
[...]

Mais il y avait trop de conflits, alors j'aimerais défaire cela.

Une façon de le faire est de commettre et ensuite de fusionner à nouveau. Mais je ne peux pas commiter à cause des conflits. Quelle est la meilleure façon d'annuler dans ce cas ?

123voto

richq Points 29694

Revenir en arrière récursivement depuis le début de votre copie de travail :

svn revert -R .

Vous devrez supprimer manuellement les fichiers qui ont été ajoutés. Comme dans après l'annulation, les fichiers ajoutés resteront sur le disque mais ils seront dans un état non suivi (" ? foo")

3 votes

Cette commande va également rétablir toutes les modifications locales qui existaient avant la fusion, n'est-ce pas ?

4 votes

@NeilMonday vrai, mais alors vous ne devriez pas fusionner dans une copie de travail avec des changements locaux, non liés à la fusion de toute façon.

7voto

tangens Points 17733

Tant que vous n'avez pas validé, vous pouvez toujours faire un retour en arrière pour annuler toutes vos modifications.

0 votes

Hmm, juste svn revert . n'a rien fait.

0 votes

OK, alors vous devez d'abord tout résoudre, puis faire le retour en arrière.

6 votes

...et comme @rq l'a dit, n'oubliez pas le drapeau -R pour faire le retour en arrière récursivement.

2voto

Amit Thawait Points 1538

J'ai été confronté à la même situation, j'avais aussi d'autres changements que je ne voulais pas perdre. Ainsi, au lieu d'un retour en arrière récursif complet, je me suis contenté de svn revert pour les articles en conflit était bon pour moi

svn revert baz1 baz2

-11voto

Frank Points 16055

Fais-le. svn resolve sur tous les conflits de toute façon et s'engager :

$ svn resolved baz1
$ svn resolved baz2
$ svn ci -m "oops. bad merge. will revert."
Transmitting file data ......
Committed revision 501.

Ensuite, on annule officiellement la fusion en revenant à l'endroit où elle était :

$ svn merge -r501:500
--- Reverse-merging r319 into '.':
[...]

C'est ça, la fusion a été annulée dans le répertoire. Maintenant, faites un commit là aussi :

$ svn ci -m "bad merge has been undone"
Transmitting file data ......
Committed revision 502.

L'avantage par rapport à la svn revert -R . est que les fichiers qui ont été ajoutés sont tous correctement supprimés.

4 votes

Vous n'avez pas vraiment envie de vomir des marqueurs de conflit dans le référentiel permanent l'histoire, n'est-ce pas ? Beurk.

0 votes

@LakshmanPrasad Si quelqu'un fait un check-out/une mise à jour entre ces deux commits, les marqueurs de conflit se retrouveront dans la copie de travail de quelqu'un...

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