Guia Rápido de Git: Comandos Essenciais para Dominar o Terminal
Organizando e Gerenciando Múltiplos Stashes por Nome no Git
Associar mensagens explicativas aos stashes evita o acúmulo de código temporário anônimo e facilita a recuperação exata de trechos de trabalho pendentes. Essa abordagem permite criar, listar e aplicar alterações salvas de forma organizada ao alternar entre tarefas no repositório.
Bash
# Salva as alterações atuais criando um stash com descrição clara
git stash push -m "wip: ajustes na autenticação de dois fatores"
# Lista todos os stashes armazenados para identificar o índice desejado
git stash list
# Saída esperada:
# stash@{0}: On main: wip: ajustes na autenticação de dois fatores
# stash@{1}: On main: refatoração da camada de banco de dados
# Aplica o stash específico pelo seu identificador mantendo o registro na pilha
git stash apply stash@{0}
Pontos-chave:
- Sintaxe Atualizada: Prefira
git stash push -m "mensagem"ao antigogit stash save, que foi descontinuado nas versões recentes do Git. - Múltiplos Registros: O comando
git stash listexibe todos os itens empilhados no formatostash@{n}, sendo0o mais recente. - Diferença de Comandos: O
git stash applyrestaura as alterações e preserva o stash na lista, enquantogit stash popaplica e remove o item. - Inclusão de Untracked: Por padrão, arquivos novos não rastreados são ignorados; adicione a flag
-upara incluí-los no stash (git stash push -u -m "mensagem").
git, git-stash, version-control, devops, fluxo-de-trabalho, terminal
Removendo Arquivos e Diretórios Não Rastreados do Projeto
A limpeza do workspace remove arquivos e pastas gerados durante testes ou compilações que ainda não foram adicionados ao controle de versão. Essa prática restaura o repositório a um estado limpo sem afetar os arquivos já rastreados.
Bash
# Simula a remoção sem deletar nada (dry run de segurança)
git clean -fdn
# Would remove build/
# Would remove temp_test.log
# Executa a limpeza definitiva de arquivos e diretórios não rastreados
git clean -fd
# Removing build/
# Removing temp_test.log
# Garante que o status do diretório de trabalho está totalmente limpo
git status
# On branch main
# nothing to commit, working tree clean
Pontos-chave:
- Combinação de Flags: A flag
-f(force) confirma a exclusão, enquanto-dinclui diretórios não rastreados no processo de remoção. - Ação Irreversível: Os arquivos apagados pelo
git cleannão vão para a lixeira do sistema operacional nem podem ser recuperados pelo Git. - Modo de Prevenção: Sempre execute com a flag
-n(git clean -fdn) antes do comando definitivo para inspecionar a lista de itens atingidos. - Arquivos Ignorados: Por padrão, o comando preserva os itens listados no
.gitignore; para remover também arquivos ignorados, utilize a flag-x.
git, git-clean, version-control, terminal, devops, limpeza-codigo
Mapeando Alterações por Linha com Git Blame
Identificar o autor e o commit exato de cada linha de código é essencial para entender o contexto histórico e a evolução de um arquivo. O comando git blame exibe o hash, a autoria e a data da última modificação em nível de linha.
Bash
# Exibe o histórico de alterações linha por linha de um arquivo
git blame src/services/api.js
# Limita a análise a um intervalo de linhas específico (ex: linhas 10 a 20)
git blame -L 10,20 src/services/api.js
# Saída esperada:
# a1b2c3d4 (Carlos Silva 2026-03-10 14:22:10 -0300 10) const API_URL = "https://api.v1";
# e5f6g7h8 (Ana Souza 2026-05-18 09:15:43 -0300 11) async function fetchData() {
Pontos-chave:
- Foco em Trechos: A flag
-L inicio,fimrestringe a varredura a blocos de código específicos, otimizando a leitura do terminal. - Inspecionando o Commit: O hash retornado no início de cada linha pode ser copiado e inspecionado em detalhes com
git show <hash>. - Ignorando Formatação: Utilize a flag
-wpara ignorar alterações puramente estéticas de espaço em branco durante a análise. - Movimentação de Código: Com a flag
-C, o Git tenta rastrear a linha de origem mesmo que o código tenha sido movido de outro arquivo.
git, git-blame, auditoria, version-control, terminal, inspecao-codigo
Isolando Regressões no Histórico com Busca Binária
Encontrar a origem de uma falha em projetos com centenas de commits pode ser um processo demorado se feito manualmente. O git bisect automatiza a varredura aplicando busca binária no histórico de commits para localizar o trecho exato onde o bug foi introduzido.
Bash
# Inicia a sessão de busca binária
git bisect start
# Marca o commit atual (HEAD) como quebrado/com bug
git bisect bad
# Marca um commit anterior conhecido onde tudo funcionava corretamente
git bisect good a1b2c3d
# O Git alterna automaticamente para os commits intermediários para teste.
# Após testar o código em cada etapa, informe o estado ao Git:
git bisect good # Se o commit testado estiver funcionando
# ou
git bisect bad # Se o bug persistir no commit testado
# Ao encontrar o commit causador, encerre o processo e volte à branch original
git bisect reset
Pontos-chave:
- Eficiência Algorítmica: Reduz o número de testes necessários aplicando divisão binária, inspecionando milhares de commits em poucas etapas.
- Automação de Testes: É possível automatizar a checagem passando um script de teste diretamente no comando:
git bisect run npm test. - Restauração do Estado: O comando
git bisect resetgarante o retorno ao ponto de origem antes da navegação pelo histórico. - Invariabilidade de Testes: Mantenha os critérios de validação estritamente idênticos a cada etapa para não desviar a busca do algoritmo.
git, git-bisect, debugging, qa, version-control, automacao
Inspecionando Alterações Não Commitadas com Git Diff
Verificar as modificações pendentes no diretório de trabalho evita o envio acidental de arquivos temporários ou código incompleto ao repositório. O git diff compara o estado atual dos arquivos com a área de staging ou com o último commit realizado.
Bash
# Compara o código modificado na Working Tree com a Staging Area
git diff
# Compara apenas arquivos já adicionados na Staging Area (git add) com o último commit
git diff --staged
# Compara as alterações de um arquivo específico
git diff src/config/database.js
Pontos-chave:
- Diferença de Escopo: O comando simples analisa alterações não adicionadas com
git add, enquanto--staged(ou--cached) analisa o que já está pronto para o commit. - Análise de Estatísticas: A flag
--statexibe um resumo resumido com o número de linhas adicionadas e removidas por arquivo. - Filtro por Arquivo: Passar o caminho do arquivo limita a saída do terminal ao contexto de interesse.
- Navegação no Terminal: A saída do diff utiliza o leitor padrão do sistema (como o
less); pressione a teclaqpara sair da visualização.
git, git-diff, code-review, version-control, terminal, devops
Replicando Commits Específicos Entre Branches com Cherry-Pick
Incorporar correções urgentes de uma branch de desenvolvimento em produção sem transportar todo o histórico adjacente é um desafio comum em equipes ágeis. O git cherry-pick copia a alteração contida em um commit específico e a aplica diretamente sobre a branch atual.
Bash
# Alterna para a branch de destino (ex: produção/main)
git switch main
# Aplica o commit desejado informando seu hash
git cherry-pick e5f6g7h8
# Em caso de conflito, resolva os arquivos e continue a aplicação:
git add .
git cherry-pick --continue
Pontos-chave:
- Aplicações Pontuais: Ideal para aplicar hotfixes desenvolvidos em branches paralelas sem realizar o merge completo de histórico.
- Novo Hash Gerado: O
cherry-pickrecria o commit na branch de destino, gerando um novo identificador hash único. - Múltiplos Commits: É possível aplicar uma sequência de commits especificando o intervalo:
git cherry-pick hash1..hash2. - Abortar Operação: Caso ocorram conflitos complexos, cancele a operação com segurança usando
git cherry-pick --abort.
git, git-cherry-pick, version-control, devops, gerenciamento-codigo, git-flow
Reorganizando o Histórico com Rebase Interativo
Históricos poluídos por múltiplos commits intermediários dificultam a leitura e a revisão de código por outros desenvolvedores. O rebase interativo (git rebase -i) permite unir, reescrever, reordenar ou remover commits antes de integrá-los à branch principal.
Bash
# Inicia a reordenação dos últimos 3 commits da branch atual
git rebase -i HEAD~3
# O editor de texto padrão abrirá com a lista de commits:
# pick a1b2c3d Ajuste inicial da API
# squash e5f6g7h Refatoração das rotas
# squash i9j0k1l Correção do retorno JSON
# Salve o arquivo para consolidar os commits marcados como 'squash' em um único
Pontos-chave:
- Comando Squash: A opção
squash(ous) funde o commit marcado com o commit imediatamente anterior, combinando as mensagens. - Comando Reword: A opção
reword(our) permite alterar apenas a mensagem de um commit antigo da lista. - Regra de Ouro: Nunca aplique
rebaseem commits que já foram enviados para branches públicas/compartilhadas. - Cancelamento Seguro: Para interromper o processo em caso de erro, execute
git rebase --abort.
git, git-rebase, clean-code, version-control, devops, git-workflow
Renderizando a Árvore de Commits no Terminal
Visualizar a ramificação e o fluxo de merges diretamente na linha de comando elimina a necessidade de ferramentas gráficas para entender o estado do repositório. O comando git log configurado com formatação em gráfico exibe o histórico de maneira simplificada.
Bash
# Exibe a árvore de commits formatada com linhas de ramificação
git log --graph --oneline --all
# Saída esperada no terminal:
# * e5f6g7h (HEAD -> main) docs: atualiza README
# |\
# | * a1b2c3d (feature/auth) feat: adiciona login com JWT
# |/
# * i9j0k1l chore: estrutura inicial do projeto
Pontos-chave:
- Estrutura Visual: A flag
--graphdesenha a árvore de branches usando caracteres ASCII na lateral esquerda. - Resumo em Linha Única: A flag
--onelinereduz cada commit a seu hash curto e mensagem principal, otimizando o espaço da tela. - Visão Global: A flag
--allgarante a exibição de todas as branches locais e remotas, e não apenas da branch ativa. - Atalho Permanente: Esse comando é frequentemente configurado como um alias do Git para acesso rápido no terminal.
git, git-log, terminal, version-control, devops, visualizacao
Atualizando a Mensagem do Último Commit Realizado
Erros de digitação ou o esquecimento de pequenas alterações logo após a execução de um commit são falhas simples de corrigir no Git. O comando git commit --amend permite alterar a mensagem do último commit ou incluir arquivos esquecidos na mesma publicação.
Bash
# Adiciona um arquivo esquecido à área de staging
git add src/utils/helper.js
# Reescreve o último commit alterando a mensagem e incluindo as novas alterações
git commit --amend -m "feat: implementa validação do formulário e funções auxiliares"
Pontos-chave:
- Substituição de Commit: O Git não altera o commit existente, mas cria um novo commit que substitui o anterior, alterando seu hash.
- Escopo Local: Utilize a alteração apenas em commits que ainda não foram enviados ao servidor remoto com
git push. - Sem Alterar Arquivos: Para corrigir apenas o texto da mensagem sem adicionar novos arquivos, use
git commit --amend -m "nova mensagem". - Ajuste de Autoria: É possível alterar a autoria do último commit adicionando a flag
--author="Nome <email>".
git, git-commit, version-control, devops, produtividade, terminal
Definindo Atalhos Personalizados no Git
Digitar comandos longos e repletos de flags no terminal reduz a produtividade no desenvolvimento diário. Criar atalhos globais através do git config reduz sequências de comandos a palavras simples e fáceis de memorizar.
Bash
# Configura um atalho para visualização simplificada do log
git config --global alias.lg "log --graph --oneline --all"
# Configura um atalho para o checkout/switch de criação de branch
git config --global alias.cob "switch -c"
# Executando o novo atalho criado
git lg
Pontos-chave:
- Escopo Global: A flag
--globalsalva as regras no arquivo~/.gitconfigdo seu usuário no sistema operacional, aplicando a todos os repositórios. - Chave de Execução: Atalhos são invocados diretamente após a palavra
git(ex:git cob nova-branch). - Comandos Externos: É possível mapear comandos do terminal do sistema iniciando o valor com
!, comoalias.st "!git status -s". - Edição Direta: É possível visualizar e editar todos os aliases abrindo o arquivo de configuração com
git config --global --edit.
git, git-config, terminal, produtor-de-conteudo, produtividade, devops
Inspecionando Regras de Bloqueio do Gitignore
Entender por que um arquivo específico está sendo ignorado pelo Git ou descobrir qual regra do arquivo .gitignore afetou o rastreamento evita comportamentos inesperados no repositório. O git check-ignore aponta a linha exata que está aplicando o bloqueio.
Bash
# Verifica qual regra do gitignore está afetando o arquivo
git check-ignore -v config/database.env
# Saída esperada no terminal:
# .gitignore:12:*.env config/database.env
Pontos-chave:
- Saída Detalhada: A flag
-v(verbose) mostra o caminho do arquivo de regras, o número da linha correspondente e o padrão ativado. - Diagnóstico de Conflitos: Útil para identificar sobreposições entre regras globais (
~/.gitignore_global) e locais do projeto. - Múltiplos Arquivos: O comando aceita padrões wildcard para testar diretórios inteiros:
git check-ignore -v logs/*. - Verificação de Adição: Se o comando não retornar nenhuma saída, significa que o arquivo não está sendo bloqueado por regras de ignore.
git, gitignore, troubleshooting, version-control, devops, terminal
Otimizando Downloads de Repositórios com Clone Raso
Baixar repositórios extensos que contêm anos de histórico pode ser uma operação lenta e consumir muita largura de banda. O clone raso (shallow clone) limita o download apenas aos commits mais recentes do projeto.
Bash
# Clona o repositório baixando apenas o último commit do histórico
git clone --depth 1 https://github.com/usuario/repositorio.git
# Acessa o diretório clonado com histórico reduzido
cd repositorio
git log --oneline
# Exibe apenas o último commit baixado
Pontos-chave:
- Desempenho Elevado: Reduz drasticamente o tempo de clone e a transferência de dados, sendo ideal para ambientes de CI/CD.
- Aprofundando o Histórico: É possível buscar mais commits posteriormente conforme a necessidade executando
git fetch --depth 10. - Restauração Completa: Para converter o repositório em um clone tradicional completo, execute
git fetch --unshallow. - Limitação de Operações: Algumas operações complexas de
blameoubisectpodem exigir o histórico completo para funcionarem adequadamente.
git, git-clone, devops, ci-cd, desempenho, version-control
Limpando Referências Locais de Branches Remotas
Quando ramificações são excluídas ou mescladas diretamente na plataforma de hospedagem (como GitHub ou GitLab), o repositório local pode continuar mantendo referências desatualizadas a essas branches remotas. O comando git remote prune remove essas pontas obsoletas.
Bash
# Remove as referências locais a branches que já foram deletadas no servidor remoto
git remote prune origin
# Saída esperada:
# Pruning origin
# URL: https://github.com/usuario/repositorio.git
# * [pruned] origin/feature/login
Pontos-chave:
- Limpeza de Apontamentos: Remove as chamadas remote-tracking branches (ex:
origin/feature-deletada) do seu ambiente local. - Segurança de Código: O comando não apaga branches locais que você criou no seu computador, apenas os espelhamentos do servidor.
- Automação no Fetch: É possível configurar a limpeza automática em todo
git fetchexecutandogit config --global fetch.prune true. - Simulação Próvia: A flag
--dry-runpermite listar quais referências seriam removidas antes de confirmar a execução.
git, git-remote, devops, manutencao, version-control, terminal
Comparando Alterações Entre Branches Diferentes
Analisar a diferença pontual entre duas branches ajuda a entender o que será integrado ao código antes de realizar uma fusão. A sintaxe de dois pontos do git diff expõe todas as modificações de arquivos presentes entre os dois contextos.
Bash
# Exibe a diferença direta de código entre as branches 'main' e 'feature/pagamento'
git diff main..feature/pagamento
# Lista apenas os nomes dos arquivos alterados entre as duas branches
git diff --name-only main..feature/pagamento
Pontos-chave:
- Sintaxe de Comparação: A notação
branch1..branch2compara o topo (HEAD) da primeira branch diretamente com o topo da segunda. - Comparação pela Origem: A notação com três pontos (
branch1...branch2) mostra as alterações nabranch2desde o ancestral comum com abranch1. - Filtros por Nome: A flag
--name-statusexibe os arquivos modificados acompanhados do status de adição (A), alteração (M) ou remoção (D). - Inspeção de Arquivo Único: Adicione o caminho no final do comando para restringir a comparação a um arquivo específico:
git diff branch1..branch2 src/app.js.
