Você está na página 1de 28

Conceitos e Exemplos em

Versionamento de Cdigo

30-40 minutos
Atualizado em 20 Ago 2014 falmeida1988@gmail.com

Exemplos com Subversion


Introduo
Um sistema de controle de verso de cdigo-fonte (VCS) um programa que
guarda todas as modificaes que levaram cada linha de arquivo do seu
projeto desde o seu estado inicial (provavelmente em branco) at o estado
atual, passando por todas as mudanas intermedirias.

Um VCS pode lhe ser til se voc, por exemplo:


deseja guardar a histria do seu projeto e se proteger contra eventuais
perdas, mudanas que causaram erros ou

pertence a uma equipe de desenvolvimento com 2 ou mais


desenvolvedores
Cenrios Comuns
Um desenvolvedor deseja mudar uma funcionalidade existente mas deseja
que a antiga fique disponvel enquanto a nova verso est sendo escrita;

Um desenvolvedor percebe que sua aplicao, que estava funcionando, agora


contm um erro, mas ele no consegue identificar qual mudana introduziu
este erro.

Dois desenvolvedores esto trabalhando cada um em uma tarefa, mas ambas


envolvem mudar um mesmo arquivo de cdigo; ambas as tarefas tm alta
prioridade ento um no pode esperar at que o outro acabe para ento
comear a trabalhar. As duas tarefas tm que ser feitas ao mesmo tempo.
Principais ferramentas
CVS

Subversion (SVN)

Team Foundation Server (TFS)

Git

Mercurial

Perforce
Repositrio
O repositrio (tambm chamado de repo) o lugar onde o seu projeto, bem
como todo o histrico de modificaes do mesmo, fica guardado.

Em geral ele localizado em outra mquina e identificado por uma url.

Seu repositrio reflete a histria do seu projeto, at a verso mais recente do


seu projeto (tambm chamada de HEAD).

Quando algum executa uma operao do tipo commit, o repositrio


atualizado com as modificaes introduzidas por aquele commit.
Repositrio (cont.)
Exemplo: criar um repositrio local na sua mquina

svnadmin create /home/usuario/meu-repo

Note que este repositrio s poder ser acessado de dentro da sua mquina
atravs do protocolo file://, por exemplo:*

svn list file:///home/usuario/meu-repo

comando para listar arquivos de um


repositrio
* A partir de outras mquinas, este repositrio ser acessado de outras formas; por exemplo, os protocolos svn+ssh// e http://.
Checkout
Uma operao do tipo checkout faz uma cpia do cdigo de um repositrio
para o seu diretrio atual.

Exemplos:
svn checkout http://example.com:9834/trunk minha_copia
Este comando faz uma cpia do cdigo cujo repositrio est em http://svn.example.com:9834/trunk
para o diretrio atual, sob o nome minha_copia/.

svn checkout svn+ssh://usuario@servidor/var/svnrepos/meu-repo


Este comando usa o protocolo ssh para se conectar ao servidor e faz uma cpia do cdigo em sua
mquina (para dentro de um diretrio chamado meu-repo/ pois no foi definido um nome alternativo
como no exemplo anterior)
Working copy
(tambm chamado de working directory)
A sua working copy a sua cpia do projeto.

Quando voc faz uma operao de checkout ou clone, o diretrio para onde os
arquivos do projeto foram copiados a sua working copy.

Nada do que voc faz na sua working copy publicado (para o seu repositrio
at que voc faa um commit), portanto modificaes, criao de arquivos e
remoo de arquivos na sua cpia local no afetam o seu repositrio.
Add
Um arquivo ou diretrio criado na sua working copy no versionado (tracked)
por default. Para que um VCS (nesse caso, o SVN) comece a versionar (isto ,
guardar o histrico de modificaes) de um arquivo, necessrio que se
execute o comando add:
(dentro de sua working copy)

svn add arquivo1.txt

Note que um comando do tipo commit s envia para o repositrio mudanas


