Mettre à jour l'élément à réviser ou revenir à la révision

161

J'ai commencé à utiliser Subversion avec TortoiseSVN. Si j'ouvre le journal et que je clique avec le bouton droit sur une ancienne révision, je vois deux options qui semblent revenir à une version plus ancienne: "Mettre à jour l'élément en révision" et "Revenir à cette révision".

Je comprends que la mise à jour vers une révision plus ancienne est utilisée lorsque vous souhaitez uniquement revenir sur une ancienne version sans vraiment modifier le référentiel. Revert, c'est quand vous avez vraiment foiré et que vous voulez que la dernière révision du référentiel soit la même qu'une ancienne version.

Donc, disons que la révision HEAD est 100 et je reviens à 95. Cela va inverser la fusion de ma copie de travail à 95. Ensuite, je peux valider ce changement dans le référentiel qui créerait la révision 101 correct? En quoi est-ce différent si je devais revenir à la révision 95? Cela ne fait-il pas encore qu'inverser les changements des dernières révisions? Je ne sais pas comment l'état de ma copie de travail diffère après un retour ou une mise à jour vers une révision plus ancienne.

Eric Anastas
la source

Réponses:

205

La mise à jour vers la révision mettra à jour uniquement les fichiers de votre copie de travail avec la révision choisie. Mais vous ne pouvez pas continuer à travailler sur cette révision, car SVN se plaindra que votre copie de travail est obsolète .

revenir à cette révision annulera toutes les modifications de votre copie de travail qui ont été faites après la révision sélectionnée (dans votre exemple rev. 96,97,98,99,100) Votre copie de travail est maintenant à l' état modifié .

Le contenu du fichier des deux scénarios est le même, mais dans le premier cas, vous avez une copie de travail non modifiée et vous ne pouvez pas valider vos modifications (car votre copie de travail ne pointe pas vers HEAD rev 100) dans le second cas, vous avez une copie de travail modifiée pointant vers la tête et vous pouvez continuer à travailler et vous engager

Peter Parker
la source
1
OK, alors disons que je mets à jour la révision et que ma copie de travail est à court de données. Rien ne m'empêche de modifier les fichiers. Et si je change l'un des fichiers et que j'essaye de le valider. Je suppose que subversion va voir le conflit et me forcer à fusionner la dernière version du référentiel dans ma copie de travail modifiée avant de la soumettre.
Eric Anastas
5
Si vous essayez de valider un élément avec une révision BASE plus ancienne que HEAD, vous obtiendrez un "échec de la validation: votre copie de travail est probablement obsolète"
Peter Parker
comment faire update toet revert to/fromtraiter les changements locaux (changements non validés)?
BaltoStar
Les deux méthodes conservent les modifications locales intactes, mais les modifications locales peuvent provoquer des conflits dans les deux cas et en cas de retour, les modifications de la restauration sont mélangées avec toutes les modifications locales des autres utilisateurs. Alors au moins, enregistrez un patch de vos modifications ou validez dans une branche.
Peter Parker
31

Pour comprendre en quoi l'état de votre copie de travail est différent dans les deux scénarios, vous devez comprendre le concept de la révision BASE :

BASE

Le numéro de révision d'un élément dans une copie de travail. Si l'élément a été modifié localement, cela fait référence à la façon dont l'élément apparaît sans ces modifications locales.

Votre copie de travail contient un instantané de chaque fichier (caché dans un dossier .svn) dans cette révision BASE, c'est- à- dire tel qu'il était lors de la dernière récupération du référentiel . Cela explique pourquoi les copies de travail prennent 2 fois plus d'espace et comment il est possible que vous puissiez examiner et même annuler les modifications locales sans connexion réseau.

Mettre à jour l'élément en révision modifie cette révision de base, rendant BASE obsolète. Lorsque vous essayez de valider des modifications locales, SVN remarquera que votre BASE ne correspond pas au référentiel HEAD. Le commit sera refusé jusqu'à ce que vous fassiez une mise à jour (et éventuellement une fusion) pour résoudre ce problème.

Le retour à la révision ne change pas la BASE. C'est presque la même chose que de modifier manuellement le fichier pour correspondre à une révision antérieure.

Wim Coenen
la source
D'après la réponse acceptée "Le contenu du fichier des deux scénarios est le même". Alors pourquoi s'embêter? Cette réponse explique la différence ultime et explique pourquoi «mettre à jour» par rapport à «revenir» entraîne un comportement différent lors de la tentative de validation.
radarbob
comment faire update toet revert to/fromtraiter les changements locaux (changements non validés)?
BaltoStar
5

