Git para preguiçosos

por Felipe Micaroni Lalli

* Este post está em constante atualização. Envie sugestões para micaroni@gmail.com!

Git é um poderoso sistema de controle de versões.

Como instalar o git

No Windows

Baixe e instale a versão mais recente em:

Em outros sistemas

Dê uma olhada em:

Conceitos básicos

Veja o artigo sistema de controle de versões da Wikipédia para ter uma noção sobre esse tipo de sistema. O conceito do Git é um pouco diferente do CVS e SVN, pois é um sistema distribuído e com muito mais recursos de controle do histórico e de branchs de desenvolvimento. Toda cópia local contém todo o histórico de desenvolvimento e os commits são feitos localmente. Somente com o comando push é que as alterações são enviadas para o repositório de origem.

Nota: Veja também http://git.or.cz/gitwiki/GitSvnComparsion para ter uma idéia melhor das vantagens e desvantagens do Git sobre o SVN.

Primeira vez

Configurar o nome do usuário (importante!):

$ git config --global user.name "Your Name Comes Here"

$ git config --global user.email you@yourdomain.example.com

Colocar cores:

$ git config --global color.diff auto

$ git config --global color.status auto

$ git config --global color.branch auto

Habilitar git-rerere (opcional):

$ git config --global rerere.enabled 1

Como baixar um repositório remoto

$ cd ~/wa-git Nota: wa-git pode ser qualquer diretório, onde você colocará seus repositórios git.

Exemplo:

$ git clone ssh://felipe@fml.eti.br/var/git/util

Como criar um repositório local

$ cd ~/wa-git

$ cd <diretório-do-seu-projeto>

$ git init

$ git add .

Como adicionar novos arquivos ao controle de versão

$ git add — mas tenha cuidado para não enviar arquivos indesejados*.

$ git add . — adiciona todos os arquivos do diretório atual para baixo recursivamente.

* Os arquivos indesejados no controle de versões são arquivos que são gerados durante a compilação, e.g.: executáveis gerados, bibliotecas geradas, cópia automática de arquivos etc. Geralmente esses arquivos se modificam a cada compilação e não é interessante manter um controle de versões sobre um documento assim. Esses arquivos devem ser incluídos no ignore list logo após a primeira compilação do projeto. Qualquer biblioteca externa deve ser incluída no Git, mas evite enviar arquivos binários muito grandes (> 10 MB) ao repositório de código. Prefira, ao invés disso, criar um repositório separado relacionado ao projeto principal para esses tipos de arquivos. Exemplo de um arquivo .gitignore:

# Temporarios:
Backup_of_*.cdr
nbproject/private/
*.bak
*~ diff.txt
# Gerados durante a compilacao:
deploy/
*.pyc
doc/
api/
# Gerados durante a execucao:
config.xml
# Copiados do etc que devem ser ignoradas na raiz e no deploy:
pics/
db/
file.bat
# Arquivos que NAO devem ser ignorados:
!etc/deploy/
!etc/deploy/pics/
!etc/deploy/file.bat
!etc/deploy/db/

Como receber alterações

$ git pull — avançado: use --rebase para evitar mergesdesnecessários

Para receber alterações em um branch específico

$ git checkout $ git pull origin

Como enviar alterações

$ git commit -a— a opção “-a” faz um commit local de todos os arquivos modificados. E uma destas opções:

  • $ git push — envia alterações do branch local para o remoto equivalente (e.g. master -> orign/master).
  • $ git push --all — envia alterações de todos os branchs.
  • $ git push origin <source-branch> — envia alterações de um branch local para outro remoto

Trabalhando com branchs e tags

Para criar tag

$ git tag -a <tag-name>

$ git push --tags

Para criar branch

Para criar um branch e já dar checkout para ele:

$ git checkout -b <nome-novo-branch>

ou

$ git branch <nome-novo-branch> (porém ele não dá checkout para o novo branch) e para enviar ao servidor:

$ git push -u origin <nome-novo-branch> — para enviar apenas um branch

ou

$ git push --all — envia todos os branchs locais para o repositório de origem

Para listar branchs

$ git branch (lista somente os locais)

$ git branch -a (lista todos)

$ git branch -r (lista somente os remotos)

Para alternar para um branch, tag ou versão

$ git checkout [-f] <branch, tag ou versão> — a opção -f faz com que arquivos modificados localmente sejam perdidos.