em arquivos versionados (isto , arquivos em que se executou svn add).
Arquivos no versionados so ignorados pelo VCS.
Commit
A operao de commit atualiza o repositrio com modificaes feitas nos
arquivos versionados em uma cpia local.
uma pequena mensagem
explicando o commit e a sua
mensagem de commit razo

revision N
o estado do repositrio aps o N-
simo commit
Exemplos
svn commit a.txt b.txt -m "nova verso"
Este comando atualiza o repositrio de origem (de onde voc fez checkout) com as
mudanas feitas nos arquivos a.txt e b.txt.
Update
Uma operao de update faz a sua working copy refletir o estado atual do
repositrio.

Se, por exemplo, modificaes foram feitas por outro desenvolvedor no seu
repositrio de origem desde a ltima vez que voc fez uma operao de checkout,
uma operao de update ir modificar a sua working copy de modo a ficar igual ao
estado atual do repositrio.

Exemplos:
svn update arquivo1.txt sua working copy agora est no estado
como estava aps o 40 commit

svn update -r40


Revert
Uma operao do tipo revert descarta as modificaes em um arquivo na sua
working copy (ou seja, modificaes que ainda no sofreram commit), fazendo-
o ficar idntica ao ltimo commit do repositrio.

Exemplos:
svn revert arquivo1.txt

svn revert --depth=infinity .


A opo --depth=infinity faz a operao de revert ser feita em diretrios-filhos do
diretrio atual, recursivamente.
Branch
Um branch um artifcio suportado por vrios VCSs. Ele representa uma outra
linha de desenvolvimento.

Casos de uso:
Voc deseja comear a implementar uma funcionalidade nova
(grande e que necessitar de vrios commits) mas quer que sua
verso principal continue estvel enquanto a funcionalidade nova no
fica pronta.

Voc deseja fazer experimentos com funcionalidades novas mas no


deseja que a verso principal seja afetada.
Branch
Exemplo de criao um branch:
svn copy http://example.com/trunk \
http://example.com/branches/my-branch \
-m "criando um novo branch"

Cria um branch do repositrio, acessvel pela url http://example.com/branches/my-branch.


Pode-se fazer checkout deste como se fosse um repositrio normal.
Merge
Comando que gera uma verso final de um arquivo a partir de duas verses do
mesmo arquivo.

por exemplo, em dois branches


ou em duas revisions diferentes

Na maioria das vezes, no necessria interveno manual do usurio, pois


os VCSs conseguem fazer merges automticos para a maioria dos casos.

Quando um merge automtico no consegue ser feito, gerado um conflito


que deve ser resolvido manualmente.
Merge (cont.)
Exemplos:
svn merge http://example.com/branches/branch-a
Se voc executar este comando de dentro de uma working copy (e assumindo que o branch
branch-a foi criado a partir do mesmo repositrio), este comando far um merge do branch
branch-a com a sua working copy atual.
Conflitos
Conflitos acontecem quando o seu VCS no consegue, de forma automtica,
fundir em um arquivo novo mudanas oriundas de duas verses diferentes.

Conflitos podem surgir aps operaes de update ou merge.

Exemplo: conflito aps uma operao de update no SVN:


$ svn update
Updating '.':
Conflict discovered in 'foo.c'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:
Conflitos
Exemplo de um arquivo com marcadores de conflito (SVN):
arquivo1.txt parte comum s duas
verses
there are
<<<<<<< .mine
nine
=======
eight
>>>>>>> .r999 verso do branch atual (minha verso)

planets in the solar system

verso do outro branch ou revision (verso deles)


Resolvendo conflitos
Um mtodo simples de resolver conflitos simplesmente editar
(manualmente) o arquivo com marcadores de conflito e avisar ao SVN que o
conflito foi resolvido:
dizer ao SVN que a verso
final a verso a que est
editar o arquivo arquivo1.txt na working copy

svn resolve --accept working arquivo1.txt

svn commit -m "conflito resolvido!"

no esquecer de dar commit!


Resolvendo conflitos (cont.)
Voc tambm pode mandar o SVN aceitar uma das verses em detrimento da
outra:
Exemplos:
svn resolve --accept mine-conflict arquivo1.txt
Assumindo que o arquivo arquivo1.txt est em conflito, este comando adota a minha
verso do contedo para todos os conflitos.

