Melhor maneira de reverter para uma revisão SVN anterior de um arquivo?

167

Acusei acidentalmente muitos arquivos em um repositório SVN e alterei algumas coisas que não pretendia. (Suspiro.) Para revertê-los ao estado anterior, o melhor que pude sugerir foi

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Eita! Não existe melhor maneira? Por que não consigo escrever algo assim:

svn revert -r 854 l3toks.dtx

Ok, estou apenas usando a v1.4.4, mas passei os olhos pela lista de alterações do ramo 1.5 e não consegui ver nada diretamente relacionado a isso. Eu perdi alguma coisa?


Edit: Eu acho que não estava claro o suficiente. Eu não acho que eu quero para reverter merge, porque então eu vou perder as mudanças que eu fiz querem fazer! Diga isso fileAe fileBambos foram modificados, mas eu só queria confirmar fileA; digitando acidentalmente

svn commit -m "small change"

confirma os dois arquivos e agora quero reverter fileB. A mesclagem reversa torna essa tarefa não mais fácil (até onde eu sei) do que as etapas descritas acima.

Will Robertson
fonte
Possível duplicata de Como reverto uma confirmação SVN?
Vadzim

Respostas:

243
svn merge -r 854:853 l3toks.dtx

ou

svn merge -c -854 l3toks.dtx

Os dois comandos são equivalentes .

orip
fonte
5
Obrigado por isso, só queria declarar algo - por exemplo, estou na revisão 855, quero reverter um arquivo para a revisão 854. Se o fizer svn merge -c -854 my.file, e o faço svn diff, parece mostrar uma revisão antes do 854 (ou seja, 853 ); somente quando eu faço svm merge -c 854 myfile(sem o -), parece que meu arquivo é revertido para rev 854. Obrigado novamente, felicidades!
Sdaau
11
Existe uma razão pela qual a primeira opção acima funcionou como um encanto para mim, enquanto a segunda não funcionou?
skybondsor
7
Não se esqueça de confirmar após a fusão reversa, no entanto. Eu muitas vezes esquecemos :)
Vineeth Pradhan
11
Realmente deveria menos 1 isto por não indicar qual é a diferença entre esses dois comandos. Resposta
ruim
4
@sprog - se há uma diferença eu apreciaria saber
orip
34

Confira a seção " desfazendo alterações " do livro svn

luapyad
fonte
5
Os links para recursos externos são incentivados, mas adicione contexto ao redor do link para que seus colegas usuários tenham uma idéia do que é e por que está lá. Sempre cite a parte mais relevante de um link importante, caso o site de destino esteja inacessível ou fique permanentemente offline.
user2084795
32

desculpe-me por usar um pouco de espaço apenas em uma reiteração da resposta dada anteriormente - mas isso é algo com o qual sempre acabo tendo problemas.

Digamos que atualizei os arquivos locais para a revisão mais recente, que é 854. Então, gostaria de obter uma revisão mais antiga - a versão do arquivo de poucas revisões anteriores, digamos a revisão 851.

A cópia funcionaria:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. no entanto, não posso ser incomodado grepping para o URL do repo :)

A atualização aparentemente pode funcionar:

svn up -r 851 ./l3toks.dtx

... no entanto, também marca a cópia local como "recém-finalizada", ou melhor, "igual à revisão on-line" (ou seja, no Tortoise / RabbitVCS você recebe uma marca de seleção verde OK) - o que significa que você não pode fazer svn ci -m "rolled back to r 851": simplesmente porque o local subversionO executável não notará nenhuma alteração local e não será obrigado a fazer upload de nada para o repositório online.

E, como já respondemos, a mesclagem reversa funciona - mas, neste caso, não se deve confiar na sintaxe do atalho; mas especifique especificamente:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Devo admitir - nunca entenderia a frase " fusão reversa de r854 a r852 em arquivo " como " Acabei de obter o r851 do seu arquivo e sobrescrito o que você tinha anteriormente localmente - e está marcada como diferente da última revisão on-line, então você pode verificar on-line novamente como uma nova revisão de " reversão" ", mas acho que (e espero :)) é isso que faz :)

Depois disso, pode-se usar svn diffpara uma rápida verificação se obtivemos a revisão correta localmente; e também, o arquivo será marcado com um ponto de exclamação vermelho no Tortoise / RabbitVCS (ou seja, diferente da última versão confirmada) e, portanto, svn ci -m "rolled back to r 851"poderá ser executado dessa vez.

