Tableless - Desenvolvimento inteligente com Padrões Web

16/01/2012
Client-Side

Introdução das premissas dos controles de versão

Introdução sobre algumas premissas sobre controles de versão. Muito útil para designers e iniciantes na área.

Por


Parece ser óbvio, mas muitos desenvolvedores desdenham de ter controle total sobre o código gerado no desenvolvimento. Muitos, por trabalharem sozinhos, entendem que não precisam manter um certo nível de organização do seu código exatamente porque talvez, somente eles, o verão.
Quem nunca ficou horas tentando debugar um código que você mesmo fez, mas não lembrava o que uma determinada função fazia… Esse código pode ter sido por você de madrugada, quando você estava pingando de sono, ou pior, bêbado… Vai saber…

Controlar seu código fonte deve ser uma premissa. Um princípio. Se você acha que o undo do seu editor predileto salva sua vida, imagina ter um undo do seu projeto inteiro. Imagine você ter a história de edição de cada um dos arquivos do seu projeto.

Os princípios abaixo servem para qualquer tipo de controle de versão que conhecemos hoje: GIT, SVN, Mercurial etc.

Branchs e trunks

A última revisão, a mais atual, normalmente é chamada de HEAD. Existem momentos onde teremos vários HEADs porque o projeto tem vários BRANCHES.
Um branch é uma cópia do projeto. Cada branch pode ser editado e evoluído independentemente.
Imagine que exista a versão de produção que é aquela que está no ar. É a versão o usuário está utilizando. É importante que nós não modifiquemos esta versão porque alguém pode commitar algo errado, quebrar tudo e o usuario reclamar. Por isso nós precisamos de outro ambiente, é aí que criamos um branch de desenvolvimento, onde podemos fazer o que quisermos ali, sem afetar o branch principal.

É muito útil criarmos novos trunks (tronco) quando precisamos fazer modificações drásticas de novas features, resolver bugs ou modificar layout.

Exemplo: imagine que você esteja trabalhando em uma nova feature, em um branch específico. O cliente liga e diz que encontrou um bug, originado de uma modificação feita na semana passada. Você sai do branch da nova feature e cria um novo branch. Este novo branch tem a cópia do código do branch de produção, que é o que o cliente está vendo. Você resolve o bug neste novo branch. Quando resolver o bug, você move as modificações deste branch para o branch de produção. Isso tudo sem ter que subir as modificações incompletas da nova feature que você estava trabalhando anteriormente.

Versionamento

Versionamento é uma das características mais básicas do controle de código. Quando comecei a desenvolver, normalmente eu trabalhava guardando pastas com nomes do tipo nomeDoProjeto-v1, nomeDoProjeto-v2 etc… Estas pastas guardavam apenas as versões com grandes modificações de projeto… algo como mudança geral de layout, uma feature importante ou algo do tipo. O problema são as pequenas edições… Quando juntamos as pequenas modificações, temos uma grande modificação. É muito provável que se você perder essa versão, você não se lembre de todas as pequenas modificações feitas e isso é um problemão.

Toda vez que o desenvolvedor termina uma determinada tarefa, ele geral um commit que por sua vez gera um ponto de referência, uma versão, daqueles arquivos modificados. Cada commit gera uma versão do seu código. A graça é que se você tem versões do código, você tem praticamente um undo gigante do seu projeto… Se depois de uma determinada modificação seu projeto começou a dar pau, você consegue entender com a história do seu versionamento – o famoso log – a partir de onde exatamente o problema foi iniciado.

Logs

Quando cada revisão é comitada, o desenvolvedor pode ou não adicionar uma mensagem explicando o que ele fez naquela tarefa. É importante que essa mensagem seja clara e rica em detalhes, mas não um texto gigante, apenas o suficiente para que você mesmo ou outras pessoas envolvidas entenda o que aquela submissão significa.

Diffs

Diffs são sensacionais. Imagine que você queira comparar duas versões de um mesmo arquivo para descobrir as linhas modificadas. Fazer um diff entre as versões do arquivo te possibilita encontrar exatamente onde está o erro e o melhor, quando juntamos com o Log, podemos saber exatamente o porque a pessoa incluiu aquela linha ou aquele código, e o melhor, quem fez aquela alteração.

Rollback

Mantendo uma história de commits, você tem pontos de volta na história do arquivo, possibilitando a facilidade de voltarmos para antes de alguma modificação. Você pode voltar a partir de um commit, por exemplo. Se o sistema ou o arquivo passou a dar problema depois de uma determinada revisão, é simples de você voltar o arquivo para a versão daquele determinado commit.

Edição multiusuário e merge

