Como eu volto para uma versão mais antiga do nosso código no Subversion?

486

Estou trabalhando em um projeto com um amigo e quero retornar para uma versão mais antiga do nosso código e configurá-lo como atual. Como eu faço isso?

Estou usando "anksvn" no vs08.

Eu tenho a versão que eu quero no meu PC, mas a confirmação está falhando; A mensagem que recebo é "falha na confirmação, arquivo ou diretório está desatualizado".

Eu também tenho o cliente subversion no meu PC.

Chen Kinnrot
fonte

Respostas:

783

Basicamente, você precisa "para trás Merge" - aplicar um diff entre a versão atual e anterior para a versão atual (assim você acaba com uma cópia de trabalho parecendo a versão antiga) e, em seguida, cometer novamente. Por exemplo, para ir da revisão 150 (atual) para a revisão 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

O Livro Vermelho do Subversion tem uma boa seção sobre isso .

Jon Skeet
fonte
3
mas a mesclagem não substitui minhas alterações e a nova revisão.
Chen Kinnrot
76
Se você estiver usando o TortoiseSVN, clique com o botão direito do mouse no arquivo, selecione Mesclar e Mesclar um intervalo de revisões. Na caixa de log, digite 140-150 e clique na caixa de seleção Inverter. Depois disso, confirme como de costume. Isso executará a mesma operação que o exemplo de Jon.
DavGarcia
8
Com eclipse e subclipse, você pode clicar com o botão direito do mouse em seu projeto, Team / Show History, selecionar as revisões que deseja "desfazer" e, com outro clique com o botão direito do mouse, selecionar "Reverter alterações das revisões selecionadas".
fego 28/11
36
Para reverter da revisão principal, você também pode escrever svn merge -r HEAD:140.
sschmeck
3
As instruções do TortoiseSVN do DavGarcia não eram adequadas para mim, pelo menos para não reverter todos os arquivos em uma revisão (usando o TortoiseSVN 1.8.8). Clique com o botão direito do mouse na pasta, selecione TortoisSVN-> Mostrar log. Escolha a (s) revisão (ões) que deseja reverter, clique com o botão direito do mouse em "Reverter alterações desta revisão". Confirme as alterações.
precisa saber é o seguinte
178

Você só pode cometer novas alterações na cabeça da história subversão.

O motivo pelo qual você não pode fazer nada diretamente com a boa cópia que você possui no seu PC é que suas .svnpastas sabem que é um código do passado, portanto, exige uma atualização antes de qualquer confirmação.

Encontre o bom número de revisão e reverta

  1. Encontre o número da revisão da cópia antiga que deseja.

    Obtenha sua revisão atual com:

    svn info --show-item revision
    # or
    svn log

    Ou, para verificar versões mais antigas do seu projeto, use:

    svn update -r <earlier_revision_number>

    até encontrar o número de revisão correto.

  2. Anote o bom número da revisão (assumindo os 123exemplos abaixo).

  3. Atualize para a revisão mais recente:

    svn update
  4. Desfazer todas as alterações entre a revisão desejada e a versão mais recente:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (o mesmo que a resposta de Jon Skeet acima.)

Se você não encontrar o número da revisão

Se você não consegue encontrar a cópia antiga e deseja apenas confirmar os arquivos atualmente no seu PC:

  1. Faça uma cópia da sua versão boa (mas sem nenhuma .svnpasta):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Agora verifique se você tem a versão mais recente:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Copie sua versão boa por cima da cópia de trabalho.

    Este comando copiará e também excluirá os arquivos da árvore de trabalho que não estão na sua cópia boa, mas não afetarão as .svnpastas existentes .

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Se você não possui o rsync, pode usá- cp -alo, mas também precisará excluir manualmente os arquivos indesejados.

  4. Você deve poder comprometer o que tem agora.

    cd project
    svn commit "Reverted to good copy"
joeytwiddle
fonte
2
svn não interpreta isso como uma modificação, não posso cometer isso.
Sandburg
svn merge -r CABEÇA: 12345. é o comando correto para reverter, não faça uma atualização -r. Sua pessoa louca.
coruja
Acho que essa resposta foi aprovada por pessoas que não conseguiram encontrar o número da revisão ou que apreciaram a explicação principal. Atualizei a resposta agora para incluir as duas abordagens.
precisa saber é o seguinte
36

Basta usar esta linha

svn update -r yourOldRevesion

Você pode conhecer sua revisão atual usando:

informação svn

M.Othman
fonte
15
Isso não resolve o problema. Em vez disso, isso produz o estado em que o solicitante estava no momento de fazer sua pergunta.
Ingo Schalk-Schupp
1
Se você teve a infelicidade de seguir este conselho, execute: "svn resolve --accept working -R."
Coruja
27

A maneira padrão de usar a mesclagem para desfazer todo o check-in funciona muito bem, se é isso que você deseja fazer. Às vezes, porém, tudo o que você quer fazer é reverter um único arquivo. Não há maneira legítima de fazer isso, mas há um hack:

  1. Encontre a versão que você deseja usando o svn log.
  2. Use o subcomando de exportação do svn:

    svn export http: // url para seu arquivo @ 123 / tmp / filename

(Onde 123 é o número da revisão de uma boa versão do arquivo.) Em seguida, mova ou copie esse arquivo único para substituir o antigo. Faça o check-in no arquivo modificado e pronto.

Conta
fonte
Usando o Tortoise-svn, posso clicar com o botão direito do mouse em um único arquivo e mesclá-lo. Deve haver uma maneira de fazer isso usando svntambém?
lc.
10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
Dash17291
8

