O Git é uma ferramenta de versionamento excelente criada para controlar o código do Kernel do Linux. Com o tempo se mostrou extremamente completa e competente para todos os tipos de projeto, apesar de ser um pouco mais complexa. Esse é um post diferente com intuito de apresentar alguns comandos úteis que podem ajudar no dia a dia, ele é resultado de pesquisas naqueles momentos de aperto.
A arte é uma ferramenta; os espíritos são os operários.
– Victor Hugo
Configuração
As configurações realizadas são armazenados no arquivo .gitconfig na pasta home do usuário.
Nome do usuário
git config --global user.name "Ivan Queiroz"
git config --global user.email ivanqueiroz@gmail.com
Editor de texto padrão
git config --global core.editor vim
Ferramenta de merge
git config --global merge.tool vimdiff
Arquivos ignorados nos repositórios globalmente
git config --global core.excludesfile ~/.gitignore
Listar configurações
git config –list
Manipulação de repositório
Comandos para manipular o repositório Git local.
Criar novo repositório
git init
Verificar estado dos arquivos/diretórios
git status
Adicionar um arquivo em específico
git add <nome do arquivo>
Adicionar um diretório em específico
git add <nome do diretório>
Adicionar todos os arquivos/diretórios
git add .
Adicionar um arquivo que esta listado no .gitignore (geral ou do repositório)
git add -f <nome do arquivo>
Comitar um arquivo
git commit <nome do arquivo>
Comitar vários arquivos
git commit <nome do arquivo> <nome do outro arquivo>
Comitar informando mensagem
git commit <nome do arquivo> -m "<mensagem>"
Remover arquivo
git rm <nome do arquivo>
Remover diretório
git rm -r <diretório>
Consultando histórico
Comandos para verificar o histórico do repositório.
Exibir histórico
git log
Exibir histórico com diff das duas últimas alterações
git log -p -2
Exibir resumo do histórico (hash completa, autor, data, comentário e qtde de alterações (+/-))
git log --stat
Exibir informações resumidas em uma linha (hash completa e comentário)
git log --pretty=oneline
Exibir histórico com formatação específica (hash abreviada, autor, data e comentário)
git log --pretty=format:"%h - %an, %ar : %s"
- %h: Abreviação do hash;
- %an: Nome do autor;
- %ar: Data;
- %s: Comentário.
Mais opções de formatação no Git Book
Exibir histório de um arquivo específico
git log -- <caminho_do_arquivo>
Exibir histórico de um arquivo específico que contêm uma determinada palavra
git log --summary -S<palavra> [<caminho_do_arquivo>]
Exibir histórico modificação de um arquivo
git log --diff-filter=M -- <caminho_do_arquivo>
Exibir histórico de um determinado autor
git log --author=usuario
Exibir revisão e autor da última modificação de uma bloco de linhas
git blame -L 12,22 <nome do arquivo>
Desfazendo modificações
Comandos para voltar estados do workspace.
Desfazendo alteração local (working directory)
Este comando deve ser utilizando enquanto o arquivo não foi adicionado na staged area.
git checkout -- <nome do arquivo>
Desfazendo alteração local (staging area)
Este comando deve ser utilizando quando o arquivo já foi adicionado na staged area.
git reset HEAD <nome do arquivo>
Se o resultado abaixo for exibido, o comando reset não alterou o diretório de trabalho.
Unstaged changes after reset:
M <nome do arquivo>
A alteração do diretório pode ser realizada através do comando abaixo:
git checkout <nome do arquivo>
Trabalhando com remotos
Comandos para interagir com repositórios remotos.
Exibir os repositórios remotos
git remote
git remote -v
Vincular repositório local com um repositório remoto
git remote add origin <endereço do repositório>
Exibir informações dos repositórios remotos
git remote show origin
Renomear um repositório remoto
git remote rename origin curso-git
Desvincular um repositório remoto
git remote rm curso-git
Enviar arquivos/diretórios para o repositório remoto
O primeiro push de um repositório define o comportamento default para qual remoto enviar.
git push -u origin master
Nos seguintes a informação pode ser omitida.
git push
Obtendo modificações remotas
Comandos para obter informações dos repositórios remotos.
Atualizar os arquivos no branch atual
git pull
Buscar as alterações, mas não aplica-las no branch atual
git fecth
Clonar um repositório remoto já existente
git clone <endereço>
Tags
Comandos para manipulação de tags.
Criando uma tag leve
git tag <nome da tag>
Criando uma tag anotada
git tag -a <nome da tag> -m "<mensagem>"
Criando uma tag assinada
Para criar uma tag assinada é necessário uma chave privada (GNU Privacy Guard - GPG).
git tag -s <nome da tag> -m "<mensagem>"
Criando tag a partir de um commit (hash)
git tag -a vs-1.2 9fceb02
Criando tags no repositório remoto
git push origin vs-1.2
Criando todas as tags locais no repositório remoto
git push origin --tags
Branches
Comandos para manipulação de branches.
Site muito bom para entender Learn Git Branching
Criando um novo branch
git branch <nome do branch>
Trocando para um branch existente
git checkout hotfix/form-erro
Neste caso, o ponteiro principal HEAD esta apontando para o branch chamado hotfix/form-erro.
Criar um novo branch e trocar
git checkout -b hotfix/form-erro
Voltar para o branch principal (master)
git checkout master
Merge
git merge hotfix/form-erro
Para realizar o merge, é necessário estar no branch que deverá receber as alterações. O merge pode automático ou manual. O merge automático será feito em arquivos textos que não sofreram alterações nas mesmas linhas, já o merge manual será feito em arquivos textos que sofreram alterações nas mesmas linhas.
A mensagem indicando um merge manual será:
Automerging meu_arquivo.txt
CONFLICT (content): Merge conflict in meu_arquivo.txt
Automatic merge failed; fix conflicts and then commit the result.
Apagando um branch
git branch -d hotfix/form-erro
Listar branches
git branch
Listar branches com informações dos últimos commits
git branch -v
Listar branches que já foram fundidos (merged) com o master
git branch --merged
Listar branches que não foram fundidos (merged) com o master
git branch --no-merged
Criando branches no repositório remoto
git push origin hotfix/form-erro
Criando um branch remoto com nome diferente
git push origin hotfix/form-erro:new-branch
Baixar um branch remoto para edição
git checkout -b bug-123 origin/hotfix/form-erro
Apagar branch remoto
git push origin:hotfix/form-erro
Rebasing
Fazendo o rebase entre um o branch experiment e o master.
git checkout experiment
git rebase master
Mais informações e explicações sobre o Rebasing
Stash
Para alternar entre um branch e outro é necessário fazer o commit das alterações atuais para depois trocar para um outro branch. Se existir a necessidade de realizar a troca sem fazer o commit é possível criar um stash. O Stash como se fosse um branch temporário que contem apenas as alterações ainda não commitadas.
Criar um stash
git stash
Listar stashes
git stash list
Voltar para o último stash
git stash apply
Voltar para um stash específico
git stash apply stash@{2}
Onde 2 é o índice do stash desejado.
Criar um branch a partir de um stash
git stash branch meu_branch
Reescrevendo o histórico
Comandos para manipular os commits.
Alterando mensagens de commit
git commit --amend -m "<mensagem>"
Alterar últimos commits (Rebase)
Alterando os três últimos commits
git rebase -i HEAD~3
O editor de texto será aberto com as linhas representando os três últimos commits.
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added catfile
Altere para edit os commits que deseja realizar alterações.
edit f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added catfile
Feche o editor de texto.
Digite o comando para alterar a mensagem do commit que foi marcado como edit.
git commit –amend -m “Nova mensagem”
Aplique a alteração
git rebase --continue
Atenção: É possível alterar a ordem dos commits ou remover um commit apenas mudando as linhas ou removendo.
Juntando vários commits
Seguir os passos anteriores, porém marcar os commits que devem ser juntados com *squash
pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added catfile
Remover todo histórico de um arquivo
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
Bisect
O bisect (pesquisa binária) é útil para encontrar um commit que esta gerando um bug ou uma inconsistência entre uma sequência de commits.
Iniciar pequinsa binária
git bisect start
Marcar o commit atual como ruim
git bisect bad
Marcar o commit de uma tag que esta sem o bug/inconsistência
git bisect good vs-1.1
Marcar o commit como bom
O GIT irá navegar entre os commits para ajudar a indentificar o commit que esta com o problema. Se o commit atual não estiver quebrado, então é necessário marca-lo como bom.
git bisect good
Marcar o commit como ruim
Se o commit estiver com o problema, então ele deverá ser marcado como ruim.
git bisect bad
Finalizar a pesquisa binária
Depois de encontrar o commit com problema, para retornar para o HEAD utilize:
git bisect reset
Fontes
- Projeto Git de Leonardo Comelli - Git
Zeroturnaround - Git Cheat Sheet: Commands and Best Practices