Alguns exercícios nesta secção assumem o uso de Visual Studio 2017 com a extensão "Git for Windows".
1 - Quando crias um novo projeto em Visual Studio 2017 com repositório Git inicializado, que comandos Git são executados automaticamente em pano de fundo?
2 - Como podes, dentro do Visual Studio 2017, inicializar um repositório Git num projeto já existente (criado sem repositório Git)? E usando o terminal?
3 - Para que serve o ficheiro .gitignore
? Explica o porquê deste ficheiro
ser essencial num projeto em Visual Studio?
4 - Para que serve o ficheiro .gitattributes
?
5 - O Git é especialmente adequado para controlar as versões de que tipo de ficheiros? Por outro lado, que tipo de ficheiros não é recomendável adicionar a um repositório Git? Explica como essa limitação poderia à partida "atrapalhar" o desenvolvimento de vídeo jogos?
6 - Quais são os comandos Git para especificares, de uma forma global, o teu nome e email para realização de commits? E caso queiras efetuar essa configuração apenas para um repositório?
7 - Apresenta os conteúdos do ficheiro .gitignore
quando pretendes evitar que
os ficheiros com extensão .exe
, .dll
, .jpg
e .png
sejam adicionados ao
repositório.
8 - Escreve os comandos git para: 1) adicionar um repositório remoto chamado origin com URL https://github.com/VideojogosLusofona/BestGameEver; 2) fazer push do ramo local master, com seguimento, para o repositório remoto origin adicionado no ponto anterior.
9 - Na sequência do exercício anterior, qual o comando git para alterar o nome do repositório conhecido como origin para secondary? E se quiséssemos apenas mudar o URL para https://github.com/VideojogosLusofona/not-so-good-game?
10 - Escreve os comandos git para: 1) alterar o nome do ficheiro Programa.cs
para Jogo.cs
; 2) fazer commit da alteração efetuada, com uma mensagem de
commit que siga as melhores práticas
para o efeito.
11 - Fizeste modificações aos ficheiros README.md
e MyGame/Program.cs
, e
queres realizar um commit com a mensagem "Update documentation and comments".
Quais os comandos necessários para realizar este commit?
12 - Estás a trabalhar no ramo experiment
, e decides que a alteração
experimental que fizeste é suficientemente boa para juntar ao ramo principal do
programa (master
). Qual o comando ou comandos para o efeito?
13 - Qual o comando para ver as diferenças entre o penúltimo commit e o antepenúltimo commit? Podes assumir que estamos num ramo sem divergências, ou seja, cada commit tem apenas um pai.
14 - Por engano adicionaste uma pasta de nome bin
, bem como todos os seus
conteúdos, para commit (isto é, à staging area). No entanto, ainda não
fizeste commit. Qual o comando para retirar essa pasta, bem como os seus
conteúdos, da staging area?
15 - Qual o comando para descartar todas as alterações efetuadas em ficheiros
Markdown (extensão .md
) ainda não adicionadas para commit (isto é, ainda
não adicionadas à staging area)?
16 - Qual a diferença entre um merge fast forward e um merge commit? Em qual destes merges é possível haver um merge conflict?
17 - Escreve os comandos git para o teu repositório ficar com um estado semelhante ao indicado na imagem em baixo. Não te esqueças que é necessário existirem alterações na staging area de modo a ser possível fazer um commit, pelo que deves indicar também estas modificações (os nomes de ficheiros podem ser inventados por ti).
18 - Apagaste o ramo new-feature
do teu repositório local, ramo esse que
estava também mapeado (com o mesmo nome) no repositório remoto upstream
. Qual
é o comando para apagar o ramo também no repositório remoto?
19 - Estás a trabalhar no teu projeto final de LP1, e tens alguns commits no
ramo devel
que ainda não foram sincronizados com o teu servidor remoto
(conhecido localmente como upstream
). Qual o comando para realizar esta
sincronização/carregamento de alterações com o servidor remoto?
20 - Estás a trabalhar com o teu colega no projeto final de LP1, e o teu colega
criou alguns ramos e fez push de algumas alterações no servidor remoto
(localmente conhecido como mygithub
). Qual o comando para o teu repositório
local ficar com conhecimento sobre todas as alterações efetuadas no
repositório remoto (incluindo novos ramos)?
21 - Estás a trabalhar no ramo local master
, e tens alguns commits feitos
desde a última vez que sincronizaste com o remoto origin
. Ao fazeres push
das tuas alterações, obténs a seguinte mensagem:
error: failed to push some refs to 'https://gitlab.com/ulht/projeto.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Explica qual é o problema e como o podes resolver, assumindo que não existem merge conflicts.
22 - Estás a trabalhar no ramo local master
, e tens alguns commits feitos
desde a última vez que sincronizaste com o remoto origin
. Antes de fazeres
o push
dos teus commits locais, tentas integrar possíveis commits em
origin/master
no teu master
local (fazendo por exemplo, git pull
), mas
obténs a seguinte mensagem de erro:
Unpacking objects: 100% (6/6), done.
From https://gitlab.com/ulht/projeto.git
17858a5..1601016 master -> origin/master
Auto-merging MyGame/BigBadBoss.cs
CONFLICT (content): Merge conflict in MyGame/BigBadBoss.cs
Automatic merge failed; fix conflicts and then commit the result.
Explica qual é o problema e como o podes resolver.
23 - Como podes eliminar localmente o conhecimento sobre o remoto chamado
origin
?
24 - Estás a trabalhar há algum tempo num repositório local, mas decidiste que
seria importante ter um repositório remoto para backup e possíveis
colaborações com terceiros. Criaste o repositório remoto no GitLab no URL
https://gitlab.com/MyUsername/bestgamever.git, e agora pretendes associar este
remoto ao teu repositório local com o nome principal
e fazer push
do ramo
local master
para o ramo remoto master
. Além disso queres tornar o ramo
master
local num remote tracking branch (ramo de seguimento remoto) do
ramo principal/master
. Quais são os comandos para alcançares estes objetivos?
25 - Chegaste à conclusão que o nome principal
não é apropriado para o
repositório remoto do exercício anterior. Qual o comando para mudares o nome
do remoto para origin
?
26 - Explica por palavras tuas o que é um remote tracking branch (ramo de seguimento remoto)?
27 - Como podes obter localmente informação detalhada sobre um remoto conhecido
como upstream
?
28 - Como podes obter informação detalhada sobre um ramo local chamado devel
,
incluindo a sua associação de seguimento remoto com um potencial ramo remoto?
29 - Tens um ramo local chamado testing
e queres fazer push
desse ramo para
o remoto localmente conhecido como main
. No entanto o remoto em questão já
tem um ramo com esse nome. Como podes fazer push
(com seguimento) do teu ramo
local testing
de modo a que este seja conhecido remotamente como mytesting
?
30 - Tens um ramo local chamado new-level
e queres que este ramo passe a
fazer remote tracking (seguimento) do ramo devel
no remoto localmente
conhecido como origin
. Qual é o comando para o efeito?
31 - O teu repositório local tem conhecimento de dois remotos: origin
e
upstream
. Existe um ramo chamado new-boss
no remoto origin
, que não
existe localmente nem no remoto upstream
. Quais os comandos para passares a
ter este ramo localmente e no remoto upstream
, com o mesmo nome? Certifica-te
que o ramo new-boss
local não faz seguimento a nenhum ramo remoto.
32 - Tens dois ramos no teu repositório local, master
e dev
, que entretanto
divergiram. Estás neste momento no ramo master
e queres juntar-lhe as
alterações efetuadas no ramo dev
, mas não queres criar um merge commit
(isto é, queres manter a história linear), nem queres reescrever a história do
ramo master
. Quais são os comandos para alcançares este objetivo?
33 - Estás a trabalhar com vários colegas num remoto localmente conhecido como
ulht_colab
. Efetuaste alguns commits no teu ramo local master
, que
entretanto divergiu do ramo ulht_colab/master
. Queres fazer push das tuas
alterações, mas primeiro tens de integrar localmente as alterações remotas.
Indica os comandos para: 1) integrares localmente as alterações remotas,
mantendo a história linear e evitando merge commits; e, 2) publicares as tuas
alterações no remoto.
34 - Adiciona ao teu repositório local um segundo remoto (com o nome que
quiseres) com URL igual a https://github.com/awesome/game.git. Depois cria um
novo ramo local chamado devel
(com base em master
) e faz um primeiro push
do mesmo, com seguimento remoto, para o ramo devtests
do novo repositório.
35 - Antes de começares a usar Git LFS no teu PC e na tua conta de utilizador, que comando é necessário executar?
36 - Iniciaste um novo projeto que vai incluir ficheiro binários .mkv
, .ogg
e *.jpg
. Pretendes que estes tipos de ficheiros sejam incluidos no teu
repositório Git em modo LFS. Quais os comandos a executar para o efeito? Onde
fica registada esta informação?
37 - No problema da alínea anterior decidiram mudar o formato dos ficheiros de
vídeo de .mkv
para .mp4
. Que comandos tens de executar para deixar de
seguir os ficheiros .mkv
e começar a seguir os ficheiros .mp4
em modo LFS?
38 - Quando usas Git LFS num projeto com vários colegas, que cuidados todos os participantes têm de ter?
39 - Quais as diferenças entre os comandos git lfs status
e
git lfs ls-files
?
40 - Começaste a usar o XYZGameBuilder para criar a tua obra de arte. Este
game engine gera vários ficheiros temporários sem interesse com extensões
*.xyzconfig
, *.xyzproj
e *.xyzlocaldefs
. Além disso, o game engine
guarda as definições do projeto, importantes para todos os que estão a
desenvolver o jogo, em ficheiros binários com extensão *.xyzsettings
.
Adicionalmente pretendes usar assets binários com extensões *.png
, *.psd
,
*.wav
e *.3dx
. Responde às seguintes questões:
- Quais devem ser os conteúdos do ficheiro
.gitignore
? - Quais devem ser os conteúdos do ficheiro
.gitattributes
e que comandos usaste para gerar esses conteúdos?
41 - Qual o comando para adicionares uma tag simples com etiqueta versao123
ao último commit efetuado? Qual o comando para fazeres push única e
exclusivamente desta tag para o repositório remoto repo-do-pedro
?
42 - Qual o comando para adicionares uma tag anotada com etiqueta v1.2
e
mensagem Fix 10 bugs since last version
ao último commit efetuado? Qual o
comando para fazeres push única e exclusivamente desta tag para o
repositório remoto origin
?
43 - Qual o comando para adicionares uma tag simples com etiqueta p5
a um
commit com código de verificação começado por 70460b4b
? Qual o comando para
fazeres push única e exclusivamente desta tag para o repositório remoto
upstream
?
44 - Qual o comando para adicionares uma tag anotada com etiqueta v12
e
mensagem Lots of optimizations and bug fixes
a um commit com código de
verificação começado por baae61804
? Qual o comando para fazeres push única
e exclusivamente desta tag para o repositório remoto github-repo
?
45 - Qual o comando para eliminares uma tag com etiqueta v987
? Qual o
comando para eliminares esta tag do repositório remoto remoto-do-ze
?
46 - Qual o comando para listares todas as tags começadas por v3
?
47 - Qual o comando para criares um novo ramo v3devel
, sem mudar para o
mesmo, a partir da tag v3.4.1
? E se quisesses criar o ramo e mudar para o
mesmo num único comando?
48 - Qual o comando para obteres informações detalhadas sobre a tag
ItWorks
?