Comandos úteis do GIT

Conheça os principais comandos do GIT que poderão nos ajudar no dia a dia

SHARE:

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 :)