Folha de dicas dos comandos do Git: Os comandos que você realmente usa, com exemplos
Uma referência prática do Git agrupada pelo que você está tentando fazer, desde o primeiro commit até desfazer um erro. Mantenha-o aberto enquanto trabalha e use o guia de desfazer antes de iniciar qualquer coisa arriscada.
- Uma mudança passa por três áreas: diretório de trabalho, área de preparação e repositório.
git statusé o comando mais seguro que você possui, então execute-o constantemente.- Use
git revertpara desfazer commits compartilhados e mantenhagit reset --hardpara trabalhos locais dos quais você tem certeza. git refloggeralmente pode resgatar commits que você pensou que estavam perdidos.
Ninguém se lembra de todos os comandos do Git e você não precisa disso. Esta folha de dicas de comandos do Git concentra-se no pequeno conjunto que cobre quase todo o trabalho diário, agrupado pelo trabalho que você está tentando realizar.
Testamos os comandos locais em um repositório de demonstração descartável usando Git para Windows, e a saída mostrada vem dessa execução, com avisos de final de linha removidos. Seus hashes de commit serão diferentes. Os comandos remotos precisam de um servidor, por isso não os executamos. Novo no controle de versão? Comece com nosso tutorial do Git para iniciantes.
Como o Git pensa: três áreas
A maior parte da confusão desaparece quando você sabe onde reside uma mudança:
| Área | O que isso contém | Mudou-se para lá por |
|---|---|---|
| Diretório de trabalho | Seus arquivos conforme você os edita | Edição |
| Área de preparação (índice) | Mudanças selecionadas para o próximo commit | adicionar |
| Repositório local | Seu histórico de commits salvo | git commit |
| Repositório remoto | A cópia compartilhada, como no GitHub | dê um empurrão |
Configurar e iniciar um projeto
| Comando | O que isso faz |
|---|---|
git config --global user.name "Asha" |
Define seu nome em commits |
git config --global user.email "a@b.com" |
Define seu e-mail em commits |
git config --global init.defaultBranch principal |
Nomeia novos ramos padrão main |
git iniciar |
Cria um repositório na pasta atual |
clone do git <url> |
Baixa um repositório existente |
git configuração --lista |
Mostra suas configurações atuais |
Salve seu trabalho
| Comando | O que isso faz |
|---|---|
status do git |
Mostra o que mudou |
git adicionar arquivo.txt |
Prepara um arquivo |
adicione. |
Prepara todas as alterações nesta pasta |
git adicionar -p |
Prepara partes selecionadas de um arquivo |
git diferença |
Mostra alterações não preparadas |
git diff --staged |
Mostra o que será comprometido |
git commit -m "Mensagem" |
Salva alterações preparadas como um commit |
git commit -am "Mensagem" |
Prepara arquivos rastreados e os confirma |
Veja como a visualização resumida do status muda à medida que um novo arquivo avança:
$ echo "hello" > app.txt
$ git status --short
?? app.txt
$ git add app.txt
$ git status --short
A app.txt
$ git commit -m "Add app file"
?? significa não rastreado e A significa adicionado à preparação. No formato de duas colunas, a coluna da esquerda é a área de preparação e a coluna da direita é o seu diretório de trabalho. Observe que git commit -am ignora arquivos novos, então você deve adicioná-los explicitamente primeiro.
Filiais
| Comando | O que isso faz |
|---|---|
ramo git |
Lista filiais locais |
git ramo -a |
Inclui filiais remotas |
recurso/login do git switch |
Muda para uma filial |
git switch -c recurso/login |
Cria um branch e move para ele |
recurso/login de mesclagem git |
Mescla esse branch no atual |
git rebase principal |
Reproduz seus commits além de main |
git branch -d recurso/login |
Exclui uma ramificação mesclada |
git branch -D recurso/login |
Forçar a exclusão de um branch não mesclado |
Aqui está um pequeno ramo de recursos do início ao fim:
$ git switch -c feature/login
$ echo "login" >> app.txt
$ git commit -am "Add login"
$ git switch main
$ git merge --no-edit feature/login
$ git log --oneline --graph
* d0450b6 Add login
* 676b684 Add app file
$ git branch -d feature/login
Deleted branch feature/login (was d0450b6).
A história é uma linha reta porque main não foi movido, então o Git fez uma fusão rápida. Você ainda verá git checkout em guias mais antigos. Funciona, mas os comandos switch e restore mais recentes dividem seus muitos trabalhos em outros mais claros. Para escolher entre mesclagem e rebase, leia Git merge vs rebase.
Trabalhando com controles remotos
| Comando | O que isso faz |
|---|---|
git remoto -v |
Lista controles remotos e seus URLs |
git remoto adicionar origem <url> |
Conecta um controle remoto |
buscar |
Baixa alterações sem mesclar |
puxa |
Busca e depois integra ao seu branch |
dê um empurrão |
Carrega seus commits |
git push -u origem recurso/login |
Envia um novo branch e o rastreia |
git push origin --delete recurso/login |
Exclui uma ramificação remota |
git push --force-com-lease |
Forçar empurra, mas somente se ninguém mais tiver empurrado |
fetch é sempre seguro, porque nunca altera seus arquivos. Se você precisar sobrescrever um branch após um rebase, prefira --force-with-lease ao simples --force, pois ele se recusa a eliminar os novos commits de um colega.
Stash: deixe o trabalho de lado
Stash é útil quando você precisa trocar de tarefa, mas não está pronto para confirmar:
$ echo "wip" >> app.txt
$ git stash
$ git status --short
# clean, the change is put away
$ git stash pop
$ git status --short
M app.txt
| Comando | O que isso faz |
|---|---|
esconderijo |
Salva alterações e limpa seu diretório de trabalho |
git stash -u |
Inclui arquivos não rastreados |
lista de estoque do git |
Mostra stashes salvos |
git stash pop |
Restaura o stash mais recente e o remove |
git stash aplicar |
Restaura, mas mantém salvo |
Ver histórico
| Comando | O que isso faz |
|---|---|
git log --oneline |
Mostra uma linha por commit |
git log --oneline --graph --all |
Desenha todos os ramos |
git log -p arquivo.txt |
Mostra as alterações de um arquivo ao longo do tempo |
git mostrar <hash> |
Mostra um commit em detalhes |
git culpa file.txt |
Mostra quem alterou cada linha pela última vez |
git reflog |
Mostra em todos os lugares que HEAD esteve |
git bisect |
Pesquisas binárias pelo commit que adicionou um bug |
Desfazer erros: “Eu quero…”
Esta é a parte que a maioria das pessoas procura. Encontre sua situação:
| Situação | Comando |
|---|---|
| Descartar edições não preparadas em um arquivo | git restaurar arquivo.txt |
| Remova o preparo de um arquivo, mas mantenha as edições | git restaurar --staged arquivo.txt |
| Corrija a mensagem ou os arquivos do último commit | git commit --amend |
| Desfaça o último commit, mantendo as alterações preparadas | git reset --soft HEAD~1 |
| Desfaça o último commit, mantendo as alterações sem etapas | git redefinir CABEÇA~1 |
| Desfaça um commit enviado com segurança | git reverter <hash> |
| Jogue fora todas as alterações locais | git reset --hard |
| Remover arquivos não rastreados | git clean -fd (visualização com -n) |
| Recuperar um commit “perdido” | git reflog, então git branch rescue <hash> |
Dica: Antes de qualquer coisa arriscada, execute git branch backup. Não custa nada e oferece um rótulo para o qual retornar. git reset --hard e git clean podem destruir permanentemente o trabalho não comprometido, que mesmo reflog não pode recuperar.
Redefinir vs reverter vs restaurar
Esses três nomes causam muita confusão, mas fazem coisas bem diferentes:
| Comando | Atua em | Histórico de mudanças? | Seguro em filiais compartilhadas? |
|---|---|---|---|
git restaurar |
Arquivos | Não | Sim, mas descarta edições locais |
git reverter |
Um commit, adicionando seu oposto | Adiciona a isso | Sim |
redefinir |
O ponteiro de ramificação | Reescreve | Não |
Em nossa demonstração, cometemos uma linha incorreta e a revertemos. O arquivo voltou ao seu conteúdo anterior, enquanto o erro permaneceu visível no log como histórico:
$ echo "oops" >> app.txt
$ git commit -am "Bad change"
$ git revert --no-edit HEAD
$ cat app.txt
hello
login
Então git reset --soft HEAD~1 removeu o último commit, mas manteve suas alterações preparadas, que git status --short mostrou como M app.txt.
Etiquetas
| Comando | O que isso faz |
|---|---|
etiqueta git |
Lista tags |
etiqueta git v1.0 |
Cria uma tag leve |
git tag -a v1.0 -m "Liberar" |
Cria uma tag anotada, ideal para lançamentos |
git push origem v1.0 |
Envia uma tag (as tags não são enviadas por push por padrão) |
As tags geralmente acionam pipelines de lançamento, como explica nosso guia de CI/CD de ações do GitHub.
Um fluxo de trabalho diário simples
git switch main
git pull
git switch -c feature/search
# edit files
git status
git add -p
git commit -m "Add search by product name"
git push -u origin feature/search
# open a pull request, get a review, then merge
Escreva mensagens de commit que expliquem a mudança no imperativo, como “Corrigir redirecionamento de login”. Você vai se agradecer ao ler o registro daqui a seis meses.
Erros comuns
- Comprometendo segredos. Remover um arquivo em um commit posterior não o remove do histórico. Gire o segredo imediatamente e use
.gitignore. - Reescrevendo o histórico compartilhado. Não redefina ou rebase commits que outras pessoas já extraíram.
- Usando
git add .cegamente. Verifiquegit statusprimeiro, para que os arquivos de compilação e logs fiquem de fora. - Usando
--forcesimples. Prefira--force-with-lease. - Fazer commits enormes. Os pequenos são mais fáceis de revisar, reverter e dividir.
Considerações finais
Aprenda as três áreas e uma dúzia de comandos e o Git deixará de ser assustador. Mantenha a tabela de desfazer à mão e lembre-se de que git status e git reflog são sua rede de segurança. Para aumentar a confiança, crie um repositório descartável e quebre-o e repare-o deliberadamente, já que esse é o lugar mais barato para cometer erros.
Perguntas frequentes
Quais são os comandos Git mais usados?
O conjunto diário é git status, add, commit, push, pull, switch, branch, merge e log. Esses poucos comandos cobrem a maior parte de um dia normal de trabalho.
Como desfaço meu último commit no Git?
Se for local, use git reset –soft HEAD~1 para manter as alterações preparadas. Se você já fez o push, use git revert para que o histórico permaneça intacto para outros.
Qual é a diferença entre git fetch e git pull?
git fetch apenas baixa novos dados e deixa seus arquivos em paz. git pull busca e depois mescla ou rebase essas alterações em seu branch atual.
Qual é a diferença entre git reset e git revert?
git reset move o ponteiro do branch e pode reescrever o histórico. git revert adiciona um novo commit que desfaz um anterior, o que o torna seguro em ramificações compartilhadas.
Posso recuperar um branch excluído no Git?
Normalmente, sim. Encontre seu último commit com git reflog e, em seguida, recrie o branch com git branch name seguido do hash, desde que o Git ainda não o tenha limpo.
Continue aprendendo
Precisa de ajuda com testes, WordPress ou SEO?
Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.
Mais guias sobre testes, IA e desenvolvimento moderno
Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.
Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las
Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…
Leia o artigo →DevOpsVariáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos
Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…
Leia o artigo →Desenvolvimento de softwareExplicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429
Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…
Leia o artigo →Automação de testesZombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem
Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…
Leia o artigo →Teste de softwareCobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa
Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…
Leia o artigo →Bancos de dados e SQLDELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um
DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…
Leia o artigo →Bancos de dados e SQLExibições SQL explicadas: crie, use e evite as armadilhas, com exemplos
Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…
Leia o artigo →Desenvolvimento de softwareInterface TypeScript vs tipo: diferenças reais, testadas com o compilador
Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…
Leia o artigo →Desenvolvimento de softwarePython *args e **kwargs explicados: funções flexíveis com exemplos claros
Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…
Leia o artigo →Desenvolvimento de softwareFunções Python Lambda: sintaxe, usos reais e quando não usá-los
Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …
Leia o artigo →Inteligência artificialO que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar
O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …
Leia o artigo →DevOpsMonitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos
Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…
Leia o artigo →DevOpsDocker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa
Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…
Leia o artigo →Automação de testesTDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um
TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…
Leia o artigo →Teste de softwareTeste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais
Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…
Leia o artigo →Bancos de dados e SQLValores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas
Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…
Leia o artigo →Bancos de dados e SQLInstrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns
SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…
Leia o artigo →Desenvolvimento de softwareO que é JWT? JSON Web Tokens explicados com um exemplo prático
O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…
Leia o artigo →Desenvolvimento de softwareLoop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos
O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…
Leia o artigo →Desenvolvimento de softwareGeradores Python e rendimento explicado: economize memória com exemplos reais
Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…
Leia o artigo →Inteligência artificialO que são incorporações? Similaridade de vetores e cossenos explicada de forma simples
O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…
Leia o artigo →DevOpsImplantação azul-verde vs canário: diferenças, compensações e como escolher
Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…
Leia o artigo →Automação de testesTestes instáveis: o que os causa e como corrigi-los para sempre
Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…
Leia o artigo →Teste de softwareTeste de carga versus teste de estresse: diferenças, métricas e exemplos k6
Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…
Leia o artigo →Teste de softwareCaso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um
Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…
Leia o artigo →Bancos de dados e SQLOtimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos
Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…
Leia o artigo →Bancos de dados e SQLSQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado
SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…
Leia o artigo →Desenvolvimento de softwareTutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite
Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …
Leia o artigo →Desenvolvimento de softwareManipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos
Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…
Leia o artigo →Desenvolvimento de softwareClasses e objetos Python: tutorial OOP com exemplos reais
Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…
Leia o artigo →Inteligência artificialO que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros
O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…
Leia o artigo →DevOpsComandos Linux para iniciantes: o guia essencial do terminal com exemplos
Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …
Leia o artigo →Automação de testesSelenium vs Playwright: principais diferenças, código comparado e qual escolher
Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …
Leia o artigo →Teste de softwareParticionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos
Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…
Leia o artigo →Teste de softwareGravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais
Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…
Leia o artigo →Bancos de dados e SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos
Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…
Leia o artigo →Bancos de dados e SQLTransações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento
Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …
Leia o artigo →Desenvolvimento de softwareFolha de dicas dos comandos do Git: os comandos que você realmente usa, com exemplos
Uma folha de dicas de comandos Git agrupada por tarefa: configuração, preparação, ramificações, controles remotos, stash, histórico e desfazer erros…
Leia o artigo →Desenvolvimento de softwareExplicação das promessas de JavaScript: então, catch, Promise.all e erros comuns
Promessas JavaScript explicadas com o código que executamos: estados, cadeias then e catch, tratamento de erros, Promise.all, allSettled, race e any…
Leia o artigo →Desenvolvimento de softwareTutorial do dicionário Python: métodos, exemplos e padrões comuns
Um tutorial de dicionário Python com código que executamos: criar, ler e atualizar dictos, métodos-chave, mesclagem, compreensão, padrões de contage…
Leia o artigo →Inteligência artificialO que é RAG? Geração aumentada de recuperação explicada com um exemplo prático
O que é RAG? Geração aumentada de recuperação explicada passo a passo: indexação, chunking, embeddings, recuperação, um pequeno exemplo funcional de…
Leia o artigo →DevOpsTutorial Terraform para iniciantes: infraestrutura como código do primeiro arquivo aos módulos
Um tutorial do Terraform para iniciantes: comece sem conta na nuvem, aprenda como iniciar, planejar e aplicar, depois variáveis, saídas, estado, mód…
Leia o artigo →DevOpsDocker vs Kubernetes: principais diferenças, como eles funcionam juntos e o que você precisa
Docker vs Kubernetes explicado: o que cada um faz, o mesmo aplicativo rodando com ambos, Docker Compose e Swarm comparados, a mudança do dockershim …
Leia o artigo →Automação de testesTutorial Pytest para iniciantes: luminárias, parametrização e exemplos reais
Um tutorial pytest para iniciantes com testes que executamos no pytest 9.2: asserções, fixtures, parametrizar, conftest, marcadores, tmp_path, monke…
Leia o artigo →Teste de softwareCiclo de vida de teste de software (STLC): 6 fases, critérios de entrada e saída, exemplo
O ciclo de vida de teste de software explicou: seis fases do STLC com critérios de entrada e saída, resultados, um exemplo de recurso de login funci…
Leia o artigo →Desenvolvimento de softwareGit merge vs rebase: diferenças, exemplos e quando usar cada um
Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.
Leia o artigo →Desenvolvimento de softwareList comprehension em Python: sintaxe, exemplos e quando evitar
List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.
Leia o artigo →Bancos de dados e SQLSQL JOIN explicado com exemplos (Inner, Left, Right, Full)
Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…
Leia o artigo →