Para remover um branch

$ git branch -d <nome do branch>

Para remover um branch remoto

$ git branch -d -r origin/<name-of-branch>

$ git push origin :<name-of-branch> (obs.: sem o origin)

Para mesclar (merge)

$ git checkout <nome do branch destino> (você deve “estar” no branch de destino)

$ git merge <nome do branch origem> [--no-ff] (a opção –no-ff serve para não permitir o fast foward)

Desfazendo

Desfazendo um commit específico e manter o histórico

$ git revert <versao>

  • <versao> pode ser um intervalo como por exemplo: 0b7cd284..642e314
  • <versao> também pode ser HEAD para desfazer o último commit
  • não use este comando quando houver alterações locais!

Reverter apenas alguns arquivos ou path

$ git checkout <versao> -- <path>

Desfazendo arquivo adicionado no git por engano

$ git rm --cached <file> (funciona antes e depois do commit, recomendado!) ou $ git reset HEAD <file> (apenas antes do commit)

Desfazendo alterações locais

Para todos os arquivos

$ git reset --hard HEAD

Apenas para alguns arquivos

$ git checkout -- <path>

Outros comandos úteis

Adicionar arquivos ao ”ignore list”

$ echo "padrao*" >> .gitignore
Para verificar se todos os arquivos indesejados já estão no ”ignore list” use o comando:

$ git status até que a mensagem “”nothing to commit (working directory clean)”” apareça. Depois de fazer isso, você pode enviar o próprio arquivo .gitignore ao repositório:

$ git add .gitignore
$ git commit

Verificar quantas versões desde o início (versão estilo SVN)

O seguinte comando conta quantos commits foram dados desde a primeira versão:

$ git log --pretty=oneline --all | wc -l

Mostrar histórico com o nome dos arquivos modificados

$ git log --stat

Como dar pull ou push sem o SSH pedir a senha toda vez

$ ssh-keygen -t rsa

Tente este comando:

$ ssh-copy-id <user>@<ip>

Se o comando acima não funcionar:

$ scp <your public key has been saved in ... path> <user>@<ip>:

$ ssh <user>@<ip>

$ mkdir .ssh (ignore possíveis erros)

$ touch .ssh/authorized_keys

$ cat id_rsa.pub >> .ssh/authorized_keys

$ chmod 700 .ssh/

$ chmod 600 .ssh/authorized_keys

$ chmod 700 .

$ exit

$ ssh <user>@<ip> (teste: se não pedir senha, funcionou)

Verificando a diferença entre a versão atual e o último commit de um determinado arquivo

$ git diff
Use diff --color-words para destacar as palavras modificadas

Verificando as modificações locais

$ git diff -b (a opção -b ignora os espaços em brancos)

Verificar diferença entre dois branchs

$ git diff .. --stat

O mesmo que git diff HEAD^..HEAD

$ git show

Como reduzir o uso de espaço em disco

Tente apenas:
$ git gc --aggressive

Avançado:
$ git repack -a -d --window=50 --depth=50 --window-memory=1024m

Mostrar estatísticas básicas sobre alterações

Tente aplicar o parâmetro --stat em diversos comandos, como o git log e git diff por exemplo.

Mostrar informações sobre o repositório remoto

É útil porque ele exibe a URL do repositório caso você tenha esquecido. $ git remote show origin

Opção para ignorar espaços em branco e quebras de linha

Use -w junto com comandos de diff ou quando usar --stat para que o diff ignore todos os espaços em brancos.

Git avançado

Fazer um commit “rapidinho” no meio de uma alteração

Quando você está no meio de alguma coisa, seu chefe chega e pede para fazer uma correção rapidinha, na hora você se diverte!

# ... cava cava cava ...
$ git stash
$ (faz a correção de emergência)
$ git commit -a -m "Commit rapidinho e apressado"
$ git stash pop
# ... volta a cavar ...

Criando atalhos para os comandos

Com exemplo é mais fácil:

$ git config --global alias.xoxo "log --stat"

Agora se você digitar “git xoxo” ele vai executar “git log –stat”.

Mudando propriedades do último commit

$ git commit --amend --author='Your Name <you@example.com>'

Mostrar diff pelas palavras

$ git diff HEAD^..HEAD --color-words

Links úteis

About these ads