Módulo 10 · Aula 10.4 · Git: ramos, juntar e resolver conflito
| Carga horária | Dificuldade | Ferramenta | Competências |
|---|---|---|---|
| 8 h/a | ⭐⭐⭐ | Git (linha de comando) | C7 |
Objetivos de aprendizagem
- Criar um ramo para testar uma ideia sem estragar a versão principal.
- Trocar de ramo e juntar um ramo no principal.
- Resolver um conflito quando duas pessoas mudaram a mesma linha.
- Combinar regras de trabalho em equipe com ramos.
Pré-requisitos
Aula 10.3.
Materiais
Git; repositório do Projeto 6 (ou uma cópia do Chave da Porteira com o primeiro commit feito).
Conceitos
Ramo (branch). Um caminho paralelo do histórico. O principal se chama main. Para testar "e se o labirinto fosse de noite?", cria-se um ramo fase-noturna, faz-se os commits lá, e o main continua intacto. Gostou? Junta. Não gostou? Apaga o ramo.
Juntar (merge). Trazer os commits de um ramo para outro. Quando só um dos lados mudou, o Git só "anda para a frente" (Fast-forward). Quando os dois mudaram em lugares diferentes, ele junta sozinho. Quando os dois mudaram a mesma linha, ele não sabe qual escolher: é um conflito, e uma pessoa decide.
Marcas do conflito. O Git escreve as duas versões no arquivo, entre marcas:
<<<<<<< HEAD
(a versão do ramo em que você está)
=======
(a versão do outro ramo)
>>>>>>> nome-do-outro-ramoResolver é apagar as marcas e deixar o texto certo, depois git add e git commit.
Regras de equipe (para o Módulo 11). Cada pessoa trabalha no seu ramo; o main sempre roda; antes de juntar, a dupla testa; mensagens claras. Combinar quem mexe em qual cena evita conflito em arquivos .tscn, que são mais difíceis de juntar à mão.
Exemplos
Saídas reais, numa cópia de teste do Chave da Porteira.
Ramo e junção simples:
$ git switch -c fase-noturna
Switched to a new branch 'fase-noturna'
$ git switch main
Switched to branch 'main'
$ git merge fase-noturna
Updating b1ccd75..71fdcbd
Fast-forward
cenas/labirinto.tscn | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --oneline --graph
* 71fdcbd Sol fraco: labirinto de noite
* b1ccd75 Jogador mais rápido
* 5ae1753 Labirinto com chave e porteira
$ git branch
fase-noturna
* main(Entre git switch -c e git switch main, no ramo novo, a energia do sol foi mudada de 0,9 para 0,3 e foi feito o commit "Sol fraco: labirinto de noite".)
Conflito: no ramo paredes-altas a altura virou 3,5 m; no main, 2 m. A mesma linha.
$ git merge paredes-altas
Auto-merging scripts/labirinto.gd
CONFLICT (content): Merge conflict in scripts/labirinto.gd
Automatic merge failed; fix conflicts and then commit the result.
$ git status --short
UU scripts/labirinto.gdTrecho do arquivo com as marcas (números das linhas à esquerda):
8:<<<<<<< HEAD
9-const ALTURA := 2.0 # altura das paredes, em metros
10-=======
11-const ALTURA := 3.5 # altura das paredes, em metros
12->>>>>>> paredes-altas
13-const MAPA := [Depois de apagar as marcas e a versão de 3,5 m:
$ git commit -m "Junta os ramos: fica a parede de 2 m"
[main c397b2b] Junta os ramos: fica a parede de 2 m
$ git log --oneline --graph
* c397b2b Junta os ramos: fica a parede de 2 m
|\
| * 0fb55b9 Paredes de 3,5 m
* | 7d8e241 Paredes de 2 m
|/
* 71fdcbd Sol fraco: labirinto de noite
* b1ccd75 Jogador mais rápido
* 5ae1753 Labirinto com chave e porteiraO desenho com |, / e \ mostra os dois caminhos se separando e se juntando de novo.
Tutorial passo a passo
Parte A. Ramo de experimento (100 min)
- No repositório do Projeto 6:
git switch -c fase-noturna. - Deixe o labirinto de noite (Aula 9.7), rode e faça o commit.
git switch maine rode o jogo: está de dia de novo? Abra o Godot e confira.git merge fase-noturna. Rode: agora omaintem a noite.git log --oneline --graph.
Parte B. Fabricar um conflito, em dupla (120 min)
- Crie o ramo
paredes-altas, mudeALTURApara 3.5 e faça o commit. - Volte ao
main, mudeALTURApara 2.0 e faça o commit. git merge paredes-altas. Leia a mensagemCONFLICT.- Abra
scripts/labirinto.gdno Godot ou num editor de texto, ache as marcas, decida com a dupla, apague as marcas e salve. git add scripts/labirinto.gdegit commit -m "...". Rode o jogo para conferir.
Parte C. Combinar a equipe (60 min)
- Em grupo de quatro, escrevam o "acordo do repositório" para o Módulo 11: nomes dos ramos, quem mexe em qual cena, quando juntar, quem testa.
Imagens
Não há capturas: as saídas reais estão nos Exemplos.
Indicação da interface
| Comando | O que faz |
|---|---|
git switch -c nome | cria o ramo e entra nele |
git switch nome | troca de ramo |
git branch | lista os ramos; o * marca onde você está |
git merge nome | traz o ramo nome para o ramo atual |
git log --oneline --graph | histórico com o desenho dos ramos |
git branch -d nome | apaga um ramo que já foi juntado |
O código completo
Não há código novo. A mudança da Parte A é uma linha em cenas/labirinto.tscn (light_energy = 0.9 para 0.3).
Explicação do código
Uma cena .tscn também é texto: por isso o Git consegue mostrar e juntar mudanças nela. Mas cenas têm muitos números (posições, cores) e conflitos nelas são difíceis de entender. A regra prática é uma pessoa por cena de cada vez.
Resultado esperado
Ramo de experimento juntado, um conflito resolvido em dupla e o acordo do repositório escrito.
Problemas comuns
| Sintoma | Causa | Solução |
|---|---|---|
git switch recusa trocar de ramo | há mudança sem commit | fazer o commit (ou git restore) antes |
| o Godot mostra o projeto "velho" depois de trocar de ramo | o editor estava aberto | fechar e abrir o projeto de novo depois de trocar |
| o jogo não abre depois do merge | sobraram marcas <<<<<<< no arquivo | procurar e apagar todas as marcas |
conflito numa cena .tscn | duas pessoas mexeram na mesma cena | escolher uma versão inteira e refazer a outra mudança à mão |
Exercício guiado
Por que o primeiro merge disse Fast-forward e o segundo deu conflito? (Resposta: no primeiro, só o ramo fase-noturna tinha mudado; o main só andou para a frente. No segundo, os dois ramos mudaram a mesma linha.)
Desafio individual
Faça um ramo, mude algo de que você não gostou e apague o ramo sem juntar (git branch -D nome, com D maiúsculo para apagar sem juntar).
Desafio avançado (opcional)
Provoque um conflito em dois lugares do mesmo arquivo e resolva escolhendo uma versão em cada lugar.
Critérios de avaliação
- Usa ramo para experimento.
- Resolve conflito e o jogo continua rodando.
- Acordo do repositório escrito.
Checklist de conclusão
Extensão
Desenhe no caderno o histórico do seu projeto, com bolinhas para os commits e linhas para os ramos.