svn resolve --accept theirs-conflict arquivo2.txt


A verso do branch remoto (deles) escolhida e a minha verso, bem como os marcadores
de conflito, so retirados do arquivo.

N.B.: Outras opes como theirs-full, mine-conflict e theirs-conflict tambm esto disponveis.
Melhores prticas
D commit frequentemente
quanto mais commits, mais lugares para onde voc pode fazer revert
mais fcil fazer merge se as duas verses de um arquivo no esto muito
diferentes entre si.
voc se fora a dividir o desenvolvimento em unidades pequenas e
autocontidas de tarefas.
Ajuda a contar a histria do projeto atravs dos commits.

D commit de todos os arquivos relacionados a uma mudana de forma


nica, incluindo todos eles; em outras palavras, seu commit deve ter
unidade lgica.
Melhores prticas (cont.)
Todos os commits devem deixar o software funcionando.
Ou seja: todos os testes devem estar passando.
Ou seja: nunca d commit antes de testar.

No d commit em arquivos gerados


Arquivos executveis (no caso de linguagens compiladas) ou arquivos de
output gerados por ferramentas no devem ser versionados.

No d commit em arquivos de preferncias


Arquivos como .vimrc (vim), .nbproject/ (netbeans) ou .idea/
(IntelliJ) so pessoais e no deve ser versionados.
Melhores prticas (cont.)
Use mensagens de commit descritivas e explicativas
Lembre-se que voc no se lembrar do que fez hoje daqui a alguns
meses.
As mensagens de commit servem como documentao do projeto.

No d commit em coisas feitas pela metade


Divida coisas grandes em unidades lgicas menores e d commit em
cada uma delas separadamente.
Seno, espere at o fim da tarefa para dar commit.
XTRA: Comandos teis para o dia-a-
dia (SVN)
svn delete arquivo1.txt
Remove um arquivo da sua working copy e do repositrio (quando voc der commit, o arquivo
vai ser removido do repositrio)

svn delete --keep-local arquivo1.txt


Remove um arquivo do repositrio mas o deixa na sua working copy (ele fica no estado
untracked).

svn mv arquivo1.txt ../arquivo2.txt


Mover (e/ou renomear) um arquivo, deixando claro para o SVN que se trata do mesmo arquivo.
XTRA: Repositrios centralizados e
descentralizados
Em um VCS centralizado, s h uma cpia do repositrio. Cada usurio s tem
acesso sua cpia dos arquivos (no seu working directory); quando voc
executa um commit, o repositrio central atualizado.

Em um VCS descentralizado (DVCS), no h um nico repositrio; cada


usurio guarda uma cpia do repositrio inteiro; o comando commit envia suas
modificaes para a sua cpia do repositrio.

Para interagir com repositrios remotos so usados alguns comandos novos,


como fetch, pull e push.
XTRA: push e pull
Como VCSs descentralizados podem ter vrias cpias do mesmo repositrio
em existncia, h dois comandos extras que definem operaes entre um
repositrio local e um outro repositrio remoto:

comando push
Envia o seu repositrio (com todos os seus commits) para um
repositrio remoto, atualizando o mesmo (pode ser rejeitado).

comando pull
Tenta atualizar o seu repositrio local, incorporando modificaes
vindas de um repositrio remoto (pode haver conflitos).
XTRA: Migraes - versionamento
de bancos de dados
Dois projetos rodando a mesma verso do cdigo mas com bancos de
dados com estruturas diferentes (tabelas e atributos) vo exibir
comportamento diferente.

Hoje em dia (2014) este j um problema bem resolvido pela maioria dos
frameworks em existncia.

Migraes consistem em fazer cada mudana na estrutura do seu banco


de dados atravs de arquivos.
Referncias
Fundamentals of Software Version Control Video Series [Pago]
Revision Control [Wikipedia]
Version Control By Example [Livro em PDF Original]
Git - Undoing Things
Git - Resolvendo conflitos
Quick Git Guide