Como reverto um commit SVN?


303

Encontrei vários exemplos de como reverter um commit SVN como

svn merge -r [current_version]:[previous_version] [repository_url]

ou

svn merge -c -[R] .

Mas nenhum deles parece funcionar. Eu tentei esses comandos e verifiquei os arquivos que foram alterados manualmente.

Como reverto um commit com o número de revisão 1944? Como verifico se a reversão foi feita (sem olhar no arquivo real, as alterações foram revertidas)?


16
Você nunca aceitou uma resposta porque nenhum deles funcionou?
2rs2ts

4
Se você quiser uma resposta literal, use "svn merge -c -1944". Para verificar se funcionou: "svn diff"
John Sampson



E se o caso, eu tenho 1943 (boa consolidação), 1944 (má consolidação), 1945 (boa consolidação) e 1946 (boa consolidação). Agora eu quero remover apenas 1944 (commit incorreto) e manter todas as revisões após 1944, significa que eu quero um resultado como 1943,1945,1946 (remover apenas 1944) de todas essas revisões, o que devo fazer?
Bhavin_m 1/11

Respostas:


448

Ambos os exemplos devem funcionar, mas

svn merge -r UPREV:LOWREV . desfazer intervalo

svn merge -c -REV . desfazer revisão única

nesta sintaxe - se o diretório atual for WC e (como deve ser feito após cada mesclagem), você confirmará os resultados

Deseja ver logs?


9
@dwjohnston - sim, mescla sempre realizada no WC e não é tarefa do lado do servidor
preguiçoso Badger

14
svn: Merge source required. Sem dados.
2rs2ts

27
Parece que você @ 2rs2ts esqueceu o ponto à direita para designar 'faça isso no diretório atual'.
Dalin 28/04

14
você também pode fazer vários commits únicos ao mesmo tempo:svn merge -c -42587,-42589 .
mlathe

1
@ahnbizcad - revisão (single), o que você quiser desfazer
preguiçoso Badger

130

Se você estiver usando o cliente TortoiseSVN , isso é feito facilmente através da caixa de diálogo Mostrar log .


5
Esta é de longe a maneira mais fácil de fazê-lo
Markku K.

5
Isso está desatualizado. Não existe mais um menu de contexto disponível para o cliente na versão atual.
user1789573

19
O que? O TortoiseSVN É um menu de contexto, além das caixas de diálogo que ele gera. O que você quer dizer com "não existe mais um menu de contexto"? Certamente existe!
Ben

@ Ben, acho que o user1789573 estava ficando um pouco enganado com a menção explícita de "Menu de Contexto" no tutorial vinculado à resposta.
Tom Catullo

2
Caso você veja isso mais tarde, ele ainda está lá. Na tela de registro de show, clique com o botão direito do mouse na revisão e há uma opção "Reverter para esta revisão". Isso está no TortoiseSVN 1.9.4 Build 27285. Acabei de usá-lo e posso dizer que funciona muito bem.
Bruce Van Horn

65

svn merge -r 1944:1943 .deve reverter as alterações do r1944 na sua cópia de trabalho. Você pode revisar as alterações em sua cópia de trabalho (com diff), mas precisaria confirmar, a fim de aplicar a reversão no repositório.


4
Não funciona, requer fonte de mesclagem. Tentei em svn merge -r 1944:1943 .vez disso, mas nada mudou.
Alex

O repositório avançou desde r1944? Em caso afirmativo, existem alterações conflitantes nas mesmas linhas que as alterações entre r1943 e r1944?
11/11/2012

Estou na revisão 1945 e não parece haver conflito. Nem svn statusnem svn diffdá nada.
11114 Alex

7
Erro:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
Mas svn merge -r 1945:1943 .parece ter funcionado. Eu acho que entendi: você precisa mesclar a versão de 'antes' do 'ruim' no seu repositório de trabalho. Tudo bem quando você deseja fazer uma simples 'reversão' da confirmação anterior. Mas e se você quiser reverter as alterações feitas na versão 1900?
11114 Alex

45

Primeiro, reverta a cópia de trabalho para 1943.

> svn merge -c -1943 .

Segundo, verifique o que está prestes a ser confirmado.

> svn status

Terceiro, confirme a versão 1945.

> svn commit -m "Fix bad commit."

Quarto, observe o novo log.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
E se o caso, eu tenho 1943 (boa consolidação), 1944 (má consolidação), 1945 (boa consolidação) e 1946 (boa consolidação). Agora eu quero remover apenas 1944 (commit incorreto) e manter todas as revisões após 1944, significa que eu quero um resultado como 1943,1945,1946 (remover apenas 1944) de todas essas revisões, o que devo fazer?
Bhavin_m 1/11

