Tutorial de Git para iniciantes: do zero ao pull request
Tutorial de Git para iniciantes: instale, configure, faça commits, branches, merge, resolva conflitos e publique no GitHub. Com cola dos comandos.
Git é o programa que guarda o histórico de tudo que você muda no código, permite voltar no tempo quando algo quebra e deixa várias pessoas trabalharem no mesmo projeto sem se atropelar. Para o dia a dia, você precisa de uns 12 comandos — e este tutorial ensina todos eles, na ordem em que você vai usá-los, até abrir seu primeiro pull request no GitHub.
Não existe vaga de desenvolvimento em 2026 que não use Git. Se você está aprendendo a programar, aprenda Git junto, desde o primeiro projeto, e não "depois".
Os 3 conceitos que destravam o Git
Antes dos comandos, entenda onde seus arquivos podem estar. Quase toda confusão de iniciante vem daqui.
- Diretório de trabalho (working directory): os arquivos como estão agora na sua pasta.
- Área de preparação (staging area): o que você marcou para entrar no próximo commit.
- Repositório: o histórico de commits, guardado na pasta oculta
.git.
O fluxo é sempre: você edita arquivos → escolhe o que vai entrar com git add → registra uma "foto" com git commit. Um commit é um ponto salvo no histórico, com autor, data e mensagem. Uma branch é só um ponteiro para um commit, uma linha do tempo paralela onde você trabalha sem mexer na principal.
Instalando o Git
Windows
Baixe o instalador em git-scm.com ou use o winget no PowerShell:
winget install --id Git.Git -e --source winget
O instalador traz o Git Bash, um terminal que aceita os mesmos comandos do Linux e macOS. Use ele para seguir este tutorial. Nas opções de instalação, os padrões estão bons; só escolha o VS Code como editor se for o que você usa.
macOS
O jeito mais rápido é instalar as ferramentas de linha de comando da Apple:
xcode-select --install
Se você usa Homebrew, prefira brew install git, que costuma trazer uma versão mais recente.
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install git
Confira se deu certo:
git --version
Configuração inicial (faça uma vez só)
O Git assina cada commit com seu nome e e-mail. Use o mesmo e-mail da sua conta do GitHub, senão seus commits não aparecem no seu perfil.
git config --global user.name "Seu Nome"
git config --global user.email "voce@exemplo.com"
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
A terceira linha faz todo repositório novo começar com a branch main (o padrão do GitHub). A quarta define o VS Code como editor para mensagens de commit; se não usa VS Code, pule essa.
Para ver tudo que está configurado:
git config --list
Seu primeiro repositório: init, status, add, commit
Crie uma pasta e transforme-a em um repositório:
mkdir meu-projeto
cd meu-projeto
git init
Crie um arquivo qualquer, por exemplo index.html, e pergunte ao Git o que está acontecendo:
git status
O git status é o comando que você mais vai digitar na vida. Ele mostra arquivos novos (untracked), modificados e o que já está preparado para o commit. Na dúvida, rode git status.
Agora prepare o arquivo e faça o commit:
git add index.html
git commit -m "Cria página inicial"
Para adicionar tudo que mudou na pasta de uma vez:
git add .
Dica: antes de um
git add ., rodegit statuse confira a lista. É assim que senhas, arquivos.enve pastas gigantes acabam no GitHub por acidente.
Como escrever boas mensagens de commit
Mensagem de commit é para o você do futuro, que vai procurar "quando foi que quebrou o login". Regras simples:
- Use o imperativo e seja específico: "Corrige validação de e-mail no cadastro", não "ajustes" ou "update".
- Um commit = uma mudança lógica. Corrigiu um bug e mudou o CSS do rodapé? São dois commits.
- Commite com frequência. Commits pequenos são fáceis de entender e de desfazer.
Muitos times usam o padrão Conventional Commits (feat:, fix:, docs:). Vale conhecer, mas siga o padrão do projeto em que você estiver.
Vendo o histórico e as diferenças
git log
git log --oneline --graph --all
git diff
git diff --staged
O git log --oneline --graph --all mostra o histórico compacto com o desenho das branches. O git diff mostra o que mudou e ainda não foi para a staging; com --staged, mostra o que vai entrar no próximo commit. Para sair do log, aperte q.
.gitignore: o que nunca deve ir para o repositório
O arquivo .gitignore, na raiz do projeto, lista o que o Git deve ignorar. Crie ele antes do primeiro commit. Um exemplo para projeto JavaScript:
# dependências (são reinstaladas com npm install)
node_modules/
# variáveis de ambiente e segredos
.env
.env.local
# builds e caches
dist/
build/
.cache/
# lixo de sistema e editor
.DS_Store
Thumbs.db
.idea/
Não precisa decorar: o GitHub oferece modelos prontos por linguagem ao criar um repositório, e o repositório github/gitignore tem modelos para praticamente tudo.
Atenção: se um arquivo já foi commitado, colocá-lo no
.gitignorenão remove do histórico. Para parar de rastreá-lo, usegit rm --cached nome-do-arquivoe faça um commit. Se era uma senha ou chave de API, troque a chave: considere que ela vazou.
Branches: trabalhe sem medo de quebrar a main
A regra de ouro dos times: a main sempre funciona. Toda feature ou correção nasce em uma branch separada.
git switch -c feature/formulario-contato
Isso cria a branch e já muda para ela. Para ver as branches e trocar entre elas:
git branch
git switch main
Você vai encontrar tutoriais antigos usando git checkout -b. Funciona igual, mas o git switch (e o git restore, que veremos adiante) foram criados justamente para separar as funções que o checkout acumulava. Prefira os novos.
Dica: antes de trocar de branch, faça commit ou guarde as mudanças com
git stash. Depois, recupere comgit stash pop.
Merge: juntando o trabalho
Terminou a feature na branch? Volte para a main e traga as mudanças:
git switch main
git merge feature/formulario-contato
Se a main não mudou desde que você criou a branch, o Git faz um fast-forward: só avança o ponteiro. Se as duas andaram, ele cria um commit de merge juntando as linhas do tempo.
Branch já mesclada pode ser apagada:
git branch -d feature/formulario-contato
Conflitos: o que fazer quando o Git não sabe decidir
Conflito acontece quando duas branches mudaram as mesmas linhas do mesmo arquivo. Não é erro, não é bug, e não quebrou nada. É o Git pedindo para você decidir.
O git merge vai avisar CONFLICT e o arquivo vai ficar assim:
<<<<<<< HEAD
<h1>Bem-vindo ao meu site</h1>
=======
<h1>Olá, seja bem-vindo</h1>
>>>>>>> feature/formulario-contato
O que está entre <<<<<<< HEAD e ======= é a versão da branch atual; o que está entre ======= e >>>>>>> vem da outra branch. Para resolver:
- Abra o arquivo e escolha uma versão, a outra, ou uma combinação das duas.
- Apague as três linhas de marcação (
<<<<<<<,=======,>>>>>>>). - Salve, marque como resolvido e conclua:
git add index.html
git commit
O VS Code mostra botões "Accept Current", "Accept Incoming" e "Accept Both" em cima de cada conflito, o que ajuda bastante. Se você se perdeu e quer começar de novo:
git merge --abort
A melhor prevenção é simples: branches curtas, merges frequentes e git pull antes de começar a trabalhar.
GitHub: remote, push, pull e pull request
Até aqui, tudo ficou no seu computador. O GitHub guarda uma cópia na nuvem e é onde o trabalho em equipe acontece (GitLab e Bitbucket funcionam de forma parecida).
Autenticação
O GitHub não aceita a senha da conta no git push. O caminho mais simples é instalar o GitHub CLI e rodar:
gh auth login
Siga as perguntas e pronto, o Git passa a se autenticar sozinho. A alternativa clássica é configurar uma chave SSH, explicada na documentação oficial do GitHub.
Conectando e enviando (push)
Crie um repositório vazio no GitHub (sem README, para não gerar conflito no primeiro envio) e conecte:
git remote add origin https://github.com/seu-usuario/meu-projeto.git
git push -u origin main
origin é o apelido padrão do repositório remoto. O -u liga sua main local à main remota; depois disso, basta git push.
Clonando um projeto existente
git clone https://github.com/usuario/projeto.git
O clone já vem com o origin configurado.
Baixando mudanças (pull)
git pull
O git pull busca as novidades do remoto e mescla na sua branch. Se quiser só ver o que chegou sem mesclar, use git fetch.
Pull request, passo a passo
O pull request (PR) é como se propõe uma mudança em um time: você mostra o que fez, alguém revisa, e só então vai para a main.
git switch main
git pull
git switch -c fix/link-quebrado-rodape
# ...edita os arquivos...
git add .
git commit -m "Corrige link quebrado no rodapé"
git push -u origin fix/link-quebrado-rodape
O GitHub vai mostrar um botão "Compare & pull request". Clique, escreva o que mudou e por quê, e peça revisão. Se o revisor pedir ajustes, é só fazer novos commits na mesma branch e dar git push: o PR atualiza sozinho. Depois do merge, apague a branch.
Dica: para recrutador, um GitHub com projetos bem documentados e PRs em projetos open source pesa mais que certificado. Comece por issues marcadas como
good first issue.
Comandos de emergência: desfazendo erros
Quase tudo no Git tem volta. O segredo é saber qual ferramenta usar e se o commit já foi enviado para o remoto.
Descartar mudanças que ainda não foram commitadas
git restore arquivo.js
Volta o arquivo para como estava no último commit. Isso apaga suas mudanças nesse arquivo de vez, sem lixeira.
Tirar um arquivo da staging (desfazer o add)
git restore --staged arquivo.js
O arquivo continua modificado, só sai do próximo commit.
Corrigir o último commit
Errou a mensagem ou esqueceu um arquivo?
git add arquivo-esquecido.js
git commit --amend -m "Mensagem corrigida"
Só faça isso se o commit ainda não foi enviado com push.
Desfazer um commit que já está no GitHub: revert
git revert a1b2c3d
O revert cria um novo commit que desfaz as mudanças do commit indicado (pegue o hash no git log --oneline). O histórico é preservado, ninguém do time é prejudicado. Para commits já compartilhados, essa é a resposta certa.
Reset: poderoso e perigoso
O reset move a branch para trás, como se commits não tivessem existido. Use só em commits locais, que ainda não foram enviados.
git reset --soft HEAD~1 # desfaz o último commit, mantém as mudanças na staging
git reset HEAD~1 # desfaz o último commit, mantém as mudanças nos arquivos
git reset --hard HEAD~1 # desfaz o último commit e APAGA as mudanças
Atenção:
git reset --hardapaga trabalho não commitado sem perguntar. E fazer reset em commits que já estão no remoto obriga umgit push --force, que pode apagar o trabalho de colegas. Em branch compartilhada, userevert.
A rede de segurança: reflog
Fez besteira com reset? O git reflog lista tudo por onde o HEAD passou recentemente, inclusive commits "perdidos":
git reflog
git reset --hard HEAD@{2}
Ache a linha de antes do erro e volte para ela. Já salvou muita gente.
Cola: os comandos mais usados
| Comando | O que faz |
|---|---|
git init |
Cria um repositório na pasta atual |
git clone <url> |
Copia um repositório remoto para sua máquina |
git status |
Mostra o estado dos arquivos |
git add <arquivo> / git add . |
Prepara mudanças para o commit |
git commit -m "msg" |
Registra as mudanças preparadas |
git log --oneline --graph |
Mostra o histórico resumido |
git diff |
Mostra o que mudou e não foi preparado |
git switch -c <branch> |
Cria uma branch e muda para ela |
git switch <branch> |
Troca de branch |
git merge <branch> |
Junta outra branch na atual |
git pull |
Baixa e mescla mudanças do remoto |
git push |
Envia seus commits para o remoto |
git stash / git stash pop |
Guarda e recupera mudanças temporariamente |
git restore <arquivo> |
Descarta mudanças não commitadas |
git restore --staged <arquivo> |
Tira o arquivo da staging |
git commit --amend |
Corrige o último commit (local) |
git revert <hash> |
Desfaz um commit criando outro (seguro) |
git reset --soft HEAD~1 |
Desfaz o último commit local, mantendo mudanças |
git reflog |
Mostra o histórico do HEAD para recuperar erros |
Como praticar de verdade
Ler sobre Git não ensina Git. Faça isto esta semana:
- Pegue um projeto seu (mesmo um exercício simples) e coloque no GitHub com
.gitignoree README. - Crie uma branch, mude algo, abra um PR para você mesmo e faça o merge pelo GitHub.
- Provoque um conflito de propósito: mude a mesma linha em duas branches e resolva.
- Faça um commit errado e desfaça com
revert. Depois, local, comreset --soft.
Para treinar branches de forma visual, o Learn Git Branching é gratuito, está em português e é excelente. Para se aprofundar, o livro Pro Git é a referência oficial e também é gratuito.
Git é uma das práticas que separam quem programa de quem é um bom desenvolvedor. Se você ainda está montando sua trilha de estudos, veja nossa seleção dos melhores cursos de programação e o guia de como programar do jeito certo — e coloque cada exercício que fizer em um repositório.
Perguntas frequentes
Qual a diferença entre Git e GitHub?
Git é o programa de controle de versão que roda no seu computador. GitHub é um site que hospeda repositórios Git na nuvem e adiciona colaboração, como pull requests e issues. Dá para usar Git sem GitHub, mas não o contrário.
Preciso saber usar o terminal para aprender Git?
Ajuda muito. Interfaces gráficas como a do VS Code resolvem o dia a dia, mas entender os comandos no terminal faz você saber o que está acontecendo quando algo dá errado, e é isso que as entrevistas e os colegas esperam.
Por que o GitHub não aceita minha senha no git push?
Desde 2021 o GitHub não aceita senha da conta em operações Git por HTTPS. Use o GitHub CLI (gh auth login), uma chave SSH ou um token de acesso pessoal no lugar da senha.
Qual a diferença entre git merge e git rebase?
Os dois juntam o trabalho de branches diferentes. O merge preserva o histórico como aconteceu e cria um commit de junção; o rebase reescreve seus commits como se tivessem sido feitos depois, deixando o histórico linear. Para iniciantes, comece com merge.
Quanto tempo leva para aprender Git?
O básico (add, commit, push, pull, branch) se aprende em uma tarde. Ficar confortável com conflitos e desfazer erros leva algumas semanas de uso real em projetos.
Leia também
Como aprender a programar sozinho em 2026: plano de 6 meses
Plano de estudos de 6 meses, semana a semana, para aprender a programar sozinho em 2026: qual linguagem escolher, recursos grátis e como usar IA sem dependência.
AprenderComo programar: o que é programação e como começar do zero
Entenda o que é programar, aprenda lógica de programação com exemplos curtos em JavaScript e Python e escreva seu primeiro programa hoje, sem instalar nada.
Carreira5 passos para ser um desenvolvedor web melhor em 2026
5 passos práticos para ser um desenvolvedor web melhor: fundamentos, leitura de código, testes, performance e acessibilidade e comunicação, com ações para esta semana.