Você está na página 1de 18

Uptodate - U2D

Branch, Tag e Merge

Tutorial TortoiseSVN

Por: Thales Campelo da Conceio tconceicao@u2d.com.br

Tutorial TortoiseSVN
Este tutorial ir abordar: criao de um repositrio local; utilizao de branch, tag e merge como mtodos de controle para desenvolvimento;

(Esse tutorial est sendo replicado em um repositrio local enquanto est sendo produzido). Baixe o Tortoise SVN no link http://tortoisesvn.sourceforge.net/, nesse link tambm tem o pack para portugs do Brasil. Depois de baixado e instalado ter de reiniciar o windows para podermos comear o trabalho. Aps reiniciado, vamos criar a nossa pasta local que servir de repositrio. Abra o windows explorer, escolha um local e com o boto direito do mouse, selecione Pasta.

D a pasta o nome de SVNLab por exemplo. Deixe-a vazia.

Criado a pasta que nos servir como repositrio local, iremos definitivamente cri-lo no SVN. Com o boto direito do mouse sob a pasta selecione: TortoiseSVN/Create repository here.

Nesta parte, irei explicar como montar a estrutura branch/tag/trunk. Crie em qualquer local uma pasta, no precisa nome-la, abra e dentro dela crie uma pasta com o nome do seu projeto, por exemplo Calc, e dentro desta pasta crie as trs pastas branch/tag/trunk. legal nomear branches e tags no plural pois elas iro ramificar em outras pastas, o que no acontecer com o trunck j que ele sempre nico.

Feito isso voc j ter a estrutura pronta para ser importada para o SVN! Voc ainda pode antes de importar a estrutura colocar o contedo dentro do trunck para importar tudo de uma vez, ou importar o contedo separadamente. Eu optei por importar tudo de uma vez s, dentro da pasta trunck esto os arquivos Calc.java e Guia.txt. Calc.java o arquivo da classe java que quero manter o controle. Ao fazer a importao ele j criado no SVN sob um nmero de verso. Esta a primeira verso do arquivo. A partir da a cada commit realizada o SVN gerar uma nova verso. As pastas tambm possuem seus nmeros de controle e isso poder ser visto ao longo do manuseio do SVN. Mesmo definido que os arquivos sero ou no importados juntamente com as pastas, com o boto direito do mouse sob a primeira pasta criada (aquela que no foi dada nome, no meu caso New) e escolha TortoiseSVN/Import. Isso far que tudo que estiver dentro desta pasta v para o SVN.

Abrir uma janela com o campo URL of repositry. Neste campo voc ir indicar onde as pastas ser criadas dentro do repositrio. Como no estamos trabalhando com server, sempre indicaremos file:/// e o caminho onde criamos a pasta na nossa mquina. Da mesma forma se o repositrio estiver compartilhado em um outro computador numa mesma rede, file:///nome_maq/etc.

Indicado o caminho s clicar OK. Uma menasgem de log indicar que tudo foi adicionado com sucesso.

Para verificar, podemos conferir atravs do Repo Browser. Se voc tentar ver direto na pasta pelo Windows Explorer no conseguir ver, pois os repositrios SVN guardam os seus arquivos em um formato proprietrio que no podemos usar. Para abrir o Repo-browser, clique com o boto direito do mouse sob a pasta SVNLab e selecione TortoiseSVN/Repo-browser.

Esta tela surgir e nela poder confirmar que as pastas e arquivos foram importados.

Bom, como dito anteriormente, no podemos manipular os dados do SVN diretamente do seu repositrio e para tanto teremos que criar uma outra pasta que ser nosso local de trabalho com cpia daquilo que queremos manipular do repositrio, o nosso Working Copy. A sim podemos ver diretamente do Windows Explorer os arquivos do repositrio, lembrando que uma cpia do que est dentro do repositrio. Desta forma, dentro da minha pasta temp, que tenho usado como limbo para estes tipos de operaes, criarei a pasta MyWorkingSVNLab.

