Aggiorna elemento alla revisione vs Ripristina alla revisione


161

Ho iniziato a usare Subversion con TortoiseSVN. Se apro il registro e faccio clic con il tasto destro su una vecchia revisione, vedo due opzioni che sembrano tornare a una versione precedente: "Aggiorna elemento alla revisione" e "Ripristina a questa revisione".

Comprendo che l'aggiornamento a una versione precedente viene utilizzato quando si desidera solo guardare indietro a una versione precedente ma non modificare realmente il repository. Il ripristino è quando hai effettivamente rovinato e vuoi che l'ultima revisione nel repository sia la stessa di una versione precedente.

Quindi dire che la revisione HEAD è 100 e torno indietro a 95. Invertirà la mia copia di lavoro su 95. Quindi posso eseguire il commit di tale modifica nel repository che creerebbe la revisione 101 corretta? In che modo sarebbe diverso se dovessi aggiornare alla revisione 95? Non annulla ancora le modifiche rispetto alle ultime revisioni? Sono confuso su come lo stato della mia copia di lavoro differisca dopo un ripristino o l'aggiornamento a una revisione precedente.

Risposte:


205

L'aggiornamento alla revisione aggiorna solo i file della copia di lavoro alla revisione scelta. Ma non puoi continuare a lavorare su questa revisione, poiché SVN si lamenterà che la tua copia di lavoro non è aggiornata .

il ripristino di questa revisione annullerà tutte le modifiche nella copia di lavoro che sono state apportate dopo la revisione selezionata (nel tuo esempio rev. 96,97,98,99,100) La tua copia di lavoro è ora in stato modificato .

Il contenuto del file di entrambi gli scenari è lo stesso, tuttavia nel primo caso hai una copia di lavoro non modificata e non puoi eseguire il commit delle modifiche (poiché la tua copia di lavoro non punta a HEAD rev 100) nel secondo caso hai una copia di lavoro modificata che punta a testa e puoi continuare a lavorare e impegnarti


1
OK, quindi dì che aggiorno alla revisione e che la mia copia di lavoro è esaurita. Nulla mi impedisce di modificare i file. Che cosa succede se cambio uno dei file e provo a impegnarlo. Immagino che Subversion vedrà il conflitto e mi costringerà a unire l'ultima versione del repository nella mia copia di lavoro modificata prima di inviarlo.
Eric Anastas,

5
Se provi a eseguire il commit di un articolo con una BASE-Revision precedente a HEAD, otterrai un "commit non riuscito: la tua copia di lavoro è probabilmente obsoleta"
Peter Parker,

come fare update toe revert to/fromtrattare le modifiche locali (modifiche non confermate)?
BaltoStar,

Entrambi i metodi mantengono intatte le modifiche locali, tuttavia le modifiche locali possono causare conflitti in entrambi i casi e in caso contrario le modifiche dal rollback vengono mescolate con tutte le modifiche locali degli altri utenti. Quindi almeno salva una patch delle tue modifiche o esegui il commit in un ramo.
Peter Parker,

31

Per capire in che modo lo stato della copia di lavoro è diverso in entrambi gli scenari, è necessario comprendere il concetto della revisione BASE :

BASE

Il numero di revisione di un articolo in una copia di lavoro. Se l'articolo è stato modificato localmente, questo si riferisce al modo in cui l'articolo appare senza quelle modifiche locali.

La tua copia di lavoro contiene un'istantanea di ciascun file (nascosto in una cartella .svn) in questa revisione BASE, ovvero com'era l'ultima volta che è stato recuperato dal repository . Questo spiega perché le copie di lavoro occupano il doppio dello spazio e come è possibile esaminare e persino ripristinare le modifiche locali senza una connessione di rete.

Aggiorna l'elemento in Revisione modifica questa revisione di base, rendendo BASE obsoleto. Quando si tenta di eseguire il commit delle modifiche locali, SVN noterà che il proprio BASE non corrisponde al repository HEAD. Il commit verrà rifiutato fino a quando non si esegue un aggiornamento (e possibilmente un'unione) per risolvere il problema.

Il ripristino alla revisione non cambia BASE. Concettualmente è quasi lo stesso che modificare manualmente il file in modo che corrisponda a una revisione precedente.


Dalla risposta accettata "Il contenuto del file di entrambi gli scenari è lo stesso". Allora perché preoccuparsi? Questa risposta spiega la differenza ultima e spiega perché "aggiorna" vs "ripristina" provoca un comportamento diverso quando si tenta di eseguire il commit.
radarbob,

come fare update toe revert to/fromtrattare le modifiche locali (modifiche non confermate)?
BaltoStar,

