Risolvere i conflitti
Come abbiamo accennato, SubVersion è in grado di accorgersi se le modifiche effettuate da diversi utenti si sovrappongono. In tal caso ci segnala il conflitto e ci chiede di risolverlo.
Se il file è di tipo mergeable
(quindi non un file binario) ci viene ancora più incontro, inserendo nel file stesso dei marcatori che evidenziano il conflitto, come nell'esempio qui riportato:
<<<<<<< .mine codice copia locale codice copia locale ======= codice copia sul repository codice copia sul repository codice copia sul repository >>>>>>> .r2
La parte superiore mostra la versione locale del contenuto, mentre la parte inferiore mostra la versione del repository.
Vengono inoltre creati nella nostra copia di lavoro altri tre file temporanei:
nomefile.mine
– il nostro file locale, con le ultime modifiche che abbiamo cercato di caricarenomefile.rBASE
– il file presente nella copia "nascosta", quindi prima delle modifiche localinomefile.rHEAD
– l'ultimo file presente sul repository
BASE
e HEAD
vengono sostituiti dai corrispondenti numeri di versione.
Per risolvere il conflitto abbiamo quindi diverse strade:
- unire a mano le modifiche, sfruttando i marcatori inseriti da SubVersion
- sovrascrivere il file che crea conflitto con uno dei tre file temporanei sopra elencati
- usare il comando
svn revert
per annullare tutte le modifiche locali
Se scegliamo la strada 1 o la 2, che sono modifiche manuali, dovremo poi avvertire SVN dell'avvenuta risoluzione usando il svn resolved nomefile
, che ovviamente in TortoiseSVN diventa l'opzione resolved disponibile cliccando con il tasto destro sul file in questione.
Esaminare i cambiamenti locali
Ci sono diversi comandi che ci permettono di avere informazioni sulla nostra copia di lavoro locale senza nemmeno bisogno di collegarsi al repository.
Per verificare lo stato della copia di lavoro è disponibile il comando svn status
, che ci permette tra le altre cose di sapere quali file sono stati modificati, aggiunti, cancellati; in pratica ci offre una anteprima di quello che succederebbe con un commit
.
Per visualizzare nel dettaglio le modifiche apportate a uno specifico file rispetto alla revisione BASE
, è disponibile il svn diff
. Vedremo che lo stesso comando può essere usato anche per confrontare revisioni diverse, ma in questo caso bisogna collegarsi al repository.
Infine, per annullare le modifiche locali effettuate e tornare alla revisione BASE
, è disponibile il comando svn revert
. Tale comando annulla anche le operazioni di aggiunta/eliminazione/spostamento dei file, a patto che siano state realizzate con i comandi SVN appropriati.
Non ci resta che provare. In TortoiseSVN il comando svn status
è diventato Check for modifications. Lo eseguiamo e visualizziamo l'elenco: ho un file in stato modified
, cioè in corso di modifica e un file in stato unversioned
.
Se cliccchiamo con il tasto destro sul file in stato modified
, possiamo selezionare l'opzione Compare with base, che corrisponde al comando svn diff
.
Chiudiamo ora tutte le finestre di dialogo, torniamo al nostro filesystem e clicchiamo con il tasto destro sulla cartella di lavoro: tra le altre è presente l'opzione revert. Per il momento non eseguiamo, non abbiamo ancora effettuato un commit
e se perdiamo le modifiche dobbiamo rifare tutto il lavoro.