
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.htmlSuponha 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)