Páginas

Sunday, August 24, 2008

Desfazendo mudanças em um repositório SVN


Uma das vantagens de usar um sistema de controle de versão, como o Subversion, é a possibilidade de voltar atrás quando uma alteração foi indesejada.
Costumo falar para meus amigos que devemos commitar o código freqüentemente, sempre, sempre, sempre. O trabalho deve ser feito de forma incremental, uma pequena tarefas/alteração por vez, em passos de bebê.

Para desfazer uma mudança já commitada no repositório, basta seguir os passos descritos aqui: http://svnbook.red-bean.com/en/1.1/ch04s04.html

Suponha que você está trabalhando numa cópia de trabalho de /calc/trunk, e então descobre que uma mudança feita na revisão 303, que alterou o arquivo integer.c, está completamente equivocada. A alteração nunca deveria ter sido commitada. Você pode utilizar o comando svn merge para "desfazer" a mudança na sua cópia de trabalho, e depois commitar a modificação local para o repositório. Tudo que você precisa fazer é especificar uma diferenciação reversa:

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U integer.c

$ svn status
M integer.c

$ svn diff

# verifique se a alteração indesejada foi removida


$ svn commit -m "Desfazendo mudança commitada em r303."
Sending integer.c
Transmitting file data .
Committed revision 350.

Uma revisão no repositório funciona como um grupo específico de alterações (changesets). Usando a opção -r, você está pedindo que o svn merge aplique um changeset, ou um conjunto deles, a sua cópia de trabalho local. No caso acima, aplicamos o changeset #303 de forma reversa.

Lembre-se que ao desfazer uma mudança, é recomendável usar o svn status e svn diff para confirmar que seu trabalho está no estado correto, e depois usar o svn commit para enviar a versão final ao repositório.

Se você está pensando: "eu não desfiz um commit de verdade, certo? A mudança ainda está lá na revisão 303. Se alguém fizer checkout de uma versão entre 303 e 349, verão a mudança indesejada!"
Isso mesmo, o svn merge apenas "remove" a mudança indesejada do HEAD (última revisão) do repositório.

Dica extra:

Para saber qual a versão atual do repositório, use o comando svn info.
Exemplos:
  • Informações úteis sobre um arquivo:
$ svn info foo.c
Path: foo.c
Name: foo.c
URL: http://svn.red-bean.com/repos/test/foo.c
Revision: 4417
Node Kind: file
Schedule: normal
Last Changed Author: sally
Last Changed Rev: 20
Last Changed Date: 2003-01-13 16:43:13 -0600 (Mon, 13 Jan 2003)
Text Last Updated: 2003-01-16 21:18:16 -0600 (Thu, 16 Jan 2003)
Properties Last Updated: 2003-01-13 21:50:19 -0600 (Mon, 13 Jan 2003)
Checksum: /3L38YwzhT93BWvgpdF6Zw==


Informação sobre diretórios:
$ svn info vendors
Path: trunk
URL: http://svn.red-bean.com/repos/test/vendors
Revision: 19
Node Kind: directory
Schedule: normal
Last Changed Author: harry
Last Changed Rev: 19
Last Changed Date: 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003)

No comments: