Skip to content

Latest commit

 

History

History
378 lines (253 loc) · 5.06 KB

File metadata and controls

378 lines (253 loc) · 5.06 KB

✅ Soluções comentadas dos desafios

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.


Desafio 01 — Primeiro repositório

Uma possível solução

mkdir desafio-git
cd desafio-git
git init

Crie um README.md e depois:

git status

O arquivo deve aparecer como untracked.

Prepare:

git add README.md

Confira:

git status
git diff --staged

Crie o commit:

git commit -m "docs: adiciona README inicial"

Veja o histórico:

git log --oneline

O que você deveria ter percebido

arquivo criado
    ↓
untracked
    ↓ git add
staged
    ↓ git commit
tracked no histórico

Desafio 02 — Trabalhando com branch

Comece na main:

git switch main

Crie a feature:

git switch -c feat/profile

Altere o README.

git diff
git add README.md
git commit -m "docs: adiciona secao de perfil"

Confira o grafo:

git log --oneline --graph --all

Volte:

git switch main

Integre:

git merge feat/profile

Depois exclua a branch concluída:

git branch -d feat/profile

Modelo mental

Antes:

main       A
            \
feature     B

Depois do merge, dependendo do histórico, pode ocorrer fast-forward ou merge commit.


Desafio 03 — Repositório remoto e Pull Request

Depois de criar um repositório no GitHub, configure o remote:

git remote add origin URL_DO_REPOSITORIO

Confira:

git remote -v

Crie a branch:

git switch -c docs/melhoria-readme

Faç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-readme

No GitHub, abra um Pull Request de:

docs/melhoria-readme → main

Antes do merge, revise Files changed.

O aprendizado principal

push envia a branch
PR propõe a integração
review inspeciona a mudança
merge integra na main

Desafio 04 — Conflito controlado

Uma forma de provocar o conflito:

Comece com um arquivo contendo:

linguagem favorita: indefinida

Na primeira branch:

git switch -c escolha/javascript

Altere 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/python

Altere 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/javascript

Depois tente integrar a outra:

git merge escolha/python

O 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 commit

Confira:

git status
git log --oneline --graph --all

O aprendizado principal

Git não "quebrou". Ele parou porque não tinha informação suficiente para decidir por você.


Desafio 05 — Recuperação

A) git restore

Altere um arquivo rastreado e confira:

git diff

Descarte a alteração não staged:

git restore arquivo.txt

Use apenas quando realmente quiser perder essa modificação local.


B) git restore --staged

Faça uma alteração:

git add arquivo.txt

Agora remova apenas da staging:

git restore --staged arquivo.txt

A alteração continua no arquivo.

staged
  ↓ restore --staged
modified

C) git stash

Faça alterações sem commit e guarde temporariamente:

git stash

Confira:

git status
git stash list

Recupere:

git stash pop

D) git revert

Crie um commit de teste:

git add .
git commit -m "test: cria alteracao temporaria"

Veja o hash:

git log --oneline

Desfaça preservando o histórico:

git revert HASH

O histórico passa a conter tanto o commit original quanto o commit que registra sua reversão.


🧠 Como saber se você realmente aprendeu?

Não se limite a confirmar que os comandos funcionaram. Tente responder:

  • Por que git add nã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 --staged não é igual a restore?
  • 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.