Além disso, observe que, se você finalmente mudar de idéia após a mesclagem reversa ( ou seja, de qualquer forma, você deseja continuar trabalhando na revisão HEAD mais recente, aqui 854 - depois de voltar para o 851 localmente, mas ainda não cometeu a reversão). ), você não deve usar svn up, porque simplesmente diz que já está " Na revisão 854 "; use em vez disso svn revert --recursive .ou similar ...

Felicidades!

Ref: Como reverter alterações usando o Subversion - Jacob Wright - Flex, AIR, PHP, etc.

EDIT: ... e, aparentemente, o mesmo efeito que svn merge -r HEAD:851 l3toks.dtxpode ser alcançado com:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
fonte
2
Você SEMPRE prefere o svn export, pois ele faz exatamente o que você deseja - verifique um arquivo em uma determinada revisão, enquanto a mesclagem reversa também tentará mesclar suas alterações locais com a versão especificada, é uma operação complexa e louca, que é propenso a erros se você não tomar cuidado!
Falco
1
Eu tive problemas com a fusão reversa. Em vez de descobrir o porquê, tentei exportar e funcionou perfeitamente. Eu recomendo apenas usar a exportação. Você pode usar --forcepara substituir diretórios. Lembre-se de que ele substituirá as alterações.
Nick
Muito boa explicação sobre o que realmente está acontecendo! Uso o AnkhSVN e o TortoiseSVN com frequência e não vejo nenhum lugar para usá-lo svn export- estou perdendo alguma coisa ou isso simplesmente não foi implementado nessas GUIs?
Conrad
@Conrad, Você usa isso clicando em "Exportar ..." em AnkhSVN e "Export" no TortoiseSVN a partir de seu contexto repositório (clique direito) Menu
nitinr708
10

Recentemente, tive que reverter para uma revisão específica para depurar uma versão mais antiga e isso funcionou como mágica:

svn up -r 3340 (or what ever your desired revision number)

Tive que resolver todos os conflitos usando a opção "tc", pois não me importava com as alterações locais (fiz o check-in de tudo o que me importava antes de reverter)

Voltar à revisão também era simples:

svn up
Igor
fonte
5

O que você está procurando é chamado de "mesclagem reversa". Você deve consultar os documentos sobre a função de mesclagem no livro SVN (como luapyad, ou mais precisamente o primeiro comentarista dessa publicação, aponta). Se você estiver usando o Tortoise, também poderá acessar a visualização de log e clicar com o botão direito do mouse e escolher "reverter alterações desta revisão" na que cometeu o erro.

rmeador
fonte
4

A mesclagem reversa é exatamente o que você deseja (consulte a resposta de luapyad). Basta aplicar a mesclagem ao arquivo confirmado erroneamente, em vez de ao diretório inteiro.

Tom
fonte
4

Se você quiser desfazer apenas o último check-in, poderá usar o seguinte

svn merge -r head:prev l3toks.dtx

Dessa forma, você não precisa procurar os números das versões atual e anterior.

Ken Russell
fonte
4

svn merge mesclará revisões, não as reverterá. ou seja, se você tiver alguma adição na sua versão HEAD, mesclar isso com uma revisão anterior, a alteração persistirá.

Eu uso o svn cat e depois o redireciono para o arquivo:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Você tem o conteúdo 851 desse arquivo e pode fazer o check-in novamente.

Dylan
fonte
3

Se você usar o IDE Eclipse com o plug - in SVN, poderá fazer o seguinte:

  1. Clique com o botão direito do mouse nos arquivos que você deseja reverter (ou na pasta em que estavam contidos, se você os excluiu por engano e deseja adicioná-los novamente)
  2. Selecione " Equipe> Alternar "
  3. Escolha o botão de opção "Revisão" e digite o número da revisão para a qual você deseja reverter. Clique OK
  4. Vá para a perspectiva Sincronizar
  5. Selecione todos os arquivos que você deseja reverter
  6. Clique com o botão direito do mouse na seleção e faça " Substituir e Confirmar ... "

Isso reverterá os arquivos para a revisão que você deseja. Lembre-se de que o SVN verá as alterações como um novo commit. Ou seja, a alteração obtém um novo número de revisão e não há vínculo entre a revisão antiga e a nova. Você deve especificar nos comentários de confirmação que está revertendo esses arquivos para uma revisão específica.

ceiroa
fonte