🐙 Git e GitHub CLI
Comandos básicos e avançados do Git para controle de versão, ramificação, repositórios remotos, stash, tags e GitHub CLI.
🔹 Comandos Básicos
Comando |
Exemplo |
Descrição |
|---|---|---|
git add |
Adicionar um arquivo à área de staging | |
git add file.txt |
Preparar um arquivo específico para o próximo commit |
|
git add . |
Preparar todas as mudanças no diretório atual e abaixo |
|
git add -p |
Escolher interativamente quais partes dos arquivos preparar (útil para commits parciais) |
|
git clone |
Clonar um repositório em um novo diretório | |
git clone -b branch_name URL |
Clonar apenas o branch especificado (em vez do padrão) |
|
git clone --depth 1 URL |
Clonar apenas o último commit, criando uma cópia superficial para economizar tempo e espaço |
|
git commit |
Registrar alterações no repositório | |
git commit -m "Initial commit" |
Fazer commit com uma mensagem sem abrir o editor |
|
git commit -a -m "Fix bugs" |
Preparar e commitar todos os arquivos rastreados modificados com uma mensagem |
|
git commit --amend |
Atualizar o último commit (alterar mensagem ou incluir mais mudanças) |
|
git commit --fixup abc1234 |
Criar um commit de correção (fixup) para ser automaticamente squashado depois durante o rebase interativo |
|
git config |
Obter e definir opções do repositório ou globais | |
git config --global user.name "Name" |
Definir nome de usuário global do Git |
|
git config --global user.email "email@example.com" |
Definir email global do Git |
|
git config --list |
Listar todas as configurações do Git (nome, email, editor, etc.) |
|
git diff |
Mostrar alterações entre commits, commit e diretório de trabalho, etc. | |
git diff HEAD |
Mostrar o que você alterou desde o último commit (mudanças não preparadas) |
|
git diff --staged |
Mostrar o que será incluído no próximo commit |
|
git diff --word-diff HEAD~1 |
Mostrar alterações com diferenças em nível de palavra |
|
git grep |
Pesquisar dentro dos arquivos do repositório | |
git grep "functionName" |
Encontrar todas as menções de |
|
git grep -n "TODO" |
Encontrar linhas contendo |
|
git grep -i "login" |
Pesquisar pela palavra |
|
git init |
Criar um repositório Git vazio ou reinicializar um existente | |
git init my-project |
Inicializar um novo repositório no diretório my-project |
|
git init --bare |
Inicializar um repositório bare |
|
git log |
Mostrar histórico de commits | |
git log --oneline |
Mostrar histórico de commits em formato compacto de uma linha |
|
git log --graph --all |
Mostrar todos os branches em um gráfico visual de commits |
|
git log -p --stat |
Mostrar patch e estatísticas de alterações de arquivos para commits |
|
git reset |
Remover arquivos da área de staging, mantendo mudanças no diretório de trabalho | |
git reset HEAD file.txt |
Remover um arquivo do staging (mantém suas edições) |
|
git reset --hard HEAD~1 |
Voltar um commit e excluir todas as mudanças (irreversível!) |
|
git reset --soft HEAD~1 |
Desfazer o último commit mas manter as alterações prontas para novo commit |
|
git reset --mixed HEAD~1 |
Desfazer um commit mas manter as mudanças fora do staging no diretório de trabalho |
|
git show |
Mostrar vários tipos de objetos | |
git show <commit_hash> |
Mostrar mudanças e mensagem de um commit específico |
|
git show HEAD~1 |
Mostrar o commit anterior ao atual |
|
git show --stat |
Mostrar um resumo das alterações de arquivos do último commit |
|
git status |
Mostrar o status da árvore de trabalho | |
git status -s |
Mostrar status em formato curto |
|
git status -b |
Mostrar branch atual e status dos arquivos |
🌿 Ramificação e Merge
Comando |
Exemplo |
Descrição |
|---|---|---|
git branch |
Criar, listar ou excluir branches | |
git branch new-feature |
Criar um novo branch chamado |
|
git branch -d old-feature |
Excluir um branch local chamado |
|
git checkout |
Trocar de branch ou restaurar arquivos de outro commit | |
git checkout main |
Trocar para o branch |
|
git checkout -b new-branch |
Criar e trocar para um novo branch chamado |
|
git switch |
Trocar de branch (alternativa simplificada ao checkout) |
|
git switch main |
Trocar para o branch |
|
git switch -c feature-x |
Criar e trocar para um novo branch chamado |
|
git switch new-feature |
Trocar para um branch existente chamado |
|
git merge |
Combinar alterações de outro branch no atual | |
git merge new-feature |
Fazer merge do branch |
|
git merge --no-ff new-feature |
Sempre criar um commit de merge (mesmo se fast-forward for possível) |
|
git merge --abort |
Cancelar o merge e reverter alterações se ocorrerem conflitos |
|
git rebase |
Mover ou reaplicar commits em cima de um novo commit base | |
git rebase main |
Reaplicar os commits do seu branch em cima do branch |
|
git rebase -i HEAD~3 |
Editar interativamente os últimos 3 commits |
|
git rebase --abort |
Parar e desfazer um rebase em andamento |
|
git rebase -i --autosquash HEAD~5 |
Squash automático de commits marcados como fixup ou squash durante rebase interativo |
|
git cherry-pick |
Aplicar commits específicos de outro branch | |
git cherry-pick <hash> |
Aplicar um commit específico (por hash) ao branch atual |
|
git cherry-pick --continue |
Continuar cherry-pick após resolver conflitos |
|
git cherry-pick A^..B |
Aplicar um intervalo de commits de |
📡 Repositórios Remotos
Comando |
Exemplo |
Descrição |
|---|---|---|
git remote |
Gerenciar links para repositórios remotos (como GitHub) | |
git remote -v |
Mostrar nomes e URLs dos remotos |
|
git remote add origin URL |
Adicionar um repositório remoto chamado |
|
git pull |
Baixar e mesclar automaticamente mudanças de um branch remoto | |
git pull origin main |
Buscar e mesclar mudanças do branch remoto |
|
git pull --rebase origin main |
Buscar e rebasear seu branch atual em cima do remoto em vez de mesclar |
|
git push |
Enviar suas alterações locais para um repositório remoto | |
git push origin main |
Enviar seu branch local |
|
git fetch |
Baixar mudanças do remoto sem mesclar | |
git fetch origin |
Buscar todas as atualizações do remoto |
|
git fetch origin main |
Buscar apenas o branch |
|
git fetch --all |
Buscar atualizações de todos os remotos |
|
git fetch --prune |
Limpar branches deletados — remover refs locais para branches que foram excluídos remotamente |
|
git fetch --dry-run |
Mostrar o que seria buscado, sem realmente baixar nada |
|
git fetch origin +main |
Atualizar forçadamente seu branch de rastreamento local ( |
📦 Stash e Limpeza
Comando |
Exemplo |
Descrição |
|---|---|---|
git stash |
Salvar temporariamente alterações não commitadas (trabalho em andamento) | |
git stash |
Salvar arquivos modificados e staged, depois reverter diretório de trabalho para o último commit |
|
git stash apply |
Reaplicar as últimas alterações armazenadas (stash permanece salvo) |
|
git stash pop |
Reaplicar e remover o último stash |
|
git stash list |
Mostrar lista de todas as alterações salvas (stashed) |
|
git stash branch feature-fix |
Criar um novo branch e aplicar o último stash nele |
|
git clean |
Excluir permanentemente arquivos não rastreados (fora do Git) | |
git clean -f |
Excluir arquivos não rastreados no diretório atual |
|
git clean -fd |
Excluir arquivos e pastas não rastreados |
|
git clean -n |
Pré-visualizar o que será excluído (dry run seguro) |
🏷️ Tags
Comando |
Exemplo |
Descrição |
|---|---|---|
git tag |
Criar, listar ou excluir tags para marcar pontos específicos na história (como releases) | |
git tag -a v1.0 -m "Version 1.0" |
Criar uma tag anotada chamada |
|
git tag -d v1.0 |
Excluir a tag local chamada |
|
git push |
Enviar commits, branches e tags do local para o repositório remoto | |
git push origin --tags |
Enviar todas as tags locais para o remoto (útil após criar múltiplas versões) |
|
git push origin v1.0 |
Enviar uma tag específica (ex.: |
|
git push origin :refs/tags/v1.0 |
Excluir a tag remota |
🛠️ Resolução de Conflitos
Comando |
Exemplo |
Descrição |
|---|---|---|
git mergetool |
Abrir uma ferramenta visual para ajudar a resolver conflitos de merge | |
git mergetool --tool=meld |
Usar uma ferramenta de merge específica (como Meld) para resolver conflitos |
|
git rerere |
Permitir que o Git se lembre de como você resolveu conflitos de merge antes | |
git config --global rerere.enabled true |
Ativar reuso automático de resoluções anteriores de conflitos |
|
git rerere status |
Mostrar quais arquivos têm resoluções salvas |
|
git rerere diff |
Mostrar quais alterações o Git salvou para reuso futuro |
⚙️ Comandos Avançados
Comando |
Exemplo |
Descrição |
|---|---|---|
git bisect |
Usar busca binária para encontrar o commit que introduziu um bug | |
git bisect start |
Iniciar busca binária entre um commit bom e um ruim conhecido para localizar um bug |
|
git bisect bad |
Marcar o commit atual como “ruim” (contém o bug) |
|
git bisect good <commit> |
Marcar um commit conhecido como “bom”, onde o bug não existia |
|
git blame |
Mostrar quem modificou pela última vez cada linha de um arquivo, com revisão e autor | |
git blame file.txt |
Mostrar autor e informações de commit para cada linha do arquivo |
|
git blame -L 10,20 file.txt |
Mostrar informações de blame apenas das linhas 10 a 20 |
|
git blame --show-email file.txt |
Mostrar emails dos autores junto às alterações |
|
git reflog |
Visualizar e gerenciar o reflog de movimentações de branch e HEAD | |
git reflog show main@{1.week.ago} |
Ver onde o branch |
|
git reflog expire --expire=30.days --dry-run |
Pré-visualizar quais entradas de reflog mais antigas que 30 dias podem ser limpas |
|
git reflog delete HEAD@{2} |
Excluir uma entrada específica do reflog (use com cuidado, pode afetar recuperação) |
|
git submodule |
Adicionar, inicializar, atualizar ou inspecionar submódulos (repositórios dentro de repositórios) | |
git submodule add URL path |
Adicionar um repositório externo como submódulo em um caminho específico |
|
git submodule update --init |
Inicializar e baixar todos os submódulos listados no repositório |
|
git submodule foreach git pull |
Executar |
|
git submodule sync --recursive |
Sincronizar URLs de submódulos após mudanças no arquivo |
|
git submodule update --remote --merge |
Atualizar submódulos para o último commit de seus branches remotos |
|
git archive |
Criar um arquivo (zip, tar, etc.) dos arquivos de um commit ou branch específico | |
git archive --format=zip HEAD > archive.zip |
Criar um arquivo ZIP dos arquivos do projeto no HEAD |
|
git archive -o release.tar.gz HEAD |
Criar um arquivo |
|
git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz |
Criar um arquivo |
|
git gc |
Limpar arquivos desnecessários e otimizar o repositório para desempenho | |
git gc --aggressive |
Executar uma limpeza e otimização completa (pode ser lenta mas eficaz) |
|
git gc --prune=now |
Remover imediatamente todos os objetos inalcançáveis (perigoso se não tiver certeza) |
|
git shortlog |
Resumo rápido de autores e seus commits | |
git shortlog -e |
Mostrar uma lista de autores com seus emails (ex.: para analisar quem contribuiu e quanto) |
|
git shortlog -s -n |
Mostrar quantos commits cada autor fez, ordenados por número de commits |
|
git shortlog -sne |
Mesmo que acima, mas incluindo nomes e emails — útil para rastreamento detalhado de atividade |
|
git revert |
Criar um novo commit que desfaz alterações de um commit anterior sem reescrever o histórico | |
git revert HEAD |
Desfazer o último commit criando um novo commit que reverte suas mudanças |
|
git revert <commit_hash> |
Desfazer um commit específico por hash, adicionando com segurança um novo commit que o reverte |
🐙 GitHub CLI
ghpermite gerenciar o GitHub a partir do terminal.
Comando |
Exemplo |
Descrição |
|---|---|---|
gh auth login |
Autenticar-se em um host GitHub para permitir que comandos CLI interajam com sua conta | |
gh auth login --with-token < mytoken.txt |
Autenticar usando um token de acesso pessoal armazenado em um arquivo ( |
|
gh auth login --hostname enterprise.internal |
Autenticar em um servidor GitHub Enterprise (não github.com) |
|
gh repo clone |
Clonar um repositório GitHub para sua máquina local | |
gh repo clone user/repo |
Clonar o repositório |
|
gh repo clone cli/cli -- --depth=1 |
Clonar o repositório mas baixar apenas o commit mais recente, criando uma cópia superficial mais rápida e leve |
|
gh repo clone cli/cli workspace/cli |
Clonar o repositório em uma pasta personalizada |
|
gh issue list |
Listar issues em um repositório GitHub, opcionalmente filtradas por vários critérios | |
gh issue list --assignee "@me" |
Listar issues atribuídas a você |
|
gh issue list --state all |
Listar issues independentemente do estado (abertas ou fechadas) |
|
gh issue list --search "error no:assignee sort:created-asc" |
Listar issues que contenham “error”, não atribuídas, ordenadas por data de criação ascendente |
|
gh pr create |
Criar um pull request no GitHub via CLI | |
gh pr create --title "..." |
Criar um pull request com o título fornecido |
|
gh pr create --project "Roadmap" |
Vincular o pull request a um projeto GitHub chamado “Roadmap” |
|
gh pr create --base develop --head monalisa:feature |
Criar um PR do branch |
|
gh repo create |
Criar um novo repositório GitHub via CLI | |
gh repo create my-project |
Criar um novo repositório chamado |
|
gh repo create my-project --public --clone |
Criar um repositório público e cloná-lo localmente |
|
gh repo create my-project --private --source=. --remote=upstream |
Criar um repositório remoto privado a partir da pasta atual e adicionar remoto chamado |
💡 Atalhos Git (Aliases Úteis)
Configure aliases convenientes para acelerar comandos Git comuns:
git config --global alias.br branch # atalho para: git branch
git config --global alias.ci commit # atalho para: git commit
git config --global alias.co checkout # atalho para: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate" # histórico bonito em forma de gráfico
git config --global alias.last "log -1 HEAD" # mostrar o último commit
git config --global alias.st status # atalho para: git status🚀 Comandos Avançados de Git para Profissionais
Comando |
Exemplo |
Descrição |
|---|---|---|
git filter-repo |
Uma ferramenta poderosa e eficiente para reescrever o histórico do Git, removendo ou modificando arquivos, autoria ou caminhos; substitui o git filter-branch com mais velocidade e segurança | |
git filter-repo --path secret.txt --invert-paths |
Reescrever de forma eficiente o histórico do repositório para remover arquivos ou diretórios sensíveis sem os problemas de desempenho do |
|
git filter-repo --replace-text replacements.txt |
Substituir em massa strings ou padrões em todo o histórico (ex.: sanitizar credenciais) |
|
git filter-repo --subdirectory-filter src |
Extrair histórico de um subdiretório em um novo repositório, preservando metadados de commits |
|
git worktree |
Gerenciar múltiplos diretórios de trabalho vinculados a um único repositório, permitindo trabalhar em diferentes branches simultaneamente sem clonar | |
git worktree add ../feature feature-branch |
Criar um diretório de trabalho adicional anexado ao mesmo repositório, permitindo checkouts paralelos de branches sem clones |
|
git worktree list |
Listar todos os worktrees ativos, seus caminhos e branches associados |
|
git worktree remove ../feature |
Remover um worktree vinculado quando não for mais necessário, limpando diretórios com segurança |
|
git replace |
Criar referências temporárias que substituem objetos existentes, permitindo manipulação de histórico local não destrutiva para testes | |
git replace <old_commit> <new_commit> |
Trocar temporariamente um commit por outro em seu repositório local, útil para testes ou correções sem reescrever histórico |
|
git replace --list |
Mostrar todas as referências de substituição ativas |
|
git replace -d <replace_ref> |
Excluir uma referência de substituição específica para reverter comportamento |
|
git stash |
Salvar temporariamente alterações não commitadas em uma pilha, permitindo troca de contexto sem commitar trabalho inacabado | |
git stash push -p |
Selecionar interativamente trechos de alterações para stash, fornecendo controle granular sobre o que é salvo |
|
git stash push -m "WIP selective stash" |
Criar um stash com mensagem personalizada para identificação mais fácil |
|
git stash apply stash@{2} |
Aplicar um stash específico da lista de stashes, sem removê-lo |
|
git rebase |
Reaplicar commits em cima de outra base, facilitando histórico limpo e linear e edição interativa | |
git rebase --interactive --autosquash |
Iniciar uma sessão de rebase interativo que automaticamente reordena e squash commits marcados como fixup ou squash, simplificando limpeza de histórico |
|
git rebase -i --autosquash HEAD~10 |
Reordenar e squashar commits marcados como fixup ou squash, limpando histórico antes de push |
|
git commit --fixup <commit> |
Criar um commit fixup que será automaticamente squashado durante rebase interativo |
|
git commit --squash <commit> |
Criar um commit squash para combinar com o commit especificado no rebase |
|
git bisect |
Ferramenta de busca binária para identificar de forma eficiente o commit que introduziu um bug testando commits sucessivos e restringindo a mudança problemática | |
git bisect run |
Automatizar o processo de bisect executando um script de teste em cada commit para identificar rapidamente o commit que introduziu um bug sem intervenção manual |
|
git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh |
Automatizar a bisseção rodando um script de teste em cada commit, acelerando significativamente a identificação de bugs |
|
git bisect visualize |
Abrir uma ferramenta gráfica para visualizar o processo de bisseção |
|
git bisect reset |
Sair do modo bisect e retornar ao HEAD original |
|
git commit |
Registrar mudanças no repositório com opções detalhadas de amend, assinatura, fixup e personalização de mensagens para manter histórico de alta qualidade | |
git commit --gpg-sign |
Criar um commit assinado com sua chave GPG para garantir verificação criptográfica da autenticidade e autoria do commit |
|
git commit -S -m "Signed commit" |
Assinar criptograficamente seus commits com sua chave GPG, garantindo integridade e autoria |
|
git config --global user.signingkey <key_id> |
Configurar globalmente a chave GPG usada para assinar commits |
|
git log --show-signature |
Verificar e exibir informações de assinatura GPG para commits |
|
git reflog |
Manter um log de atualizações de HEAD e branches, essencial para recuperar commits perdidos e entender movimentações locais de histórico | |
git reset --hard HEAD@{3} |
Resetar o branch atual para um estado anterior do reflog para recuperar ou desfazer mudanças |
|
git reflog expire --expire=now --all |
Expirar imediatamente todas as entradas do reflog, limpando o histórico do reflog (use com cautela) |
🧰 Dicas de Workflow Profissional e Automação
Tópico |
Comandos / Exemplo |
Explicação & Dicas Pro |
|---|---|---|
Limpeza Agressiva do Repositório |
git gc --aggressive --prune=now |
Executa coleta de lixo profunda e poda objetos inalcançáveis imediatamente para otimizar o repositório. Use em janelas de manutenção |
Worktrees Paralelos de Branch |
git worktree add ../feature-branch feature |
Manter múltiplos worktrees para desenvolvimento simultâneo de features, evitando overhead de clones |
Histórico Limpo e Linear |
git rebase -i --autosquash |
Antes de enviar (push), use rebase interativo com autosquash para manter histórico limpo e legível |
Commits Seguros |
git commit -S |
Assine commits com GPG para aumentar a confiabilidade em repositórios compartilhados; obrigatório em muitos ambientes corporativos |
Bisseção Automatizada |
git bisect run ./test-script.sh |
Automatize a caça a bugs executando um script de teste em cada commit candidato durante o bisect |
Cache de Resolução de Conflitos |
git config --global rerere.enabled true |
Ativar reuso de resoluções de conflitos para acelerar a resolução de conflitos repetidos em rebases ou merges |
Aliases e Hooks Compartilhados |
Armazene aliases comuns do Git e hooks de commit em um repositório compartilhado ou pipeline CI para impor padrões de equipe e melhorar produtividade |
Recursos adicionais
🧠 Dica
Não tente memorizar tudo. Use --help, explore e pratique regularmente:
git help <command>
git status🌐 Links úteis
📘 Documentação oficial do Git — manual detalhado de todos os comandos Git:
https://git-scm.com/docs
📙 Learn Git Branching — tutorial visual interativo para dominar conceitos de branching:
https://learngitbranching.js.org
📕 Livro Pro Git (gratuito, de Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (referência oficial concisa):
https://education.github.com/git-cheat-sheet-education.pdf