Isso é uma maravilha. Me lembro de equipes inteiras perdendo arquivos e partes de código porque dois membros abriam o mesmo arquivo para editar. Obviamente nunca, mas nunca dava certo. O que faziam que equipes inteiras criassem mecanismos da idade das pedras para avisar o resto do pessoal que determinado arquivo estava sendo usado. O trabalho em equipe remotamente nunca era possível. Com um controle de versão isso muda. Qualquer um pode editar qualquer arquivo a qualquer hora.
O sistema de controle de versão compara as modificações feitas no arquivo pelos dois (ou mais) desenvolvedores e junta os códigos automaticamente. Muito bonito, hein?
E quando os desenvolvedores modificam a mesma linha de código? Aí o controle de versão gera um conflito, esse conflito se resolve deve ser resolvido pelo desenvolvedor que executou o segundo commit. Funciona assim:

1. Dois desenvolvedores abrem o mesmo arquivo para editar.
2. Quando os desenvolvedores terminam, eles geram um commit. Se os desenvolvedores fizeram edições em partes diferentes do arquivo, por exemplo, um no topo do arquivo e o outro no final, o sistema junta os códigos fazendo um merge, e criando um arquivo atualizado com as duas revisões.
3. Se sistema percebe que os desenvolvedores fizeram as modificações na mesma linha, o sistema gera um conflito.
4. O conflito é resolvido pelo segundo desenvolvedor que comitar o código. Ou seja, o cara comitou a modificação dele primeiro que você. Quando você comitar a sua modificação, o controle de versão avisará que há um conflito em uma parte do seu código. O conflito é resolvido mostrando algo mais ou menos assim:

1
2
3
4
5
6
7
p {
<<<<<<< HEAD:estilo.css
   color: red;
=======
   color: blue;
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:estilo.css
}

A primeira linha mostra a sua linha. A segunda linha mostra a modificação do outro dev. Aquele hash maluco no final é a identificação do commit do outro dev.
Bom, nesses casos você precisa ver qual código é o correto, e isso as vezes inclui ir perguntar para o outro brother que diachos é aquela coisa que ele fez. Tudo na camaradagem… as vezes.

Concluindo

Estas são algumas premissas sobre controles de versão utilizados hoje em dia. Os controles de versão mais usados hoje são o GIT, SVN e Mercurial. Cada um deles tem comandos diferentes para lidar com as premissas acima e cada um deles faz o controle de sua forma particular. Mesmo assim todos trazem as vantagens que citamos no artigo. Mesmo que você trabalhe sozinho, é recomendado que você trabalhe com controle de versão. Assim você guarda seu projeto de forma segura e tem um histórico das suas modificações durante o tempo. Boas práticas, my friend.

Por Diego Eis

Diego Eis criou o Tableless para disseminar os padrões web no Brasil. Como consultor já treinou equipes de empresas como Nokia, Globo.com, Yahoo! e iG. É palestrante e empreendedor.

http://twitter.com/diegoeis/