5

I file nella tua copia di lavoro potrebbero apparire esattamente uguali dopo, ma sono comunque azioni molto diverse: il repository si trova in uno stato completamente diverso e avrai a disposizione diverse opzioni dopo il ripristino rispetto all'aggiornamento di una vecchia revisione .

In breve, "aggiorna a" influisce solo sulla copia di lavoro, ma "inverti unione e commit" influirà sul repository.

Se "aggiorni" a una vecchia revisione, il repository non è cambiato: nel tuo esempio, la revisione HEAD è ancora 100. Non devi impegnare nulla, dato che stai solo scherzando con la tua copia di lavoro. Se apporti modifiche alla tua copia di lavoro e provi a eseguire il commit, ti verrà comunicato che la tua copia di lavoro non è aggiornata e dovrai aggiornare prima di poter eseguire il commit. Se qualcun altro che lavora sullo stesso repository esegue un "aggiornamento" o se si verifica una seconda copia di lavoro, sarà r100.

Tuttavia, se si "unisce in modo inverso" a una vecchia revisione, la copia di lavoro si basa ancora sull'HEAD (supponendo che si sia aggiornati) - ma si sta creando una nuova revisione per sostituire le modifiche indesiderate. È necessario eseguire il commit di queste modifiche, poiché si sta modificando il repository. Una volta fatto, qualsiasi aggiornamento o nuova copia funzionante basata su HEAD mostrerà r101, con i contenuti appena impegnati.


5

Aggiorna la tua copia di lavoro alla revisione selezionata. Utile se vuoi che la tua copia di lavoro rifletta un tempo nel passato, o se ci sono stati ulteriori commit nel repository e vuoi aggiornare la tua copia di lavoro un passo alla volta. È consigliabile aggiornare un'intera directory nella copia di lavoro, non solo un file, altrimenti la copia di lavoro potrebbe essere incoerente. Questo è usato per testare uno scopo di rev specifico, se il test è stato fatto, puoi usare questo comando per testare un altro rev o usare SVN Update per ottenere HEAD

Se si desidera annullare definitivamente una modifica precedente, utilizzare invece Ripristina a questa revisione .

- dalla guida di TSVN doc

Se aggiorni la tua copia di lavoro a una versione precedente, ciò influisce solo sulla tua copia di lavoro, dopo aver apportato alcune modifiche e vuoi impegnarti, fallirai, TSVN ti avviserà di aggiornare prima il tuo WC all'ultima revisione Se ripristini a un rev, puoi impegnarti nel repository. Tutti torneranno al rev dopo aver effettuato un aggiornamento.


2

Il testo dal riferimento alla tartaruga:

Aggiorna elemento da revisionare Aggiorna la tua copia di lavoro alla revisione selezionata. Utile se vuoi che la tua copia di lavoro rifletta un tempo nel passato, o se ci sono stati ulteriori commit nel repository e vuoi aggiornare la tua copia di lavoro un passo alla volta. È consigliabile aggiornare un'intera directory nella copia di lavoro, non solo un file, altrimenti la copia di lavoro potrebbe essere incoerente.

Se si desidera annullare definitivamente una modifica precedente, utilizzare invece Ripristina a questa revisione.

Ripristina questa revisione Ripristina una versione precedente. Se hai apportato diverse modifiche e poi decidi che vuoi davvero tornare a come erano le cose nella revisione N, questo è il comando che ti serve. Le modifiche vengono annullate nella copia di lavoro, quindi questa operazione non influisce sul repository finché non si eseguono le modifiche. Si noti che ciò annullerà tutte le modifiche apportate dopo la revisione selezionata, sostituendo il file / la cartella con la versione precedente.

Se la copia di lavoro è in uno stato non modificato, dopo aver eseguito questa azione la copia di lavoro verrà visualizzata come modificata. Se hai già modifiche locali, questo comando unirà le modifiche di annullamento nella tua copia di lavoro.

Ciò che sta accadendo internamente è che Subversion esegue una fusione inversa di tutte le modifiche apportate dopo la revisione selezionata, annullando l'effetto di quei precedenti commit.

Se dopo aver eseguito questa azione decidi di voler annullare l'annullamento e riportare la tua copia di lavoro al suo precedente stato non modificato, devi utilizzare TortoiseSVN → Ripristina da Esplora risorse di Windows, che eliminerà le modifiche locali apportate da questa azione di unione inversa.

Se vuoi semplicemente vedere come appariva un file o una cartella in una revisione precedente, usa invece Aggiorna per revisione o Salva revisione come ...


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.