Com a pasta criada, agora irei preench-la com o arquivo do repositrio. Com o boto direito do mouse sob a pasta criada, seleciono TortoiseSVN/SVN Checkout. Isso far com que uma tela se abra pedindo a URL do repositrio e o diretrio para onde ser feito a cpia (campo Checkout directory). Tudo vir preenchido, porm bom conferir. O restante deixe o padro como estiver.

Bom, como o arquivo da minha classe (Calc.java) que irei trabalhar est na pasta trunk, dele que irei fazer o checkout. Tudo que estiver dentro dele tambm ser feito o checkout para minha pasta de trabalho, ou seja, o arquivo Guia.txt tambm vir. No tem problema, desde que eu altere somente o que for necessrio e nos arquivos necessrios. Posso tambm fazer o checkout somente do arquivo, ou de tudo se quiser. Depende do que for necessrio e mais lgico. Continuando, ao clicar em OK uma tela de log aparecer indicando os arquivos e pastas que foram levadas para a minha pasta de trabalho.

Agora eu posso ver na minha pasta os arquivos prontos para serem alterados. Toda vez que alguma alterao for feita e eu realizar o commit, uma nova verso ser gerada. O que acontece que quando temos muitos usurios trabalhando num mesmo projeto. Isso pode gerar problemas, conflitos de cdigos! Ns no queremos isso. E da vem o uso de branches, tags e merges. O conceito de branch e tag o mesmo. Ambos so screenshoots do trunk num determinado momento, porm o tag no aceita commits. Se quisermos nos separar do trunk e poder usar o commit temos que criar um branch. ele que nos permite sair do trunk e criarmos uma vertente pessoal do desenvolvimento sem ser prejudicado por terceiros e nem prejudicar terceiros. Assim, quando terminamos de fazer o que tinhamos de fazer voltamos com o cdigo para o trunk atravs do merge. Podemos usar o merge em trs ocasies, mas a mais usada a de reintegrao do branch. nesse ponto que o cdigo com do trunk realemente merge com o branch. A funo do merge unir duas frentes de verses em uma nica, juntando as duas. O tag apenas uma marcao de um ponto ou passo importante, por exemplo uma release ou uma verso de correo. Para entendermos ento como funciona este processo, vou criar vrias verses da classe Calc.java, criar tags para elas e uma branch e no final vou un-las atravs do merge. A classe se encontra desta forma: public class Calc { public Calc() { }

} Esta vazia, sem nada. A minha primeira release conter o mtodo soma. Ento irei alterar o meu arquivo com o cdigo necessrio e no final irei realizar o commit. Isso far com que eu tenha uma nova verso do arquivo no SVN e ento irei criar uma tag para identificar essa verso. Usarei o JCreator para editar o cdigo e salv-lo. Antes de salvar, o arquivo estava com um marcador verde sob o seu cone na pasta, depois de salvar esta marcao passou para cor vermelha o que quer dizer que a verso do cdigo no repositrio est diferente da cpia na mquina local.

Feito as devidas alteraes irei realizar o commit. Clico com o boto direito do mouse sob o arquivo Calc.java seleciono SVN Commit.... Isto far com que uma tela abra e nela podemos incluir comentrios que acharmos necessrio para identificar aquela verso que est sendo criada, eu simplesmente escrevi soma pois isso j basta para identificar a verso.