Um pouco mais da velha escola

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

então o habitual

svn diff
svn commit
Yauhen Yakimovich
fonte
5

Eu acho que isso é mais adequado:

Faça a mesclagem para trás, por exemplo, se o código confirmado contiver a revisão da revisão 5612 para 5616, apenas faça a mesclagem para trás. Isso funciona no meu fim.

Por exemplo:

svn merge -r 5616:5612 https://<your_svn_repository>/

Ele conteria um código mesclado de volta à revisão anterior, e você poderá confirmá-lo.

hpal
fonte
3

Foi isso que fiz e trabalhei para mim.

Quero desfazer as alterações em várias confirmações que fiz por determinados períodos e quero ir para o ponto de confirmação anterior.

  1. Vá para Equipe -> Mostrar histórico.
  2. Clique com o botão direito do mouse ou no intervalo de revisões que você deseja ignorar.
  3. Selecione a opção "Reverter alterações".

Isso executará uma mesclagem reversa, desfazendo as alterações na sua cópia de trabalho.

Basta revisar o código e confirmar.

Ziya
fonte
2

Clique com o botão direito do mouse na hierarquia mais alta que você deseja reverter >> RevertouRevert to Revision

Yuval Adam
fonte
2

A maioria das respostas anteriores usa uma mesclagem reversa, e essa geralmente é a resposta certa. No entanto, há uma situação (que acabou de acontecer comigo) em que não está.

Alterei acidentalmente um arquivo com finais de linha Unix para finais de linha do DOS ao fazer uma pequena alteração e o confirmei. Isso é facilmente desfeito, alterando as terminações da linha e confirmando novamente, ou por uma mesclagem reversa, mas tem o efeito de tornar a svn blamelista minha edição como a fonte de todas as linhas do arquivo. (Curiosamente, o TortoiseSVN no Windows não é afetado por isso; apenas a linha de comando svn blame.)

Se você deseja manter o histórico, conforme relatado por svn blame, acho que você precisa fazer o seguinte:

  • Exclua o arquivo e confirme.
  • No repositório, copie a cópia boa anterior do arquivo na cabeça e confirme.
  • Restaure as edições que você deseja manter.

A exclusão é um pouco assustadora, mas lembre-se de que você sempre tem o arquivo salvo no repositório, portanto, restaurá-lo não é grande coisa. Aqui está um código para ilustrar as etapas. Suponha que esse xxxseja o número de revisão da última cópia válida.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Observe que, para uma cópia no repositório, o destino precisa ser um diretório, não um nome de arquivo.

user2554330
fonte
1

Clique com o botão direito do mouse no projeto> Substituir por> Revisão ou URL> Selecione a revisão específica que deseja reverter.

Agora confirme a versão do código de atualização local no repositório. Isso reverterá a base de código para a revisão específica.

KayV
fonte
1

Há muitas respostas perigosas nesta página. Observe que desde o SVN versão 1.6, fazer uma atualização -r pode causar conflitos de árvore, que rapidamente se transformam em um pesadelo kafkeresque com potencial de perda de dados, no qual você procura informações sobre conflitos de árvore.

A maneira correta de reverter para uma versão é:

svn merge -r HEAD:12345 .

Onde 12345 é o número da versão. Não esqueça o ponto.

Coruja
fonte
0

Sincronize com a versão mais antiga e confirme. Isso deve fazer o truque.

Aqui também está uma explicação para desfazer alterações.

Mork0075
fonte
0

A resposta de Jon Skeet é praticamente a solução em poucas palavras, no entanto, se você é como eu, pode querer uma explicação. O manual do Subversion chama isso de

Cherry-Pick Merge

Nas páginas do manual.

  1. Esse formulário é chamado de mesclagem 'pick-cherry': '-r N: M' refere-se à diferença no histórico do ramo de origem entre as revisões N e M.

    Um 'intervalo reverso' pode ser usado para desfazer alterações. Por exemplo, quando a origem e o destino se referem à mesma ramificação, uma revisão confirmada anteriormente pode ser 'desfeita'. Em uma faixa reversa , N é maior que M em '-r N: M' ou a opção '-c' é usada com um número negativo: '-c -M' é equivalente a '-r M:'. Desfazer alterações como essa também é conhecido como executar uma 'mesclagem reversa'.


  • Se a origem for um arquivo, as diferenças serão aplicadas a esse arquivo (útil para mesclar mudanças anteriores). Caso contrário, se a origem for um diretório, o destino será o padrão '.'

    Em uso normal, a cópia de trabalho deve estar atualizada, em uma única revisão, sem modificações locais e sem subárvores comutadas.

Exemplo:

svn merge -r 2983:289 path/to/file

Isso substituirá a cópia local [2983] (que, de acordo com a citação acima, deve estar sincronizada com o servidor - de sua responsabilidade) pela revisão 289 do servidor. A alteração ocorre localmente, o que significa que, se você fizer uma verificação geral limpa, as alterações poderão ser inspecionadas antes de serem confirmadas.

Jonathan Komar
fonte
-1

O seguinte funcionou para mim.

Eu tive muitas alterações locais e precisava descartar as que estão na cópia local e fazer check-out da última versão estável no SVN.

  1. Verifique o status de todos os arquivos, incluindo os arquivos ignorados.

  2. Grep todas as linhas para obter os arquivos adicionados e ignorados recentemente.

  3. Substitua aqueles por //.

  4. e rm -rf todas as linhas.

    svn status --no-ignore | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

shah1988
fonte