Tente resolver cada desafio antes de consultar esta página. A solução não é uma sequência única e obrigatória: existem vários caminhos corretos no Git.
O objetivo aqui é explicar por que cada comando aparece, e não apenas entregar uma receita.
mkdir desafio-git
cd desafio-git
git initCrie um README.md e depois:
git statusO arquivo deve aparecer como untracked.
Prepare:
git add README.mdConfira:
git status
git diff --stagedCrie o commit:
git commit -m "docs: adiciona README inicial"Veja o histórico:
git log --onelinearquivo criado
↓
untracked
↓ git add
staged
↓ git commit
tracked no histórico
Comece na main:
git switch mainCrie a feature:
git switch -c feat/profileAltere o README.
git diff
git add README.md
git commit -m "docs: adiciona secao de perfil"Confira o grafo:
git log --oneline --graph --allVolte:
git switch mainIntegre:
git merge feat/profileDepois exclua a branch concluída:
git branch -d feat/profileAntes:
main A
\
feature B
Depois do merge, dependendo do histórico, pode ocorrer fast-forward ou merge commit.
Depois de criar um repositório no GitHub, configure o remote:
git remote add origin URL_DO_REPOSITORIOConfira:
git remote -vCrie a branch:
git switch -c docs/melhoria-readmeFaça uma alteração e commit:
git add README.md
git commit -m "docs: melhora README"Publique a branch:
git push -u origin docs/melhoria-readmeNo GitHub, abra um Pull Request de:
docs/melhoria-readme → main
Antes do merge, revise Files changed.
push envia a branch
PR propõe a integração
review inspeciona a mudança
merge integra na main
Uma forma de provocar o conflito:
Comece com um arquivo contendo:
linguagem favorita: indefinida
Na primeira branch:
git switch -c escolha/javascriptAltere para:
linguagem favorita: JavaScript
Faça commit:
git add .
git commit -m "docs: escolhe javascript"Volte à main e crie outra branch a partir do estado anterior:
git switch main
git switch -c escolha/pythonAltere a mesma linha para:
linguagem favorita: Python
Faça commit:
git add .
git commit -m "docs: escolhe python"Integre uma das branches na main:
git switch main
git merge escolha/javascriptDepois tente integrar a outra:
git merge escolha/pythonO arquivo deverá conter marcadores semelhantes a:
<<<<<<< HEAD
linguagem favorita: JavaScript
=======
linguagem favorita: Python
>>>>>>> escolha/python
Escolha uma versão final, por exemplo:
linguagens estudadas: JavaScript e Python
Remova os marcadores e conclua:
git add arquivo.txt
git commitConfira:
git status
git log --oneline --graph --allGit não "quebrou". Ele parou porque não tinha informação suficiente para decidir por você.
Altere um arquivo rastreado e confira:
git diffDescarte a alteração não staged:
git restore arquivo.txtUse apenas quando realmente quiser perder essa modificação local.
Faça uma alteração:
git add arquivo.txtAgora remova apenas da staging:
git restore --staged arquivo.txtA alteração continua no arquivo.
staged
↓ restore --staged
modified
Faça alterações sem commit e guarde temporariamente:
git stashConfira:
git status
git stash listRecupere:
git stash popCrie um commit de teste:
git add .
git commit -m "test: cria alteracao temporaria"Veja o hash:
git log --onelineDesfaça preservando o histórico:
git revert HASHO histórico passa a conter tanto o commit original quanto o commit que registra sua reversão.
Não se limite a confirmar que os comandos funcionaram. Tente responder:
- Por que
git addnão cria um commit? - Por que uma branch permite trabalhar sem alterar a
main? - Por que um conflito exige uma decisão humana?
- Por que
restore --stagednão é igual arestore? - Por que
reverté adequado para histórico já compartilhado?
Se você consegue explicar o estado anterior, o comando usado e o estado resultante, você está entendendo Git em vez de apenas decorar comandos.