Les fichiers de votre copie de travail peuvent sembler exactement la même après, mais ce sont toujours des actions très différentes - le référentiel est dans un état complètement différent, et vous aurez différentes options disponibles après le retour que la "mise à jour" vers une ancienne révision .

En bref, «mettre à jour vers» n'affecte que votre copie de travail, mais «fusion et validation inversée» affectera le référentiel.

Si vous "mettez à jour" une ancienne révision, alors le référentiel n'a pas changé: dans votre exemple, la révision HEAD est toujours 100. Vous n'avez rien à valider, puisque vous ne faites que jouer avec votre copie de travail. Si vous apportez des modifications à votre copie de travail et essayez de vous engager, vous serez informé que votre copie de travail est obsolète et que vous devrez mettre à jour avant de pouvoir vous engager. Si quelqu'un d'autre travaillant sur le même référentiel effectue une "mise à jour", ou si vous récupérez une deuxième copie de travail, ce sera r100.

Cependant, si vous effectuez une «fusion inverse» vers une ancienne révision, votre copie de travail est toujours basée sur HEAD (en supposant que vous êtes à jour) - mais vous créez une nouvelle révision pour remplacer les modifications indésirables. Vous devez valider ces modifications, car vous modifiez le référentiel. Une fois terminé, toutes les mises à jour ou nouvelles copies de travail basées sur HEAD afficheront r101, avec le contenu que vous venez de valider.

Zac Thompson
la source
5

Mettez à jour votre copie de travail avec la révision sélectionnée. Utile si vous souhaitez que votre copie de travail reflète une époque dans le passé, ou s'il y a eu d'autres validations dans le référentiel et que vous souhaitez mettre à jour votre copie de travail une étape à la fois. Il est préférable de mettre à jour tout un répertoire dans votre copie de travail, pas seulement un fichier, sinon votre copie de travail pourrait être incohérente. Ceci est utilisé pour tester un objectif de rev spécifique, si votre test est terminé, vous pouvez utiliser cette commande pour tester un autre rev ou utiliser SVN Update pour obtenir HEAD

Si vous souhaitez annuler définitivement une modification antérieure, utilisez Revenir à cette révision plutôt .

- à partir de la documentation d'aide TSVN

Si vous mettez à jour votre copie de travail vers une version antérieure, cela n'affecte que votre propre copie de travail, une fois que vous avez apporté des modifications et que vous souhaitez valider, vous échouerez, TSVN vous avertira de mettre à jour votre WC à la dernière révision en premier si vous revenez à un rev, vous pouvez vous engager dans repository.everyone reviendra à la rev après avoir effectué une mise à jour.

prime23
la source
2

Le texte de la référence Tortoise:

Mettre à jour l'élément en révision Mettez jour votre copie de travail avec la révision sélectionnée. Utile si vous souhaitez que votre copie de travail reflète une époque dans le passé, ou s'il y a eu d'autres validations dans le référentiel et que vous souhaitez mettre à jour votre copie de travail une étape à la fois. Il est préférable de mettre à jour tout un répertoire dans votre copie de travail, pas seulement un fichier, sinon votre copie de travail pourrait être incohérente.

Si vous souhaitez annuler définitivement une modification antérieure, utilisez plutôt Revenir à cette révision.

Revenir à cette révision Revenir à une révision antérieure. Si vous avez effectué plusieurs modifications et que vous décidez ensuite que vous voulez vraiment revenir à la façon dont les choses étaient dans la révision N, c'est la commande dont vous avez besoin. Les modifications sont annulées dans votre copie de travail, de sorte que cette opération n'affecte pas le référentiel tant que vous ne les avez pas validées. Notez que cela annulera toutes les modifications apportées après la révision sélectionnée, en remplaçant le fichier / dossier par la version antérieure.

Si votre copie de travail est dans un état non modifié, après avoir effectué cette action, votre copie de travail apparaîtra comme modifiée. Si vous avez déjà des modifications locales, cette commande fusionnera les modifications d'annulation dans votre copie de travail.

Ce qui se passe en interne, c'est que Subversion effectue une fusion inversée de toutes les modifications apportées après la révision sélectionnée, annulant l'effet de ces validations précédentes.

Si, après avoir effectué cette action, vous décidez que vous souhaitez annuler l'annulation et ramener votre copie de travail à son état précédent non modifié, vous devez utiliser TortoiseSVN → Revenir à partir de l'Explorateur Windows, ce qui annulera les modifications locales apportées par cette action de fusion inversée.

Si vous voulez simplement voir à quoi ressemblait un fichier ou un dossier dans une révision antérieure, utilisez plutôt Mettre à jour en révision ou Enregistrer la révision sous ... à la place.

Liker777
la source