SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
Conceitos e Exemplos em
Versionamento de Código
30-40 minutos
Atualizado em 20 Ago 2014 falmeida1988@gmail.com
Exemplos com Subversion
Introdução
Um sistema de controle de versão de código-fonte (VCS) é um programa que
guarda todas as modificações 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 mudanças intermediárias.
Um VCS pode lhe ser útil se você, por exemplo:
● deseja guardar a história do seu projeto e se proteger contra eventuais
perdas, mudanças que causaram erros ou
● pertence a uma equipe de desenvolvimento com 2 ou mais
desenvolvedores
Cenários Comuns
● Um desenvolvedor deseja mudar uma funcionalidade existente mas deseja
que a antiga fique disponível enquanto a nova versão está sendo escrita;
● Um desenvolvedor percebe que sua aplicação, que estava funcionando, agora
contém um erro, mas ele não consegue identificar qual mudança introduziu
este erro.
● Dois desenvolvedores estão trabalhando cada um em uma tarefa, mas ambas
envolvem mudar um mesmo arquivo de código; ambas as tarefas têm alta
prioridade então um não pode esperar até que o outro acabe para então
começar a trabalhar. As duas tarefas têm que ser feitas ao mesmo tempo.
Principais ferramentas
● CVS
● Subversion (SVN)
● Team Foundation Server (TFS)
● Git
● Mercurial
● Perforce
Repositório
O repositório (também chamado de repo) é o lugar onde o seu projeto, bem
como todo o histórico de modificações do mesmo, fica guardado.
Em geral ele é localizado em outra máquina e é identificado por uma url.
Seu repositório reflete a história do seu projeto, até a versão mais recente do
seu projeto (também chamada de HEAD).
Quando alguém executa uma operação do tipo commit, o repositório é
atualizado com as modificações introduzidas por aquele commit.
Repositório (cont.)
Exemplo: criar um repositório local na sua máquina
● svnadmin create /home/usuario/meu-repo
Note que este repositório só poderá ser acessado de dentro da sua máquina
através do protocolo file://, por exemplo:*
● svn list file:///home/usuario/meu-repo
* A partir de outras máquinas, este repositório ser acessado de outras formas; por exemplo, os protocolos svn+ssh//e http://.
comando para listar arquivos de um
repositório
Checkout
Uma operação do tipo checkout faz uma cópia do código de um repositório
para o seu diretório atual.
Exemplos:
● svn checkout http://example.com:9834/trunk minha_copia
Este comando faz uma cópia do código cujo repositório está em http://svn.example.com:9834/trunk
para o diretório 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 cópia do código em sua
máquina (para dentro de um diretório chamado meu-repo/ pois não foi definido um nome alternativo
como no exemplo anterior)
Working copy
(também chamado de working directory)
A sua working copy é a sua cópia do projeto.
Quando você faz uma operação de checkout ou clone, o diretório 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 repositório
até que você faça um commit), portanto modificações, criação de arquivos e
remoção de arquivos na sua cópia local não afetam o seu repositório.
Add
Um arquivo ou diretório criado na sua working copy não é versionado (tracked)
por default. Para que um VCS (nesse caso, o SVN) comece a versionar (isto é,
guardar o histórico de modificações) de um arquivo, é necessário 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 repositório mudanças
em arquivos versionados (isto é, arquivos em que se executou svn add).
Arquivos não versionados são ignorados pelo VCS.
Commit
A operação de commit atualiza o repositório com modificações feitas nos
arquivos versionados em uma cópia local.
● mensagem de commit
● revision N
Exemplos
● svn commit a.txt b.txt -m "nova versão"
Este comando atualiza o repositório de origem (de onde você fez checkout) com as
mudanças feitas nos arquivos a.txt e b.txt.
uma pequena mensagem
explicando o commit e a sua
razão
o estado do repositório após o N-
ésimo commit
Update
Uma operação de update faz a sua working copy refletir o estado atual do
repositório.
Se, por exemplo, modificações foram feitas por outro desenvolvedor no seu
repositório de origem desde a última vez que você fez uma operação de checkout,
uma operação de update irá modificar a sua working copy de modo a ficar igual ao
estado atual do repositório.
Exemplos:
● svn update arquivo1.txt
● svn update -r40
sua working copy agora está no estado
como estava após o 40º commit
Revert
Uma operação do tipo revert descarta as modificações em um arquivo na sua
working copy (ou seja, modificações que ainda não sofreram commit), fazendo-
o ficar idêntica ao último commit do repositório.
Exemplos:
● svn revert arquivo1.txt
● svn revert --depth=infinity .
A opção --depth=infinity faz a operação de revert ser feita em diretórios-filhos do
diretório atual, recursivamente.
Branch
Um branch é um artifício suportado por vários VCSs. Ele representa uma outra
linha de desenvolvimento.
Casos de uso:
● Você deseja começar a implementar uma funcionalidade nova
(grande e que necessitará de vários commits) mas quer que sua
versão principal continue estável enquanto a funcionalidade nova não
fica pronta.
● Você deseja fazer experimentos com funcionalidades novas mas não
deseja que a versão principal seja afetada.
Branch
Exemplo de criação um branch:
● svn copy http://example.com/trunk 
http://example.com/branches/my-branch 
-m "criando um novo branch"
Cria um branch do repositório, acessível pela url http://example.com/branches/my-branch.
Pode-se fazer checkout deste como se fosse um repositório normal.
Merge
● Comando que gera uma versão final de um arquivo a partir de duas versões do
mesmo arquivo.
● Na maioria das vezes, não é necessária intervenção manual do usuário, pois
os VCSs conseguem fazer merges automáticos para a maioria dos casos.
● Quando um merge automático não consegue ser feito, é gerado um conflito
que deve ser resolvido manualmente.
por exemplo, em dois branches
ou em duas revisions diferentes
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 repositório), este comando fará um merge do branch
branch-a com a sua working copy atual.
Conflitos
Conflitos acontecem quando o seu VCS não consegue, de forma automática,
fundir em um arquivo novo mudanças oriundas de duas versões diferentes.
Conflitos podem surgir após operações de update ou merge.
Exemplo: conflito após uma operação 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
there are
<<<<<<< .mine
nine
=======
eight
>>>>>>> .r999
planets in the solar system
parte comum às duas
versões
versão do branch atual (“minha” versão)
versão do outro branch ou revision (versão “deles”)
Resolvendo conflitos
Um método simples de resolver conflitos é simplesmente editar
(manualmente) o arquivo com marcadores de conflito e avisar ao SVN que o
conflito foi resolvido:
● editar o arquivo arquivo1.txt
● svn resolve --accept working arquivo1.txt
● svn commit -m "conflito resolvido!"
não esquecer de dar commit!
dizer ao SVN que a versão
final é a versão é a que está
na working copy
Resolvendo conflitos (cont.)
Você também pode mandar o SVN aceitar uma das versões 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”
versão do conteúdo para todos os conflitos.
● svn resolve --accept theirs-conflict arquivo2.txt
A versão do branch remoto (“deles”) é escolhida e a minha versão, bem como os marcadores
de conflito, são retirados do arquivo.
N.B.: Outras opções como theirs-full, mine-conflict e theirs-conflict também estão disponíveis.
Melhores práticas
● Dê commit frequentemente
○ quanto mais commits, mais lugares para onde você pode fazer revert
○ mais fácil fazer merge se as duas versões de um arquivo não estão muito
diferentes entre si.
○ você se força a dividir o desenvolvimento em unidades pequenas e
autocontidas de tarefas.
○ Ajuda a contar a ‘história’ do projeto através dos commits.
● Dê commit de todos os arquivos relacionados a uma mudança de forma
única, incluindo todos eles; em outras palavras, seu commit deve ter
unidade lógica.
Melhores práticas (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.
● Não dê commit em arquivos gerados
○ Arquivos executáveis (no caso de linguagens compiladas) ou arquivos de
output gerados por ferramentas não devem ser versionados.
● Não dê commit em arquivos de preferências
○ Arquivos como .vimrc (vim), .nbproject/ (netbeans) ou .idea/
(IntelliJ) são pessoais e não deve ser versionados.
Melhores práticas (cont.)
● Use mensagens de commit descritivas e explicativas
○ Lembre-se que você não se lembrará do que fez hoje daqui a alguns
meses.
○ As mensagens de commit servem como documentação do projeto.
● Não dê commit em coisas feitas pela metade
○ Divida coisas grandes em unidades lógicas menores e dê commit em
cada uma delas separadamente.
○ Senão, 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 repositório (quando você der commit, o arquivo
vai ser removido do repositório)
● svn delete --keep-local arquivo1.txt
Remove um arquivo do repositório 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: Repositórios centralizados e
descentralizados
● Em um VCS centralizado, só há uma cópia do repositório. Cada usuário só tem
acesso à sua cópia dos arquivos (no seu working directory); quando você
executa um commit, o repositório central é atualizado.
● Em um VCS descentralizado (DVCS), não há um único repositório; cada
usuário guarda uma cópia do repositório inteiro; o comando commit envia suas
modificações para a sua cópia do repositório.
● Para interagir com repositórios remotos são usados alguns comandos novos,
como fetch, pull e push.
XTRA: push e pull
Como VCSs descentralizados podem ter várias cópias do mesmo repositório
em existência, há dois comandos extras que definem operações entre um
repositório local e um outro repositório remoto:
● comando push
○ Envia o seu repositório (com todos os seus commits) para um
repositório remoto, atualizando o mesmo (pode ser rejeitado).
● comando pull
○ Tenta atualizar o seu repositório local, incorporando modificações
vindas de um repositório remoto (pode haver conflitos).
XTRA: Migrações - versionamento
de bancos de dados
● Dois projetos rodando a mesma versão do código mas com bancos de
dados com estruturas diferentes (tabelas e atributos) vão exibir
comportamento diferente.
● Hoje em dia (2014) este já é um problema bem resolvido pela maioria dos
frameworks em existência.
● Migrações consistem em fazer cada mudança na estrutura do seu banco
de dados através de arquivos.
Referências
● 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

Mais conteúdo relacionado

Mais procurados

Sistemas de controle de versão
Sistemas de controle de versãoSistemas de controle de versão
Sistemas de controle de versãoMarcos Pessoa
 
Introduction to Git Version Control System
Introduction to Git Version Control SystemIntroduction to Git Version Control System
Introduction to Git Version Control SystemOleksandr Zaitsev
 
Intro to git and git hub
Intro to git and git hubIntro to git and git hub
Intro to git and git hubVenkat Malladi
 
Aula 01- web designer
Aula 01- web designerAula 01- web designer
Aula 01- web designerRoney Sousa
 
Version control system and Git
Version control system and GitVersion control system and Git
Version control system and Gitramubonkuri
 
Git Introduction
Git IntroductionGit Introduction
Git IntroductionGareth Hall
 
Version control system
Version control systemVersion control system
Version control systemAndrew Liu
 
Understanding GIT and Version Control
Understanding GIT and Version ControlUnderstanding GIT and Version Control
Understanding GIT and Version ControlSourabh Sahu
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An IntroductionBehzad Altaf
 
What's New for GitLab CI/CD February 2020
What's New for GitLab CI/CD February 2020What's New for GitLab CI/CD February 2020
What's New for GitLab CI/CD February 2020Noa Harel
 
Dealing with Merge Conflicts in Git
Dealing with Merge Conflicts in GitDealing with Merge Conflicts in Git
Dealing with Merge Conflicts in Gitgittower
 

Mais procurados (20)

GitHub Basics - Derek Bable
GitHub Basics - Derek BableGitHub Basics - Derek Bable
GitHub Basics - Derek Bable
 
Sistemas de controle de versão
Sistemas de controle de versãoSistemas de controle de versão
Sistemas de controle de versão
 
Git e GitHub - Conceitos Básicos
Git e GitHub - Conceitos BásicosGit e GitHub - Conceitos Básicos
Git e GitHub - Conceitos Básicos
 
Git
GitGit
Git
 
Git & GitLab
Git & GitLabGit & GitLab
Git & GitLab
 
Introduction to Git Version Control System
Introduction to Git Version Control SystemIntroduction to Git Version Control System
Introduction to Git Version Control System
 
Intro to git and git hub
Intro to git and git hubIntro to git and git hub
Intro to git and git hub
 
Aula 01- web designer
Aula 01- web designerAula 01- web designer
Aula 01- web designer
 
Git and github 101
Git and github 101Git and github 101
Git and github 101
 
Version control system and Git
Version control system and GitVersion control system and Git
Version control system and Git
 
Git Introduction
Git IntroductionGit Introduction
Git Introduction
 
Version control system
Version control systemVersion control system
Version control system
 
Understanding GIT and Version Control
Understanding GIT and Version ControlUnderstanding GIT and Version Control
Understanding GIT and Version Control
 
Git - An Introduction
Git - An IntroductionGit - An Introduction
Git - An Introduction
 
What's New for GitLab CI/CD February 2020
What's New for GitLab CI/CD February 2020What's New for GitLab CI/CD February 2020
What's New for GitLab CI/CD February 2020
 
Git basics
Git basicsGit basics
Git basics
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
Git in 10 minutes
Git in 10 minutesGit in 10 minutes
Git in 10 minutes
 
Dealing with Merge Conflicts in Git
Dealing with Merge Conflicts in GitDealing with Merge Conflicts in Git
Dealing with Merge Conflicts in Git
 
Git 101 for Beginners
Git 101 for Beginners Git 101 for Beginners
Git 101 for Beginners
 

Destaque

Sistemas de Controle de Versão
Sistemas de Controle de VersãoSistemas de Controle de Versão
Sistemas de Controle de VersãoJonathas Silva
 
Sistema de Controle de Versão - CVS, SVN e GIT
Sistema de Controle de Versão - CVS, SVN e GITSistema de Controle de Versão - CVS, SVN e GIT
Sistema de Controle de Versão - CVS, SVN e GITGabriel Rubens
 
Sistemas de controle de versão
Sistemas de controle de versãoSistemas de controle de versão
Sistemas de controle de versãoocfelipe
 
Introdução à Gerência de configuração de Software
Introdução à Gerência de configuração de SoftwareIntrodução à Gerência de configuração de Software
Introdução à Gerência de configuração de SoftwareLucas Amaral
 
Git vs cvs ece2011
Git vs cvs ece2011Git vs cvs ece2011
Git vs cvs ece2011da152
 
Github git-cheat-sheet
Github git-cheat-sheetGithub git-cheat-sheet
Github git-cheat-sheetAbdul Basit
 
Git - The Incomplete Introduction
Git - The Incomplete IntroductionGit - The Incomplete Introduction
Git - The Incomplete Introductionrschwietzke
 
Apresentação do SAEO na Administração Pública
Apresentação do SAEO na Administração PúblicaApresentação do SAEO na Administração Pública
Apresentação do SAEO na Administração PúblicaMarco Rosner
 
[Mini-curso] Sistema de Controle de Versão
[Mini-curso] Sistema de Controle de Versão[Mini-curso] Sistema de Controle de Versão
[Mini-curso] Sistema de Controle de VersãoMarco Rosner
 
QConSP: Vivenciando dev ops para além da automação de infraestrutura
QConSP: Vivenciando dev ops para além da automação de infraestruturaQConSP: Vivenciando dev ops para além da automação de infraestrutura
QConSP: Vivenciando dev ops para além da automação de infraestruturaDiego Pacheco
 
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVN
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVNControle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVN
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVNFelipe Queiroz
 
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version Control
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version ControlJoomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version Control
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version ControlJoomla!Day Brasil
 
Controle de Mudanças com GitHub
Controle de Mudanças com GitHubControle de Mudanças com GitHub
Controle de Mudanças com GitHubBruno Furtado
 
Introdução ao Sistema de Controle de Versão
Introdução ao Sistema de Controle de VersãoIntrodução ao Sistema de Controle de Versão
Introdução ao Sistema de Controle de VersãoFernando Machado
 
GCS - Aula 09 - GCS Ágil
GCS - Aula 09 - GCS ÁgilGCS - Aula 09 - GCS Ágil
GCS - Aula 09 - GCS ÁgilMisael Santos
 
Workshop sistema de versionamento de código - git
Workshop  sistema de versionamento de código - gitWorkshop  sistema de versionamento de código - git
Workshop sistema de versionamento de código - gitThiago Filadelfo
 
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...especificacoes.com
 
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataforma
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataformaWine.com.br - De zero a 300 milhões de faturamento na mesma plataforma
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataformaPaulo César M Jeveaux
 

Destaque (20)

Sistemas de Controle de Versão
Sistemas de Controle de VersãoSistemas de Controle de Versão
Sistemas de Controle de Versão
 
Sistema de Controle de Versão - CVS, SVN e GIT
Sistema de Controle de Versão - CVS, SVN e GITSistema de Controle de Versão - CVS, SVN e GIT
Sistema de Controle de Versão - CVS, SVN e GIT
 
Sistemas de controle de versão
Sistemas de controle de versãoSistemas de controle de versão
Sistemas de controle de versão
 
Basic Git Intro
Basic Git IntroBasic Git Intro
Basic Git Intro
 
Introdução à Gerência de configuração de Software
Introdução à Gerência de configuração de SoftwareIntrodução à Gerência de configuração de Software
Introdução à Gerência de configuração de Software
 
Git vs cvs ece2011
Git vs cvs ece2011Git vs cvs ece2011
Git vs cvs ece2011
 
Github git-cheat-sheet
Github git-cheat-sheetGithub git-cheat-sheet
Github git-cheat-sheet
 
Git - The Incomplete Introduction
Git - The Incomplete IntroductionGit - The Incomplete Introduction
Git - The Incomplete Introduction
 
Apresentação do SAEO na Administração Pública
Apresentação do SAEO na Administração PúblicaApresentação do SAEO na Administração Pública
Apresentação do SAEO na Administração Pública
 
[Mini-curso] Sistema de Controle de Versão
[Mini-curso] Sistema de Controle de Versão[Mini-curso] Sistema de Controle de Versão
[Mini-curso] Sistema de Controle de Versão
 
QConSP: Vivenciando dev ops para além da automação de infraestrutura
QConSP: Vivenciando dev ops para além da automação de infraestruturaQConSP: Vivenciando dev ops para além da automação de infraestrutura
QConSP: Vivenciando dev ops para além da automação de infraestrutura
 
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVN
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVNControle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVN
Controle de Versão e Monitoramento de Projetos com SVN + WebSVN + StatSVN
 
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version Control
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version ControlJoomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version Control
Joomla!Day Brasil 2008 - FláVio Kubota - Gsoc Version Control
 
Controle de Mudanças com GitHub
Controle de Mudanças com GitHubControle de Mudanças com GitHub
Controle de Mudanças com GitHub
 
Introdução ao Sistema de Controle de Versão
Introdução ao Sistema de Controle de VersãoIntrodução ao Sistema de Controle de Versão
Introdução ao Sistema de Controle de Versão
 
GCS - Aula 09 - GCS Ágil
GCS - Aula 09 - GCS ÁgilGCS - Aula 09 - GCS Ágil
GCS - Aula 09 - GCS Ágil
 
Controle de versão com GIT
Controle de versão com GITControle de versão com GIT
Controle de versão com GIT
 
Workshop sistema de versionamento de código - git
Workshop  sistema de versionamento de código - gitWorkshop  sistema de versionamento de código - git
Workshop sistema de versionamento de código - git
 
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...
Transformando a experiência dos times de DEV, OPS & BIZ nos Sistemas Financei...
 
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataforma
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataformaWine.com.br - De zero a 300 milhões de faturamento na mesma plataforma
Wine.com.br - De zero a 300 milhões de faturamento na mesma plataforma
 

Semelhante a Conceitos e exemplos em versionamento de código

SVN - Subversion: Guia de sobrevivência do usuário
SVN - Subversion: Guia de sobrevivência  do usuárioSVN - Subversion: Guia de sobrevivência  do usuário
SVN - Subversion: Guia de sobrevivência do usuárioFabrício Campos
 
SVN no Desenvolvimento de Software
SVN no Desenvolvimento de SoftwareSVN no Desenvolvimento de Software
SVN no Desenvolvimento de SoftwareManoel Afonso
 
Controle de Versão Distribuído com Git básico
Controle de Versão Distribuído com Git básicoControle de Versão Distribuído com Git básico
Controle de Versão Distribuído com Git básicoFabricio Nogueira
 
Intervalo técnico Git/SVN
Intervalo técnico Git/SVNIntervalo técnico Git/SVN
Intervalo técnico Git/SVNLuciano Lima
 
SVN com TortoiseSVN
SVN com TortoiseSVNSVN com TortoiseSVN
SVN com TortoiseSVNPaulo Remoli
 
Controle de versão
Controle de versãoControle de versão
Controle de versãoZé Pereira
 
CVS - Slides Parte 3 - Básico
CVS - Slides Parte 3 - BásicoCVS - Slides Parte 3 - Básico
CVS - Slides Parte 3 - BásicoMarden Neubert
 
SVN Básico
SVN BásicoSVN Básico
SVN BásicoCJR, UnB
 
CVS - Slides Parte 2 - Administração
CVS - Slides Parte 2 - AdministraçãoCVS - Slides Parte 2 - Administração
CVS - Slides Parte 2 - AdministraçãoMarden Neubert
 
Integração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpIntegração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpDenis L Presciliano
 
SVN: Controle de revisões com subversion - Thiago Rafael Becker
SVN: Controle de revisões com subversion - Thiago Rafael BeckerSVN: Controle de revisões com subversion - Thiago Rafael Becker
SVN: Controle de revisões com subversion - Thiago Rafael BeckerTchelinux
 
CVS - Slides Parte 1 - Introdução
CVS - Slides Parte 1 - IntroduçãoCVS - Slides Parte 1 - Introdução
CVS - Slides Parte 1 - IntroduçãoMarden Neubert
 

Semelhante a Conceitos e exemplos em versionamento de código (20)

SVN - Subversion: Guia de sobrevivência do usuário
SVN - Subversion: Guia de sobrevivência  do usuárioSVN - Subversion: Guia de sobrevivência  do usuário
SVN - Subversion: Guia de sobrevivência do usuário
 
SVN no Desenvolvimento de Software
SVN no Desenvolvimento de SoftwareSVN no Desenvolvimento de Software
SVN no Desenvolvimento de Software
 
Controle de Versão Distribuído com Git básico
Controle de Versão Distribuído com Git básicoControle de Versão Distribuído com Git básico
Controle de Versão Distribuído com Git básico
 
Intervalo técnico Git/SVN
Intervalo técnico Git/SVNIntervalo técnico Git/SVN
Intervalo técnico Git/SVN
 
CVS
CVSCVS
CVS
 
SVN com TortoiseSVN
SVN com TortoiseSVNSVN com TortoiseSVN
SVN com TortoiseSVN
 
Cvs everton
Cvs   evertonCvs   everton
Cvs everton
 
Controle de versão
Controle de versãoControle de versão
Controle de versão
 
CVS - Slides Parte 3 - Básico
CVS - Slides Parte 3 - BásicoCVS - Slides Parte 3 - Básico
CVS - Slides Parte 3 - Básico
 
SVN Básico
SVN BásicoSVN Básico
SVN Básico
 
CVS - Slides Parte 2 - Administração
CVS - Slides Parte 2 - AdministraçãoCVS - Slides Parte 2 - Administração
CVS - Slides Parte 2 - Administração
 
Integração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, GumpIntegração Contínua com CVS, CruiseControl, AntHill, Gump
Integração Contínua com CVS, CruiseControl, AntHill, Gump
 
SVN: Controle de revisões com subversion - Thiago Rafael Becker
SVN: Controle de revisões com subversion - Thiago Rafael BeckerSVN: Controle de revisões com subversion - Thiago Rafael Becker
SVN: Controle de revisões com subversion - Thiago Rafael Becker
 
Apresentação controle de versão
Apresentação controle de versãoApresentação controle de versão
Apresentação controle de versão
 
GIT Básico
GIT BásicoGIT Básico
GIT Básico
 
CVS - Slides Parte 1 - Introdução
CVS - Slides Parte 1 - IntroduçãoCVS - Slides Parte 1 - Introdução
CVS - Slides Parte 1 - Introdução
 
Svn - grupo de estudos sol7
Svn - grupo de estudos sol7Svn - grupo de estudos sol7
Svn - grupo de estudos sol7
 
Git para quem vem do SVN
Git para quem vem do SVNGit para quem vem do SVN
Git para quem vem do SVN
 
Curso de CVS - Lab 3
Curso de CVS - Lab 3Curso de CVS - Lab 3
Curso de CVS - Lab 3
 
Git Básico
Git BásicoGit Básico
Git Básico
 

Mais de Felipe

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingFelipe
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFelipe
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplosFelipe
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - OverviewFelipe
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data AnalyticsFelipe
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsFelipe
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsFelipe
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examplesFelipe
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsFelipe
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceFelipe
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkFelipe
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Felipe
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareFelipe
 
Rachinations
RachinationsRachinations
RachinationsFelipe
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische TugendenFelipe
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play frameworkFelipe
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementFelipe
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantFelipe
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute introFelipe
 

Mais de Felipe (19)

Aula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic taggingAula rotulação automática - Automatic tagging
Aula rotulação automática - Automatic tagging
 
First steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with ExamplesFirst steps with Keras 2: A tutorial with Examples
First steps with Keras 2: A tutorial with Examples
 
Word embeddings introdução, motivação e exemplos
Word embeddings  introdução, motivação e exemplosWord embeddings  introdução, motivação e exemplos
Word embeddings introdução, motivação e exemplos
 
Cloud Certifications - Overview
Cloud Certifications - OverviewCloud Certifications - Overview
Cloud Certifications - Overview
 
Elasticsearch for Data Analytics
Elasticsearch for Data AnalyticsElasticsearch for Data Analytics
Elasticsearch for Data Analytics
 
Cloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and AlarmsCloudwatch: Monitoring your Services with Metrics and Alarms
Cloudwatch: Monitoring your Services with Metrics and Alarms
 
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and AlarmsCloudwatch: Monitoring your AWS services with Metrics and Alarms
Cloudwatch: Monitoring your AWS services with Metrics and Alarms
 
Online Machine Learning: introduction and examples
Online Machine Learning:  introduction and examplesOnline Machine Learning:  introduction and examples
Online Machine Learning: introduction and examples
 
Aws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and toolsAws cost optimization: lessons learned, strategies, tips and tools
Aws cost optimization: lessons learned, strategies, tips and tools
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduce
 
Pré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache SparkPré processamento de grandes dados com Apache Spark
Pré processamento de grandes dados com Apache Spark
 
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
Hadoop MapReduce and Apache Spark on EMR: comparing performance for distribut...
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Rachinations
RachinationsRachinations
Rachinations
 
Ausgewählte preußische Tugenden
Ausgewählte preußische TugendenAusgewählte preußische Tugenden
Ausgewählte preußische Tugenden
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
 
DevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration managementDevOps Series: Extending vagrant with Puppet for configuration management
DevOps Series: Extending vagrant with Puppet for configuration management
 
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrantDevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
DevOps Series: Defining and Sharing Testable Machine Configurations with vagrant
 
D3.js 30-minute intro
D3.js   30-minute introD3.js   30-minute intro
D3.js 30-minute intro
 

Conceitos e exemplos em versionamento de código

  • 1. Conceitos e Exemplos em Versionamento de Código 30-40 minutos Atualizado em 20 Ago 2014 falmeida1988@gmail.com Exemplos com Subversion
  • 2. Introdução Um sistema de controle de versão de código-fonte (VCS) é um programa que guarda todas as modificações 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 mudanças intermediárias. Um VCS pode lhe ser útil se você, por exemplo: ● deseja guardar a história do seu projeto e se proteger contra eventuais perdas, mudanças que causaram erros ou ● pertence a uma equipe de desenvolvimento com 2 ou mais desenvolvedores
  • 3. Cenários Comuns ● Um desenvolvedor deseja mudar uma funcionalidade existente mas deseja que a antiga fique disponível enquanto a nova versão está sendo escrita; ● Um desenvolvedor percebe que sua aplicação, que estava funcionando, agora contém um erro, mas ele não consegue identificar qual mudança introduziu este erro. ● Dois desenvolvedores estão trabalhando cada um em uma tarefa, mas ambas envolvem mudar um mesmo arquivo de código; ambas as tarefas têm alta prioridade então um não pode esperar até que o outro acabe para então começar a trabalhar. As duas tarefas têm que ser feitas ao mesmo tempo.
  • 4. Principais ferramentas ● CVS ● Subversion (SVN) ● Team Foundation Server (TFS) ● Git ● Mercurial ● Perforce
  • 5. Repositório O repositório (também chamado de repo) é o lugar onde o seu projeto, bem como todo o histórico de modificações do mesmo, fica guardado. Em geral ele é localizado em outra máquina e é identificado por uma url. Seu repositório reflete a história do seu projeto, até a versão mais recente do seu projeto (também chamada de HEAD). Quando alguém executa uma operação do tipo commit, o repositório é atualizado com as modificações introduzidas por aquele commit.
  • 6. Repositório (cont.) Exemplo: criar um repositório local na sua máquina ● svnadmin create /home/usuario/meu-repo Note que este repositório só poderá ser acessado de dentro da sua máquina através do protocolo file://, por exemplo:* ● svn list file:///home/usuario/meu-repo * A partir de outras máquinas, este repositório ser acessado de outras formas; por exemplo, os protocolos svn+ssh//e http://. comando para listar arquivos de um repositório
  • 7. Checkout Uma operação do tipo checkout faz uma cópia do código de um repositório para o seu diretório atual. Exemplos: ● svn checkout http://example.com:9834/trunk minha_copia Este comando faz uma cópia do código cujo repositório está em http://svn.example.com:9834/trunk para o diretório 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 cópia do código em sua máquina (para dentro de um diretório chamado meu-repo/ pois não foi definido um nome alternativo como no exemplo anterior)
  • 8. Working copy (também chamado de working directory) A sua working copy é a sua cópia do projeto. Quando você faz uma operação de checkout ou clone, o diretório 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 repositório até que você faça um commit), portanto modificações, criação de arquivos e remoção de arquivos na sua cópia local não afetam o seu repositório.
  • 9. Add Um arquivo ou diretório criado na sua working copy não é versionado (tracked) por default. Para que um VCS (nesse caso, o SVN) comece a versionar (isto é, guardar o histórico de modificações) de um arquivo, é necessário 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 repositório mudanças em arquivos versionados (isto é, arquivos em que se executou svn add). Arquivos não versionados são ignorados pelo VCS.
  • 10. Commit A operação de commit atualiza o repositório com modificações feitas nos arquivos versionados em uma cópia local. ● mensagem de commit ● revision N Exemplos ● svn commit a.txt b.txt -m "nova versão" Este comando atualiza o repositório de origem (de onde você fez checkout) com as mudanças feitas nos arquivos a.txt e b.txt. uma pequena mensagem explicando o commit e a sua razão o estado do repositório após o N- ésimo commit
  • 11. Update Uma operação de update faz a sua working copy refletir o estado atual do repositório. Se, por exemplo, modificações foram feitas por outro desenvolvedor no seu repositório de origem desde a última vez que você fez uma operação de checkout, uma operação de update irá modificar a sua working copy de modo a ficar igual ao estado atual do repositório. Exemplos: ● svn update arquivo1.txt ● svn update -r40 sua working copy agora está no estado como estava após o 40º commit
  • 12. Revert Uma operação do tipo revert descarta as modificações em um arquivo na sua working copy (ou seja, modificações que ainda não sofreram commit), fazendo- o ficar idêntica ao último commit do repositório. Exemplos: ● svn revert arquivo1.txt ● svn revert --depth=infinity . A opção --depth=infinity faz a operação de revert ser feita em diretórios-filhos do diretório atual, recursivamente.
  • 13. Branch Um branch é um artifício suportado por vários VCSs. Ele representa uma outra linha de desenvolvimento. Casos de uso: ● Você deseja começar a implementar uma funcionalidade nova (grande e que necessitará de vários commits) mas quer que sua versão principal continue estável enquanto a funcionalidade nova não fica pronta. ● Você deseja fazer experimentos com funcionalidades novas mas não deseja que a versão principal seja afetada.
  • 14. Branch Exemplo de criação um branch: ● svn copy http://example.com/trunk http://example.com/branches/my-branch -m "criando um novo branch" Cria um branch do repositório, acessível pela url http://example.com/branches/my-branch. Pode-se fazer checkout deste como se fosse um repositório normal.
  • 15. Merge ● Comando que gera uma versão final de um arquivo a partir de duas versões do mesmo arquivo. ● Na maioria das vezes, não é necessária intervenção manual do usuário, pois os VCSs conseguem fazer merges automáticos para a maioria dos casos. ● Quando um merge automático não consegue ser feito, é gerado um conflito que deve ser resolvido manualmente. por exemplo, em dois branches ou em duas revisions diferentes
  • 16. 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 repositório), este comando fará um merge do branch branch-a com a sua working copy atual.
  • 17. Conflitos Conflitos acontecem quando o seu VCS não consegue, de forma automática, fundir em um arquivo novo mudanças oriundas de duas versões diferentes. Conflitos podem surgir após operações de update ou merge. Exemplo: conflito após uma operação 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:
  • 18. Conflitos Exemplo de um arquivo com marcadores de conflito (SVN): arquivo1.txt there are <<<<<<< .mine nine ======= eight >>>>>>> .r999 planets in the solar system parte comum às duas versões versão do branch atual (“minha” versão) versão do outro branch ou revision (versão “deles”)
  • 19. Resolvendo conflitos Um método simples de resolver conflitos é simplesmente editar (manualmente) o arquivo com marcadores de conflito e avisar ao SVN que o conflito foi resolvido: ● editar o arquivo arquivo1.txt ● svn resolve --accept working arquivo1.txt ● svn commit -m "conflito resolvido!" não esquecer de dar commit! dizer ao SVN que a versão final é a versão é a que está na working copy
  • 20. Resolvendo conflitos (cont.) Você também pode mandar o SVN aceitar uma das versões 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” versão do conteúdo para todos os conflitos. ● svn resolve --accept theirs-conflict arquivo2.txt A versão do branch remoto (“deles”) é escolhida e a minha versão, bem como os marcadores de conflito, são retirados do arquivo. N.B.: Outras opções como theirs-full, mine-conflict e theirs-conflict também estão disponíveis.
  • 21. Melhores práticas ● Dê commit frequentemente ○ quanto mais commits, mais lugares para onde você pode fazer revert ○ mais fácil fazer merge se as duas versões de um arquivo não estão muito diferentes entre si. ○ você se força a dividir o desenvolvimento em unidades pequenas e autocontidas de tarefas. ○ Ajuda a contar a ‘história’ do projeto através dos commits. ● Dê commit de todos os arquivos relacionados a uma mudança de forma única, incluindo todos eles; em outras palavras, seu commit deve ter unidade lógica.
  • 22. Melhores práticas (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. ● Não dê commit em arquivos gerados ○ Arquivos executáveis (no caso de linguagens compiladas) ou arquivos de output gerados por ferramentas não devem ser versionados. ● Não dê commit em arquivos de preferências ○ Arquivos como .vimrc (vim), .nbproject/ (netbeans) ou .idea/ (IntelliJ) são pessoais e não deve ser versionados.
  • 23. Melhores práticas (cont.) ● Use mensagens de commit descritivas e explicativas ○ Lembre-se que você não se lembrará do que fez hoje daqui a alguns meses. ○ As mensagens de commit servem como documentação do projeto. ● Não dê commit em coisas feitas pela metade ○ Divida coisas grandes em unidades lógicas menores e dê commit em cada uma delas separadamente. ○ Senão, espere até o fim da tarefa para dar commit.
  • 24. XTRA: Comandos úteis para o dia-a- dia (SVN) ● svn delete arquivo1.txt Remove um arquivo da sua working copy e do repositório (quando você der commit, o arquivo vai ser removido do repositório) ● svn delete --keep-local arquivo1.txt Remove um arquivo do repositório 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.
  • 25. XTRA: Repositórios centralizados e descentralizados ● Em um VCS centralizado, só há uma cópia do repositório. Cada usuário só tem acesso à sua cópia dos arquivos (no seu working directory); quando você executa um commit, o repositório central é atualizado. ● Em um VCS descentralizado (DVCS), não há um único repositório; cada usuário guarda uma cópia do repositório inteiro; o comando commit envia suas modificações para a sua cópia do repositório. ● Para interagir com repositórios remotos são usados alguns comandos novos, como fetch, pull e push.
  • 26. XTRA: push e pull Como VCSs descentralizados podem ter várias cópias do mesmo repositório em existência, há dois comandos extras que definem operações entre um repositório local e um outro repositório remoto: ● comando push ○ Envia o seu repositório (com todos os seus commits) para um repositório remoto, atualizando o mesmo (pode ser rejeitado). ● comando pull ○ Tenta atualizar o seu repositório local, incorporando modificações vindas de um repositório remoto (pode haver conflitos).
  • 27. XTRA: Migrações - versionamento de bancos de dados ● Dois projetos rodando a mesma versão do código mas com bancos de dados com estruturas diferentes (tabelas e atributos) vão exibir comportamento diferente. ● Hoje em dia (2014) este já é um problema bem resolvido pela maioria dos frameworks em existência. ● Migrações consistem em fazer cada mudança na estrutura do seu banco de dados através de arquivos.
  • 28. Referências ● 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