26

É impossível "descomprimir" uma revisão, mas você pode reverter sua cópia de trabalho para a versão 1943 e confirmar como a versão 1945. As versões 1943 e 1945 serão idênticas, revertendo efetivamente as alterações.


18
Apenas para ser irritantemente preciso, eu gostaria de comentar que, se você tiver acesso de administrador ao repositório, poderá "descomprimir". Isso criando um repositório clone até uma determinada revisão usando svn dumpe então svn load. Mas, é claro, isso não deve ser usado em circunstâncias normais.
onon15

4
Não quero cancelar a confirmação, quero criar um novo número de confirmação com uma certa confirmação invertida. Os sets dizem que eu fiz o check-out da versão 1944, fiz um commit em 1945, que eu quero 'reverter'. Quero ter uma versão 1946, cujos arquivos sejam idênticos aos da versão 1944. (Exceto a história, é claro). Mas a questão permanece: como fazer isso? Quais são os comandos?
11114 Alex

//, Alex, também estou interessado nisso, especialmente em algo análogo a $ git revert. Achei um pouco difícil aprender SVN depois de usar o Git por tanto tempo.
Nathan Basanese

10

A seguir, será executado a seco, como diz. HEAD sendo a versão atual, PREV é anterior, então o caminho para o seu arquivo ou item confirmado:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Se a execução a seco parecer boa, execute o comando sem o comando --dry-run

Verifique a alteração na revisão e confirme novamente. Para procurar números de versão, tente:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Isso exige que a cópia local seja diferente da revisão incorreta?
Eliezer Miron

2

Alex, tente o seguinte: svn merge [WorkingFolderPath] -r 1944: 1943


2

Embora as sugestões fornecidas já possam funcionar para algumas pessoas, elas não funcionam no meu caso. Ao realizar a mesclagem, os usuários nos rev 1443quais atualizam rev 1445ainda sincronizam todos os arquivos alterados, 1444mesmo que sejam iguais à 1443mesclagem. Eu precisava que os usuários finais não vissem a atualização.

Se você deseja ocultar completamente a confirmação, é possível criando uma nova ramificação na revisão correta e trocando as ramificações. A única coisa é que você precisa remover e adicionar novamente todos os bloqueios.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Isso funcionou para mim, talvez seja útil para alguém lá fora =)


2
svn merge -c -M PATH

Isso salvou minha vida.

Eu estava tendo o mesmo problema, depois de reverter também não estava vendo o código antigo. Depois de executar o comando acima, recebi um código de versão antigo limpo.


1

Eu tentei o acima, ( svn merge) e você está certo, sim. Contudo

svn update -r <revision> <target> [-R]

parece funcionar, mas não é permanente (meu svn está simplesmente mostrando uma revisão antiga). Então eu tive que

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

No meu caso particular, meu objetivo é interfaces/AngelInterface.php. Fiz alterações no arquivo, confirmei-as, atualizei o computador de compilação, executei o compilador phpdoc e descobri que minhas alterações eram uma perda de tempo. svn log interfaces/AngelInterface.phpmostra minha alteração como r22060 e a confirmação anterior nesse arquivo foi r22059. Então eu posso svn update -r 22059 interfaces/AngelInterface.phpe acabo com o código como estava em -r22059 novamente. Então :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Como alternativa, eu poderia fazer a mesma coisa em um diretório, especificando . -Rno lugar de interfaces/AngelInterface.phptodos os itens acima.


1
Uma outra coisa, como já foi dito, o que você não pode fazer é remover o commit do histórico, como você pode fazer no git, invadindo diretamente os árbitros. Tudo o que você pode fazer é usar o repositório para alterar sua fonte de acordo com a sua intenção e confirmar isso como uma alteração.
sibaz 5/09/14

Depois de investigar mais, vejo que é possível remover o commit do histórico usando o svnadmin, mas você é fortemente desaconselhado. Veja stackoverflow.com/questions/5566327/…
sibaz

0

Se você deseja remover completamente as confirmações do histórico, também pode fazer um despejo do repositório em uma revisão específica e importá-lo. Especificamente:

svnrdump dump -r 1:<rev> <url> > filename.dump

O comando svnrdump executa a mesma função que o svnadmin dump, mas funciona em um repositório remoto.

Em seguida, basta importar o arquivo de despejo para o seu repositório de sua escolha. Isso foi testado para funcionar bem no Beanstalk.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.