Ficha 01 · Git fundamentos
- Comandos
- Branches
- Merge
- Gitignore
Parte I · Comandos básicos
Exercício 1 · Setup (10 pts)
Listar comandos para: a) Configurar nome e email. b) Iniciar repo num projeto novo. c) Ver estado dos ficheiros. d) Adicionar ficheiro ao staging. e) Criar commit.
Exercício 2 · Workflow básico (10 pts)
A Marta vai começar o projeto agenda-escolar, um pequeno script em Python que lê a lista de turmas. Na pasta já existem agenda.py, turmas.csv, uma pasta __pycache__/ criada pelo Python e um ficheiro erros.log. Descreve os comandos para:
- Criar o repositório e ver o que o Git deteta.
- Impedir que
__pycache__/e os ficheiros.logsejam seguidos. - Gravar um primeiro commit com os ficheiros do projeto.
- Acrescentar uma linha a
turmas.csv, ver a diferença antes de a gravar e fazer um segundo commit. - Consultar o historial em formato compacto.
Parte II · Branches
Exercício 3 · Branches (10 pts)
Comandos para:
a) Criar branch feature/login.
b) Mudar para essa branch.
c) Criar branch + mudar de uma vez.
d) Fundir feature/login em main.
e) Apagar branch após merge.
Exercício 4 · .gitignore (10 pts)
Escreve .gitignore apropriado para projeto Node.js + React.
Parte III · GitHub
Exercício 5 · Ligar a GitHub (10 pts)
O Pedro tem no computador o repositório horario-turmas, com três commits. Entretanto, ao criar o repositório no GitHub, deixou marcada a opção de criar um README, por isso o remoto já tem um commit. Ele fez:
git remote add origin https://github.com/pedro-exemplo/horario-turmas.git
git push -u origin main
e recebeu uma recusa:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/pedro-exemplo/horario-turmas.git'
a) Explica porque é que o push foi recusado.
b) Indica os comandos para integrar os dois historiais e enviar o trabalho, sem usar --force.
c) Depois de o repositório ficar sincronizado, o Pedro quer deixar de usar HTTPS e passar a usar SSH. Indica o comando para mudar o endereço do remoto e como confirmar.
d) Dá uma razão para não resolver (b) com git push --force.
Exercício 6 · README profissional (10 pts)
Escreve um modelo de README.md para um projeto de calculadora em Python.
Parte IV · Pull Requests
Exercício 7 · Criar PR (10 pts)
Descreve workflow completo para criar Pull Request.
Exercício 8 · Resolução de conflito (10 pts)
Num site de uma associação, a branch limpeza apagou o ficheiro contactos.html (a página passou a estar dentro de sobre.html) e alterou a cor de estilo.css. Entretanto, na main, outra pessoa corrigiu o telefone em contactos.html e mudou a mesma linha de cor em estilo.css. Ao fundir:
git switch main
git merge limpeza
o Git devolve:
CONFLICT (content): Merge conflict in estilo.css
CONFLICT (modify/delete): contactos.html deleted in limpeza and modified in HEAD. Version HEAD of contactos.html left in tree.
Automatic merge failed; fix conflicts and then commit the result.
a) Explica o que significa cada uma das duas linhas CONFLICT.
b) Indica como resolver estilo.css, sabendo que a equipa decidiu ficar com a cor da main.
c) Indica como resolver contactos.html, sabendo que a página deixa de existir mas o telefone novo tem de passar para sobre.html.
d) Conclui o merge e diz como confirmar que ficou tudo resolvido.
e) Se esta integração fosse feita com git rebase main a partir da limpeza, o que se inverte em --ours e --theirs?
Parte V · Historial, tags e cliente gráfico
Exercício 9 · Corrigir e desfazer (10 pts)
No repositório diario-de-bordo, a Inês tem cinco problemas. Para cada um, indica os comandos e justifica:
a) Gravou o commit "Acrescentar capa" mas esqueceu-se do ficheiro capa.png. O commit ainda só existe no seu computador e a mensagem está certa.
b) Num único commit local juntou duas tarefas diferentes (notas.txt e indice.md) e quer que fiquem em dois commits separados.
c) Na branch feature/agenda fez o commit f4e5d6c, que corrige uma data errada. A correção tem de ir já para a main, sem levar o resto da branch.
d) Apagou com git branch -D experiencia uma branch que ainda não tinha sido fundida. Tinha trabalhado nela ontem.
e) Quer saber quem alterou a linha 12 de notas.txt e o que mais mudou nesse commit.
Exercício 10 · Tags e versões (10 pts)
O projeto inventario-sala já está no GitHub. Indica os comandos e responde:
a) A versão entregue há duas semanas corresponde ao commit 9c41e07, mas ninguém a marcou. Cria nesse commit a tag anotada v1.2.0 e envia-a.
b) Uma colega criou a v1.3.0 com git tag v1.3.0, sem -a. Como confirmas o tipo de tag e porque é que isso importa numa versão publicada?
c) Afinal a v1.3.0 ficou no commit errado: deve estar no commit atual (HEAD). Corrige localmente e no GitHub, como tag anotada.
d) Para reproduzir um erro, precisas de ver o projeto exatamente como estava na v1.2.0 e, no fim, voltar à main.
e) Que número leva a versão seguinte à 1.3.0 em cada caso: só a correção de um erro; um relatório novo compatível com o que existe; um formato de ficheiro novo que deixa de abrir os dados antigos?