Comandos úteis do GIT
Conheça os principais comandos do GIT que poderão nos ajudar no dia a dia
Sempre que navego pela internet, seja acessando o Twitter ou navegando por entre artigos técnicos, em vários momentos encontro algo falando sobre os comandos do GIT. Tive o costume de salvar cada link que encontrava sobre este assunto para poder ter conhecimento do que eventualmente poderia vir a me ajudar no dia a dia do trabalho.
A ideia desta publicação é listar alguns comandos úteis do GIT que podem nos auxiliar no dia a dia enquanto desenvolvemos software e que irá facilitar mais a produtividade das nossas entregas e resoluções gerais.
Neste post, você encontrará um apanhado de comandos que vão um pouco além do que de fato utilizamos com muito mais frequencia como os conhecidíssimos:
- git checkout -b branch
- git add .
- git commit -m "mensagem" -m "descrição do commit"
- git push origin branch
Commits
| Ação | Comando | Mais informações |
|---|---|---|
| Edita o último commit | git commit -v --amend |
Vai abrir o editor interativo no qual você poderá editar algumas coisas do seu último commit, como por exemplo a mensagem, descrição. Assim como também exibe o diff do commit. |
| Lista todos os arquivos até um commit | git ls-tree --name-only -r id-do-commit |
Vai exibir a lista de arquivos existentes até o commit especificado. |
| Lista todos os arquivos alterados em um commit | git diff-tree --no-commit-id --name-only -r id-do-commit |
Lista apenas os arquivos que foram editados (e não somente adicionados) até o commit especificado |
| Desfaça um commit criando um novo commit | git revert id-do-commit |
Geralmente é usado quando enviamos alguma alteração para produção que deu algum conflito. Nós revertemos o que foi alterado neste unico commit e enviamos para produção até entender melhor o que aconteceu. |
| Descartar commits | git reset --soft id-do-commit |
Recomendado para branch privada. Usado quando criamos algum commit mas queremos desfazer sem perder os arquivos adicionados/alterados. |
| Fez commit errado e quer voltar atrás? | git reset HEAD~numero-de-commits-que-quer-voltar |
Ao invés de usar o identificador do commit, você pode usar a quantidade de commits que deseja voltar atrás |
| Reseta o autor, após o autor ter sido alterado na configuração global | git commit --amend --reset-author --no-edit |
- |
| Renomeia mensagem do último commit | git commit --amend |
- |
| Veja o histórico de commits apenas para a branch atual | git cherry -v master |
Neste caso, vai exibir os commits que estão na branch atual mas que não estão na master |
| Marca o seu commit como uma correção de um commit anterior | git commit --fixup id-do-commit |
Você fez alteração em um arquivo, adicionou no staging e, ao usar este comando, ele vai criar um outro commit iniciando a mensagem com "fixup! + mensagem do commit referenciado". Será um commit com a correção de outro commit anterior. |
| Altera autor do último commit | git commit --amend --author='Author Name <email@address.com>' |
- |
| Ignora githooks pré-commit e commit-msg | git commit --no-verify |
Vai fazer o commit sem realizar as verificações que podem estar configuradas para estabeler algum padrao. |
| Modifica o commit anterior sem modificar a mensagem do commit | git add --all && git commit --amend --no-edit |
As vezes precisamos fazer uma alteração muito pequena que não faz sentido criar um novo commit para isto, mas sim, juntar com o commit anterior que já está registrado. Este comando adiciona as alterações ao staging e emenda elas no último commit. |
| Ignora um arquivo no commit (por exemplo, Changelog) | git update-index --assume-unchanged Changelog; git commit -a; git update-index --no-assume-unchanged Changelog |
É usado para ignorar arquivos que você não precisa alterar localmente (ou não deve alterar), depois podemos commitar as alterações e restaurar o gerenciamento do arquivo no GIT |
| Número de commits em uma branch | git rev-list --count nome-da-branch |
- |
| Agrupa commits por autores e título | git shortlog |
Vai exibir todos os commits ordenados por seu respectivo autor |
| Exibe o hash do primeiro commit | git rev-list --reverse HEAD | head -1 |
- |
| Lista commits do git que ainda não foram enviados | git cherry -v |
- |
| Apaguei um arquivo, fiz o commit e já dei um push mas quero reverter | git revert --no-commit id-do-commit |
- |
| Mostra detalhes do commit atual | git show |
- |
| Leva um commit para outra branch | git cherry-pick id-do-commit |
Você fez uma alteração em uma branch, porém esteva na branch errada e acabou fazendo um commit nela. Com este comando, você pode pegar o commit de uma branch e adicionar em outra. |
| Adiciona notas ao último commit | git notes add -m 'Note on the previous commit....' |
- |
Stash
| Ação | Comando | Mais informações |
|---|---|---|
| Salva o estado atual dos arquivos rastreados sem precisar commitar | git stash |
As vezes estamos fazendo alterações e precisamos ir para outra branch por exemplo, mas não queremos fazer o commit dos arquivos para não perder as alterações. Então, "arquivamos" pra voltar a mexer nelas depois. |
| Salva o estado atual das alterações unstaged nos arquivos rastreados | git stash -k ou git stash --keep-index |
Neste caso, ainda não adicionamos os arquivos alterados no staging |
| Salva o estado atual, incluindo arquivos unstaged | git stash -u |
Salvamos todas as alterações, seja arquivos que estão no staging ou não |
| Mostra lista de todos os stashes salvos | git stash list |
Aqui ficará uma lista dos arquivos que você editou e resolveu "arquivar" pra trabalhar neles depois |
| Salva estado atual com mensagem | git stash save "mensagem do stash" ou git stash push -m "mensagem do stash" |
Ao listar todos os stashes, você não tem uma mensagem clara do que cada stash salvo significa. Para ficar melhor de encontrar no que voce estava trabalhando e deseja retornar, é legal adicionar uma mensagem |
| Salva o estado atual de todos os arquivos (ignorado, não rastreado e rastreado) | git stash -a ou git stash --all |
- |
| Mostra o conteúdo de qualquer stash em forma de patch | git stash show -p numero-do-stash |
Você conseguirá visualizar as modificações que foram feitas no stash registrado |
| Utiliza qualquer stash sem excluir da lista armazenada | git stash apply numero-do-stash |
Você pode utilizar novamente as alterações realizadas que foram salvas no stash para que possa trabalhar nelas agora, porém, elas continuarão salvas na lista do stash. |
| Utiliza o último stash e exclui da lista | git stash pop |
Faz uso do último stash salvo na lista de stashes e exclui eles da lista |
| Esqueceu o que tem no stash? | git stash show stash@{1} ou use este comando para ver as alterações detalhadas git stash show -p stash@{1} |
- |
| Exclua os stashes armazenados | git stash clear ou git stash drop numero-do-stash |
- |
| Pega apenas um único arquivo de um stash | git checkout stash@{n} -- nome-do-arquivo ou git checkout stash@{0} -- nome-do-arquivo |
- |
Diffs
| Ação | Comando | Mais informações |
|---|---|---|
| Exibe as mudanças nos arquivos comparadas ao último commit | git diff |
- |
| Exibe as alterações adicionadas ao staging que ainda não foram commitadas | git diff --cached ou git diff --staged |
- |
| Exibe as alterações em stages e unstages | git diff HEAD |
- |
| Mostra alterações diff inline | git diff --word-diff |
- |
| Abra todos os arquivos em conflito em um editor | git diff --name-only | uniq | xargs $EDITOR |
- |
| Adicione tudo, mas as alterações de espaço em branco | git diff --ignore-all-space | git apply --cached |
- |
Branches
| Ação | Comando | Mais informações |
|---|---|---|
| Obtenha o nome do branch atual | git rev-parse --abbrev-ref HEAD |
- |
| Lista todas as branchs que já estão mescladas na branch master | git branch --merged master |
- |
| Lista todos as branches e seus upstreams, assim como também o último commit de cada branch | git branch -vv |
- |
| Exclua uma branch local | git branch -d nome-da-branch-local |
- |
| Exclua uma branch remota | git push origin --delete nome-da-branch-remota ou git branch -dr nome-da-branch-remota |
- |
| Obtenha uma lista de todas as branches locais e remotas | git branch -a |
- |
| Obtenha apenas a lista de branches remotas | git branch -r |
- |
| Cria uma nova branch e já troca imediatamente para ela | git checkout -b nome-da-branch ou git branch nome-da-branch && git checkout nome-da-branch |
- |
| Descubra branches que contenha algum id-do-commit especifico | git branch -a --contains id-do-commit |
- |
| Remova branchs que já foram mesclados com a master | git branch --merged master | grep -v '^*' | xargs -n 1 git branch -d |
- |
| Arquiva a branch master | git archive master --format=zip --output=master.zip |
- |
| Exporta uma branch com histórico para um arquivo | git bundle create <file> nome-da-branch |
- |
| Importar de um pacote | git clone repo.bundle <repo-dir> -b nome-da-branch |
- |
| Extraia o arquivo de outra branch | git show nome-da-branch:nome-do-arquivo |
- |
| Clone uma unica branch | git clone -b nome-da-branch --single-branch https://github.com/user/repo.git |
- |
| Mostra todas as branches locais ordenadas por commits recentes | git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/ |
- |
| Encontre o ancestral comum de duas branches | git merge-base nome-da-branch nome-da-outra-branch |
- |
| Cria uma uma nova branch sem nenhum histórico | git checkout --orphan nome-da-branch |
- |
| Lista todas as branchs em WIP | git checkout master && git branch --no-merged |
- |
| Sincroniza as branches e limpa as que foram deletadas no repositorio remoto | git fetch -p |
- |
| Traz do repositório remoto todas informações sobre ele que ainda não estão no seu repositório local | git fetch |
Este comando NÃO incorpora essas mudanças, ou seja não realiza um merge. Isso é útil se você precisa manter seu repositório atualizado, mas está trabalhando em algo que pode ser quebrado se você atualizar seus arquivos. |
Logs
| Ação | Comando | Mais informações |
|---|---|---|
| Mostra as mudanças realizadas ao longo do tempo de um arquivo específico | git log -p nome-do-arquivo |
- |
| Mostra uma lista resumida dos commits | git log --oneline |
- |
| Exibe resumo do histórico | git log --stat |
Hash completa, autor, data, comentário e quantidade de alterações (+-) |
| Veja todos os commits feitos desde o fork da master | git log --no-merges --stat --reverse origin/master.. |
- |
| Veja os commits da BRANCH1 que não estão na BRANCH2 | git log BRANCH_1 ^BRANCH_2 |
- |
| Lista um número especifos dos últimos commits | git log -<n> ou git log -n <n> |
Substituia o <n> pela quantidade dos últimos commits que você deseja visualizar, por exemplo, os 5 últimos commits, os 10 últimos commits, etc. |
| Lista os commits e as respectivas alterações de um arquivo específico | git log --follow -p -- nome-do-arquivo |
- |
| Lista os commits de um arquivo específico | git log -- nome-ou-caminho-do-arquivo |
- |
| Veja as assinaturas GPG no log de commits | git log --show-signature |
Você pode usar o GPG para assinar commits com uma chave GPG que você mesmo gera. O GitHub usa bibliotecas OpenPGP para confirmar que seus commits e tags assinados localmente são criptograficamente verificáveis em relação a uma chave pública que você adicionou à sua conta no GitHub.com. |
| Lista apenas os commits da branch e os que foram mergeados | git log --first-parent |
- |
| Lista apenas os commits que foram mergeados | git log --merges |
- |
| Exibe commits de todas as branches que contém determinado texto na mensagem de commit | git log --all --grep='TEXTO' |
- |
| Obtenha o primeiro commit de uma branch (criada a partir da master) | git log --oneline master..nome-da-branch | tail -1 ou git log --reverse master..nome-da-branch | head -6 |
- |
| Mostra todas as notas do git | git log --show-notes='*' |
- |
| Mostra commits entre um intervalo de datas | git log --since='FEB 1 2017' --until='FEB 14 2017' |
- |
| Exibe apenas o log de commits que não possui o nome de um autor especifico | git log --perl-regexp --author='^((?!nome-do-autor-ou-uma-regex).*) |
- |
| Exibe log de commits sobre o que mudou desde duas semanas | git log --no-merges --raw --since='2 weeks ago' |
- |
| Visualiza a árvore de versão | git log --pretty=oneline --graph --decorate --all ou git log --graph --pretty=format:'%C(auto) %h | %s | %an | %ar%d' |
|
| Recupera o hash do primeiro commit | git log --pretty=oneline | tail -1 | cut -c 1-40 ou git log --pretty=oneline --reverse | head -1 | cut -c 1-40 |
- |
| Exibe histórico de um autor especifico | git log --author="nome-do-autor" |
- |
| Exibe estatisticas dos commits de um autor | git log --author="nome-do-autor" --oneline --shortstat |
- |
| Exibe estatisticas dos arquivos alterados/adicionados de um autor | git log --author="nome-do-autor" --pretty=tformat: --numstat |
- |
Tag
| Ação | Comando | Mais informações |
|---|---|---|
| Cria tag local | git tag nome-da-tag |
- |
| Exclui tag local | git tag -d nome-da-tag |
- |
| Mostra a tag mais recente na branch atual | git describe --tags --abbrev=0 |
- |
| Exclui tag remota | git push origin:refs/tags/nome-da-tag |
- |
Checkout
| Ação | Comando | Mais informações |
|---|---|---|
| Muda rapidamente para a branch anterior | git checkout - ou git checkout @{-1} |
Você pode usar o segundo comando especificando a quantidade de vezes que se deve voltar até a branch desejada que deseja selecionar |
| Desfaz alterações do arquivo | git checkout -- nome-do-arquivo |
- |
| Escolha commits entre branches usando cherry-pick | git checkout nome-da-branch && git cherry-pick id-do-commit |
- |
| Renomeia uma branch | git branch -m novo-nome-da-branch ou git branch -m nome-da-branch novo-nome-da-branch |
Use o primeiro comando caso esteja na branch selecionada, e utilize o segundo comando caso queira renomeiar uma branch mas que não esteja nela |
| Restaura arquivo excluído que foi commitado | git checkout id-do-commit-do-arquivo-excluido~1 -- nome-do-arquivo |
- |
| Restaura arquivo para um id-do-commit específico | git checkout id-do-commit -- nome-do-arquivo |
- |
Configs
| Ação | Comando | Mais informações |
|---|---|---|
| Adiciona um usuário global | git config --global user.name "Author Name" |
- |
| Adiciona um email global | git config --global user.email email@email.com.br |
- |
| Git alias | git config --global alias.identificador-do-comando seu-comando |
Você pode criar um alias para comandos mais usados para simplificar o uso. Exemplo: git config --global alias.envia 'commit --amend --no-edit' em seguida é só eu usar git envia |
| Lista todos os alias e as configurações | git config --list |
- |
| Remova alguma configuração global | git config --global --unset nome-da-config |
- |
| Adiciona editores personalizados | git config --global core.editor nome-do-editor |
- |
| Corrige automaticamente os erros de digitação | git config --global help.autocorrect 1 |
No lugar do 1, você pode utilizar a palavra prompt. Então, ao invés de corrigir automaticamente, ele primeiro pede permissão. |
| Faz o git pull usar rebase por padrão ao invpes de merge | git config --global pull.rebase true |
- |
| Permite registrar e reutilizar resoluções de conflitos anteriores. | git config --global rerere.enabled 1 |
Supomos que você esteja trabalhando na branch feature-1 e seu colega de time envia novas alterações para a master que dão conflito com suas alterações. Você geralmente faz o rebase e ajusta os conflitos na sua branch. Porém, você continua alterando seu arquivo e novas alterações que foram pra master darão conflitos novamente no que você está fazendo e você tem que fazer a mesma correção de conflito. Com este comando, quando a branch estiver finalmente pronta, você a mesclará novamente, mas, graças às resoluções registradas, não será necessário resolver os mesmos conflitos de mesclagem de novo. |
| Desabilita a saída colorida do terminal do git | git config --global color.ui false |
- |
| Edita alguma configuração do git, seja --global ou --local | git config --global --edit |
- |
| Usa SSH em vez de HTTPs para repositorios remotos | git config --global url.'git@github.com:'.insteadOf 'https://github.com/' |
- |
Rebase
| Ação | Comando | Mais informações |
|---|---|---|
| Altera os dois commits anteriores em um rebase interativo | git rebase -i HEAD~2 |
- |
| Muda a base principal de uma branch | git rebase --onto nova-base base-antiga |
As vezes podemos ter uma branch-1 que foi criada a partir da branch-2, mas faz mais sentido ela ter como base principal a master |
Remote
| Ação | Comando | Mais informações |
|---|---|---|
| Altera a URL remota | git remote set-url origin nova-url-remota |
- |
| Lista todos os repositorios remotos configurados atualmente | git remote -v |
- |
Clean
| Ação | Comando | Mais informações |
|---|---|---|
| Remove à força arquivos não rastreados | git clean -f |
- |
| Remove à força o diretório não rastreado | git clean -f -d |
- |
| Limpa os arquivos de .gitignore | git clean -X -f |
- |
Examina informações dos arquivos (ls-files)
| Ação | Comando | Mais informações |
|---|---|---|
| Mostra todos os arquivos rastreados | git ls-files -t |
- |
| Mostra todos os arquivos não rastreados | git ls-files --others |
- |
| Mostra todos os arquivos ignorados | git ls-files --others -i --exclude-standard |
- |
| Faz backup de arquivos não rastreados | git ls-files --others -i --exclude-standard | xargs zip untracked.zip |
- |
Push
| Ação | Comando | Mais informações |
|---|---|---|
| Faz o push forçado, mas ainda garante que você não substitua o trabalho de outros | git push --force-with-lease remote-name branch-name |
- |
| Envia a branch atual para o mesmo nome no repositório remoto | git push origin HEAD |
- |
| Envia uma nova branch local para o repositório remoto e rastreia ela | git push -u origin nome-da-branch |
- |
Status
| Ação | Comando | Mais informações |
|---|---|---|
| Mostra status de arquivos ignorados | git status --ignored |
- |
| Mostra status simplificado | git status --short --branch |
- |
Extras
| Ação | Comando | Mais informações |
|---|---|---|
| Adiciona partes de um arquivo alterado, em vez de todo o arquivo | git add -p |
- |
| Verifica se o commit fez parte de uma release | git name-rev --name-only id-do-commit |
- |
| Adicionou arquivo ao staging e quer retirar? | git reset nome-do-arquivo |
- |
| Atualiza todos os submódulos | git submodule foreach git pull ou git submodule update --init --recursive ou git submodule update --remote |
- |
| Lista os arquivos ignorados | git check-ignore * |
- |
| Clona uma cópia superficial de um repositório | git clone https://github.com/user/repo.git --depth 1 |
- |
| Exibe a estimativa do tamanho do repositorio e seu consumo de disco | git count-objects --human-readable |
- |
| Encontre as linhas que correspondam ao padrão (regex ou string) dos arquivos rastreados | git grep --heading --line-number 'foo bar' |
- |
| Mostra com quantas linhas um autor contribuiu pelo email | Primeiro crie um alias count-lines no seu sistema git config --global alias.count-lines "! git log --author=\"\$1\" --pretty=tformat: --numstat | awk '{ add += \$1; subs += \$2; loc += \$1 - \$2 } END { printf \"added lines: %s, removed lines: %s, total lines: %s\n\", add, subs, loc }' #" em seguida é só usar git count-lines email@example.com |
- |
| Mostra o autor, hora e a última alteração feita em cada linha de um determinado arquivo | git blame nome-do-arquivo |
- |
| Desfaz o rastreamento dos arquivos sem excluí-los | git rm --cached nome-do-arquivo |
- |
| Obtenha o nome do repositório | git rev-parse --show-toplevel |
- |
Tire um tempinho para testar alguns comandos (e até sugerir novos!). É sempre bom entender um pouco mais sobre, afinal, poderá nos auxiliar bastante enquanto estivermos desenvolvendo nossos projetos :)
Comentários
Prefere comentar em ânonimo? Siga os seguintes passos:
- Clique no campo "Nome"
- Marque os itens necessários, principalmente o último: "Prefiro publicar como um visitante"
- Adicione um email
- Agora só enviar seu comentário :)