Tutorial Git
Por que usar controle de versão?
O git é um programa para controle de versão. Um programa de controle de versão que controla todas as mudanças em arquivos pelo tempo. Com ele podemos reverter mudanças feitas em arquivos e compartilhar as mudanças com outras pessoas que também trabalham no projeto. Usaremos o git como controlador de versões.
As modificações ficam guardadas em repositórios, que possuem todo o histórico das modificações em cada arquivo. O repositório possui informações como o autor de cada modificação, a data em que foi feita, a mensagem que o autor utilizou para descrever a modificação, além de permitir comparar facilmente diferentes versões de um mesmo arquivo.
Com estas vantagens que um sistema de controle de versão proporciona, o trabalho em grupo fica muito mais produtivo, permitindo que mais de uma pessoa edite um arquivo ao mesmo tempo, e as pessoas não precisam ter medo de modificar os arquivos, pois elas não perderão as versões antigas e poderão visualizá-las e compará-las quando quiserem.
Como iniciar um repositório (rep) no git
O github tem um bom tutorial para instalar e iniciar o git:
- Windows
- http://help.github.com/win-set-up-git/ (Sem o TortoiseGit. Há um breve tutorial sobre o TortoiseGit abaixo.)
- Linux
- MacOS
Como usar o git
Agora que o git está instalado e o repositório já está criado, podemos começar a modificar nosso projeto. Todo arquivo no git tem dois status: Tracked e Untracked. Arquivos Tracked serão adicionados no próximo commit. Para verificar o status de cada arquivo usamos o comando git status. O comando git commit adiciona os arquivos Tracked para o seu repositório. Toda vez que um arquivo é modificado ele é marcado como Untracked. Para mudar o status de um arquivo para Tracked usamos o comando git add <Nome-do-Arquivo>. O comando git diff mostra a diferença entre os arquivos Untracked e os Tracked. Um arquivo pode estar Tracked e Untracked ao mesmo tempo se dermos git add nele, modificarmos ele, e executarmos o git status, ele vai mostrar o mesmo arquivo nas duas partes: a que mostra os arquivos que serão commitados e os que não serão. Isso quer dizer que a versão não modificada do seu arquivo vai ser commitada, e não a mais nova. Para corrigir isso teríamos que dar git add no mesmo arquivo. Para remover um arquivo do git usamos o comando git rm <Nome-do-Arquivo>. O comando git mv file_from file_to move um arquivo.
O git commit só modifica os arquivos no seu repositório local. Precisamos usar o comando git push para mandar as modificações para o repositório no github. Se a sua versão for mais nova que a do repositorio, o seu push será feito e as modificações serão feitas. Se não, usamos o comando git pull para pegar a versão mais nova do repositório e dar um merge com o nosso repositório. Se houver algum problema com o merge, por exemplo um arquivo que você modificou foi modificado no repositório no github, você terá que abrir o arquivo e modificá-lo manualmente para arrumá-lo. Depois disso, o git push poderá ser executado sem problema.
Uma boa dica é fazer o comando git commit com certa frequência, sempre que você fizer uma pequena modificação que esteja completa. Não é recomendável fazer commits apenas ao terminar uma tarefa, pois durante a realização da mesma os arquivos passarão por diversas modificações e você pode querer voltar para um estado intermediário, o que só será possível se aquela modificação foi salva em um commit. Mas também não é recomendável fazer um commit de uma versão quebrada e cheia de erros, pois aquela versão não terá muita utilidade e poluirá o histórico do arquivo.
Não se esqueça de fazer o comando git pull para pegar as modificações feitas pelo resto do grupo, e o comando git push para que o resto do grupo receba suas modificações.
Branches
Branches são facilmente criados no git, através do comando:
git branch <Nome-do-Branch>
Eles são arquivos de 41bits que apontam para as mudanças feitas dentro deles. Vale lembrar que um branch criado por você é local, e ele só é adicionado no repositório remoto se usarmos o push desta maneira:
git push (remote) (branch)
Exemplo:
git push origin teste
Isso vai fazer o branch teste ser integrado no nosso repositório remoto origin.
Exercício
Primeiro, precisamos copiar o repositório remoto para o computador. Usamos o comando clone para isso. Ele vai copiar inteiramente o repositório alvo para o local onde ele foi invocado. Copiaremos o repositório que está em :
git@github.com:gorobaum/DummyRep.git
Agora, vamos mexer nesse repositório. Primeiramente, crie uma pasta e um arquivo de texto, os dois com o seu nome, dentro da pasta DummyRep. Escreva 3 linhas de texto no arquivo. Use o comando add do git para adicionar a pasta e o arquivo criados no próximo commit. Use o comando commit para commitar as suas mudanças. Lembre-se de escrever mensagens curtas mas informativas sobre o conteúdo do seu commit. Com isso, o seu repositório local tem a sua pasta, mas o repositório remoto ainda não sabe que essa pasta existe. Para isso, temos que usar o comando push, que manda todos os commits que você fez para o repositório remoto. Use o push agora. Com isso suas mudanças estão agora dentro do repositório remoto.
Agora vamos criar um branch. Crie um branch com o nome teste1. Agora dê checkout teste1 para "entrar" no branch teste1 e modifique a segunda linha do seu arquivo de texto. Commite as mudanças. Agora volte para o master, e modifique a segunda linha do mesmo arquivo, de uma maneira diferente e commite. Tente dar merge com o teste1. O merge dará problema, e você terá que mudar manualmente o arquivo. Ao abrir o arquivo, ele estará dividido em duas partes:
- Uma que vai de <<<<<<<<<< HEAD até ===========. Essa parte é a que está no branch master.
- Outra que vai de ========== até >>>>>>>>>> teste1. Essa parte é a que está no branch teste1.
Modifique o arquivo até que ele fique do jeito que você desejar e dê um commit (lembre-se de adicioná-lo antes). Agora dê um push. Pronto, você criou e modificou arquivos de um repositório remoto usando o git. Se você não for mais utilizar o branch teste1, você pode deletar o branch usando o comando:
git branch -d teste1
Agora o branch teste1 não aparecerá mais na lista de branchs existentes, pois você já terminou de utilizá-lo. Assim, você evita que depois de muito tempo mexendo com um repositório ele fique com diversos branchs que, no momento atual, não tem mais utilidade e cujas modificações já foram mescladas com o desenvolvimento principal.
Resumo dos comandos unix ( e alguns novos )
$ git clone <Repositório> Copia um repositório remoto para a atual localização.
$ git add <Arquivo> Adiciona o arquivo para ser commitado.
$ git commit Comita as atuais modificações para o seu repositório local.
$ git push Mandas os atuais commits para o repositório remoto.
$ git pull Puxa os commits do repositório remoto.
$ git rm Remove um arquivo.
$ git mv Move um arquivo.
$ git diff Mostra a diferença entre os arquivos que serão comitados e suas atuais modificações.
$ git status Mostra o status de cada arquivo.
$ git branch <Nome-do-Branch> Cria um branch com o nome passado.
$ git branch Lista todos os branchs existentes.
$ git branch -d <Nome-do-Branch> Remove o branch passado, evitando que ele continue sendo usado. Útil após um merge.
$ git checkout <Nome-do-Branch> Vai para o branch com o nome passado. O branch tem que existir.
$ git merge <Nome-do-Branch> Faz um merge do branch passado para o atual.
Git no Windows usando o tortoise git
Primeiro precisamos instalar os seguintes arquivos:
msysgit http://code.google.com/p/msysgit/ Tortoise Git http://code.google.com/p/tortoisegit/ PuTTY http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Baixe as versões mais novas, e instale tudo normalmente, sem mudar nenhuma opção, a não ser que seja de sua preferência.
Agora, precisamos configurar uma chave de SSH para que seu computador possa conversar com o repositório remoto. Vá até a pasta em que o PuTTY foi instalado e abra o executável puttygen. Clique em Generate, depois digite uma senha no campo Key passphrase (essa senha será pedida toda vez que você fizer um push ou um pull. Nao a esqueça!). Clique em save private key, e a salve num lugar onde você possa achar facilmente. Abra o site do github e na seção Account settings, vá em SSH Public Keys e adicione a chave de SSH que você acabou de gerar. Quando você for clonar um repositorio, o tortoise vai pedir o seu nome e seu email. Isso é para que cada commit feito por você tenha as suas informações, assim o grupo pode saber quem fez o quê. Depois, você terá que fornecer o link da chave de SSH para o tortoise, sem isso ele não pode clonar um repositório.
Comandos um pouco diferentes que frequentemente usamos
$ git checkout --track origin/<branch_name> Dá "pull" de uma branch no repositório remoto, e já dá checkout nela.
$ git checkout <branch_name> <file_path> Dá merge no arquivo <file_path> no branch atual com o branch especificado em <branch_name>.