🐙 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