Tutorial Git

From USPGameDev Wiki
Jump to navigation Jump to search

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
http://help.github.com/linux-set-up-git/
  • MacOS
http://help.github.com/mac-set-up-git/

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>.