Veja os outros posts de

  • http://www.udgwebdev.com/ Caio Ribeiro Pereira

    Nossa muito bacana esse post!! Realmente eu vivo essa experiência todo dia por que sou programador, mas é um diferencial para qualquer um, seja programador ou web designer, manter organizado todos os arquivos, te salvará de futuras dores de cabeça!

    Ahhh para quem curte Git, que na minha opinião é o melhor de todos rs

    Segue alguns links do meu blog explicando o básico para trabalhar com ele, vale a pena ler para complementar com esse post!!

    http://www.udgwebdev.com/category/git/

  • http://www.udgwebdev.com/ Caio Ribeiro Pereira

    Nossa muito bacana esse post!! Realmente eu vivo essa experiência todo dia por que sou programador, mas é um diferencial para qualquer um, seja programador ou web designer, manter organizado todos os arquivos, te salvará de futuras dores de cabeça!

    Ahhh para quem curte Git, que na minha opinião é o melhor de todos rs

    Segue alguns links do meu blog explicando o básico para trabalhar com ele, vale a pena ler para complementar com esse post!!

    http://www.udgwebdev.com/category/git/

  • Vanderson

    Tinha uma maluco ai que pegava no meu pé porque eu esquecia de dar push nas coisas.

  • http://twitter.com/fale_rodrigo Rodrigo Nogueira

    Muito bom o artigo, premissas básicas para quem quer aprender a trabalhar com versionamento ou quer entrar em uma grande empresa que use SVN, GIT etc…

  • Rafael Borsari

    Exelente artigo explica certinho como funciona, mesmo que o profissional não precise pois ele desenvolve sozinho é um conhecimento a mais, por que uma hora você vai ter que voltar para revisar o código ai já viu.

    Recomendado para os programadores forever alone kkkk.

  • Evandro Oliveira

    Hahahahaha! Esquecia ou ainda esquece?? E os malucos que pegam o seu commit com conflito e sobrescrevem tudo? :p

  • Tassia Pellegrini

    Obrigada pela rica informação! Alguma dica especifica para trabalhar dessa forma com o WordPress, na realidade de um freelancer? Trabalhei com versionamento por 2 anos numa grande empresa com Java, mas como meu papel se concentrava no front-end, tive pouco contato com a implementação do SVN.

  • Anonymous

    Tudo muito bom tudo muito bem , mais por favor cria um artigo pratico ai pra quem não conhece nada de versionamento e gostaria de começar a praticar 

    Exemplo :

    Tenho um index.php ou html , e um style css 

    qual programa uso pra fazer a edição deles ? Linux !! ? não não , por mais que tente não consigo me adaptar to de Windows e muitos também !
    Depois que fiz a edição , acredito eu que tenha um botão no programa pra fazer o comiter ?

    O programa que envia o arquivo para o repositório ?

    entende a duvida que paira aqui na mente ? Obrigado desde já !! 

  • Wagner Quedi

    Parabens pelo post, estou a pouco tempo usando um controle de versão para meus projetos, e hj não sei como programar sem ele, pois facilita muito a vida, quando puderem façam alguns textos mostrando dicas e funçoes especiais desse rico sistema de controle de versão.

  • Karuan Nunes

    Realmente muito bom o post, bem explicativo, onde, quando comecei a usar controle de versão me bagunçava pois não sabia exatamente a funcionalidade de ambas funções.

  • Wagner Quedi

    Hj trabalhando no TortoiseSVN me veio uma duvida, talvez alguem ai possa me ajudar. desenvolvo um sistema, o qual tem é “alugado” para varios clientes, o sistema é em php, e o cada cliente tem seu visual personalizado, só que o sistema é o mesmo para todos. a duvida é a seguite:

    cada cliente tem sua personalização, mas quando corrijo um bug no codigo base preciso atualizar todos os sistemas dos clientes, exemplo .. tenho clienteX, clienteY e clienteZ, o clienteY me liga e fala que o sistema está com erro no cadastro, eu abro a pasta do clienteY e corrijo, ai queria saber como é o procedimento para criar um tronco principal (onde o sistema não teria a personalização), e no momento q fecho contrato com um cliente, eu crio um braço desse tronco, onde que se eu atualizar o clienteX o tronco principal seja atualizado tb, mas sem as atualizações de visual do clienteX, para eu dar um update no clienteY e no clienteZ e atualiza-los.

    não sei se fui claro, mas qualquer ajuda será bem vinda.

  • Wagner Quedi

    Ola croata. procure pelo TortoiseSVN, é um otimo programa para quem ta iniciando como eu, nesse ramo de controle de versão, eu programo em php e uso o dreamweaver para fazer os sistemas, pela facilidade de programação via codigo, ai eu crio os repositorios com o tortoisesvn e ele é integrado ao windows, onde vc com um clique com o botao direito pode fazer updates, commits e etc.
    aprendi usar o tortoisesvn pelo youtube, tem muitos videos bons. se puder ajudar em algo é so falar.

  • http://okatsura.tumblr.com Gabriel Okatsura Lau

    Muito bacana esse artigo. Eu não conhecia essa forma de trabalho mas já estou estudando para me ajudar no gerenciamento de meus projetos. Mas como todo iniciante, eu tenho uma dúvida:

    Eu consegui criar os diretórios, configurar o SSH, e fazers uns COMMITS, mas como isso vai funcionar na prática, no que diz respeito ao desenvolvimento dos meus sites? Eu desenvolvo normalmente, e depois disso executo os comandos pra dar COMMITS e o prório git se encarrega de enviar esses meus arquivos modificados para o servidor?

    Como faço para quando estiver mechendo no código, e tiver que corrigir um bug mas não quiser apagar e perder por completo uma implementação já feita nele (mas que não está funcionando), e poder utilizar esse código novamente?

  • http://rickbenetti.com Rick Benetti

    Como trabalho com o WordPress e já vi que subir tantos arquivos causa muitos conflitos eu hoje uso somente o DropBox com o recurso de Undo infinito ativo (4dolares mês) e tá sendo útil, quando preciso restaurar ou comparar basta entrar no site ver a data e hora e visualizar ou restaurar a versão desejada e pronto.

    SVN já usei, mas causa conflito com o Photoshop por conta de uma DLL compartilhada (isso claro para windows), o GIT ainda tenho por que uso em projetos no Github e outros clientes.

    Sua explicação é muito boa e auxilia bastante. 

  • Anderson Corso

    Muito bom mesmo, estou começando a usar o GIT e não sabia nada sobre como funcionava, o que era commits e branchs. Ajudou muito!

    abraços