Depois disso o cone do arquivo voltar a ter uma marcao verde que significa que agora o arquivo do repositrio est idntico ao arquivo local. Ento irei marcar a nova verso do SVN com uma tag Release1.0, que a identifica como sendo minha primeira entrega. Criei um mtodo de soma que j pode ser usada mesmo sem ainda ter criado as outras. A forma de criar um branch ou uma tag a mesma. Sob a pasta destinada como o Working Copy clique com o boto direito do mouse v at TortoiseSVN/Branch/tag.... Isto far com que uma tela abra. a tela de dilogo onde vamos indicar aonde ficar essa marcao. No campo To URL indicaremos o caminho para onde ser criada a tag e como padro esta tela abrir apontando para trunk. No o que queremos. Quando definimos a estrutura e importamos para o SVN, criamos uma pasta tags exatamente para isso e para l que temos que apontar a criao da tag release1.0. Bom, ainda no existe dentro de tags um local definido para a nossa tag release1.0. Teremos que cri-la ento. Simples, ao definirmos o caminho no campo To URL vamos mudar o texto que est apontando para trunk e apont-lo para tags. E ainda podemos ir mais longe. Mesmo no existindo uma pasta chamada release1.0 dentro de tags podemos indic-la no texto (file:///D:/SVNLab/Calc/tags/release1.0), e assim a pasta ser criada automaticamente.

Caso seja necessrio, h um checkbox na base da tela que permite que o Working Copy, ao criar o branch/tag, seja mudado automaticamente para o branch ou tag que est sendo criado, ou seja, todo o contedo do WC Working Copy no mais estar apontando para o trunk e sim para o branch ou tag criado naquele momento. H tambm trs formas de definir a origem do branch mudando a opo do radiobutton Create copy in the repository from:. A primeira permitir que faamos um branch/tag da ltima reviso do SVN. A segunda nos permiti escolher qual reviso querermos e a ltima faz uma cpia exata do nosso WC, e isto implica cpia de arquivos alterados sem commit e verses de arquivos mais antigos, portanto a sua utilizao deve ser feita com cuidado pois quando criamos um branch, por exemplo, est implcito que este voltar para o trunk. Podemos conferir a criao da tag atravs do Repo-browser. Repare que a pasta da tag criada recebe um nmero de versionamento seguindo a numerao do trunk. Esse processo de commit e criao das tags se repete para os mtodos subtrao e diviso. Ou seja, a cada mtodo criado eu vou realizar commit e criar uma tag. Lembre dos comentrios e de seguir a nomenclatura das tags. Assim ficar:

Cada pasta de tags contm um mtodo a mais implementado que o seu antecessor. Porm, chega um momento que tenho que criar uma outra frente de desenvolvimento separada do trunk, pois no quero interferir no cdigo nem que outros interfiram no meu cdigo, ento usarei um branch! A forma de criao de um branch a mesma da tag, somente se diferencia no caminho. Portanto, o nosso branch ser criado dentro da pasta branches no repositrio sob o nome branch_potencia. O nome do branch deve ser escolhido de forma que identifique o seu propsito.

Bem, o branch est criado. Ele uma cpia do trunk, porm o meu WC ainda est apontando para o trunk e agora quero mud-lo para o branch e assim desenvolver a partir dele. Sob a pasta do WC clicando com o boto direito do mouse vamos at TortoiseSVN/Switch. Uma tela abrir pedindo o novo local. Por default vir o caminho de onde o WC estiver apontado, no meu caso o trunk. Escolha(atravs do boto)/Escreva o caminho da pasta do branch criado e selecione OK, pronto!!, isso far com que o meu WC trabalhe agora com o branch. Todas minhas alteraes e commits afetaro apenas os arquivos que esto no branch_potencia.

Bem, agora vou abrir o arquivo Calc.java para criar um mtodo de potncia, a princpio bem simples, pois eu no tenho muito tempo de pensar em uma forma otimizada. Vou salvar o arquivo o realizar commit e criar uma tag para identificar este ponto. A tag seguir a ordem do trunk. Eu fiz um branch no momento que o meu desenvolvimento no trunk estava na release3.0, ou seja, eu estou ampliando-o, criando uma variao dele. Portanto qualquer tag que eu quiser fazer vai seguir sua numerao, por exemplo a primeira ser release3.1. Neste momento o meu branch j passa a ser diferente do trunk. Posso dizer que para o meu projeto eu tenho duas vertentes de desenvolvimento: trunk e branch_potencia.

Depois que eu fiz o que tinha que fazer, voltarei para o trunk e deixarei um pouco o branch de lado. No vou usar o merge para unir o branch com o trunk nesse momento porque eu sei que ainda tenho que melhorar o meu mtodo. Na pasta do meu WC usando o comando Swicht do TortoiseSVN mudo-o agora para apontar o trunk. Vou abrir o arquivo Calc.java e criar mais um mtodo, o ltimo que estava faltando, o mtodo de multiplicao. Salvo o arquivo, realizo commit e crio uma tag. O nome da tag vai seguir a nomenclatura antiga, a ltima foi release3.0 e agora ser release4.0. visvel a baguna que fiz: parei meu desenvolvimento central, criei um branch inseri cdigo, depois voltei pro trunk e inseri mais cdigo, e agora vou bagunar mais ainda, vou mudar de novo o meu WC para branch_potencia e alterar o meu cdigo porque de repente me ocorreu uma forma de melhorar o meu mtodo potencia. Sigo o procedimento para alterar o WC abro o arquivo e altero o meu mtodo. Salvo e realizo commit. Crio uma tag release3.2, seguindo a nomenclatura dos tags da branch_potencia que anteriormente era release3.1. A seguir uma viso de como estar o repositrio.

Bem, agora eu tenho certeza de que minha branch de desenvolvimento para potncia terminou e eu quero integrar a branch com o trunk. Vou usar, finalmente, o merge! Meu WC est apontado para o branch_potencia. Mudo-o para o local de integrao que ser o trunk, ento mais uma usarei o switch. Feito isso, com o boto direito do mouse acesso TortoiseSVN/Merge. Uma tela abrir com trs opes. A primeira voc praticamente pede ao Subversion fazer isso: Calcule as alteraes que se faa necessrio para pegar a reviso 1 do branch A at a reviso 7 do branch A, e aplique estas alteraes para minha WC (trunk ou branch B). A segunda simplesmente voc pede ao Subversion reintegrar uma branch ao seu WC(trunk ou outro branch). E a terceira voc pede ao Subversion combine as diferenas de duas branchs diferentes para a sua WC. O que precisamos a segunda opo.

Ao selecionar Next>, outra tela abrir pedindo o local de onde dever buscar a revision para o merge. Como eu quero realizar o merge com branch_potencia indico o seu caminho. Repare para onde que o Working Copy est apontando.

Feito isto selecione Next>, agora uma tela de opes do merge abrir. Antes de selecionar o boto Merge, selecione o boto Test merge. Aparecer uma tela de conflito na operao. Isto, claro, devido ao fato de que os arquivos so diferentes!!!

Mas tudo bem. Feche esta janela e selecione o boto Merge. Outra tela com ttulo Resolve Conflict abrir. Esta tela para resolver aquele conflito que a tela anterior mencionava. Repare que o boto Resolved est desabilitado.

Selecione o boto Edit conflict. Este boto far que com se abra um editor e ele mostrar o cdigo dos dois arquivos. Repare bem que ele indica onde h o conflito e abaixo o resultado. Neste momento no soluo para o conflito e portanto ele substitui a rea de conflito com pontos de interrogao.

Para solucionar este problema, com o boto direito do mouse sob o cdigo marcado de vermelho do arquivo do trunk selecionamos a opo Use text block from 'mine' before 'theirs'. Isso significa que o cdigo do trunk vir antes do cdigo do branch. Se eu quisesse o contrrio usaria a outra opo.

Depois disso veremos que ele organizou o cdigo da forma que eu pedi.

Basta salvar e fechar o editor. Ao fechar a tela voltamos para a outra tela que chamou o editor,e repare que agora o boto Resolved est habilitado e exatamente ele que iremos selecionar.

Uma tela de log abrir indicando o processo.

Ao verificar no WC reparamos que o cone do TortoiseSVN ficou vermelho, isso claro porque a verso do documento que est em nossa mquina local est diferente da verso que est no trunk do repositrio devido ao merge.

Bom, neste momento temos a tarefa de reintegrao do branch ao trunk concludo. Na verdade ainda temos que realizar commit do documento para que a verso do trunk seja atualizada e conveniente tambm a crialo de uma tag. Toda as etapas que trabalhamos tambm podem ser acompanhadas pelo Revision graph.

Dvidas: Se mudarmos a nomenclatura das pastas deixa de funcionar? aconselhvel criar uma vertente de desenvolvimento a partir de uma tag? Por que sim, por que no? Prximos tpicos: Blame;

Você também pode gostar