TP 5 - Git avancé
Exercice 1 : plusieurs remotes (upstream + origin)
Dans cet exercice, vous êtes un contributeur qui doit cloner un dépôt public, créer une branche de travail, et pousser cette branche sur votre propre dépôt distant.
Exécutez les commandes suivantes dans l’ordre, en adaptant NOMDEFAMILLE à votre nom de famille :
- Clonez le dépôt public :
git clone --origin upstream https://gitlab.telecom-paris.fr/3tc37/tp-git cd tp-git- Vérifiez l’état du dépôt :
ls,git status,git log… - Ajoutez votre dépôt distant (sur lequel vous allez pousser vos changements) :
- version avec SSH :
git remote add origin git@gitlab.enst.fr:3tc37/3tc37-2026 - version avec HTTPS :
git remote add origin https://gitlab.telecom-paris.fr/3tc37/3tc37-2026(si vous n’avez pas de clé SSH configurée sur GitLab)
- version avec SSH :
- Vérifiez les remotes :
git remote -v - Créez et basculez sur une nouvelle branche (en prenant soin de remplacer
NOMDEFAMILLEpar votre nom de famille) :git switch -c tp-git-NOMDEFAMILLE - Poussez votre branche sur le remote auquel vous avez accès en écriture :
git push -u origin+ le nom de votre branche - Vérifiez à quelles branches distantes sont associées chaque branche locale :
git branch -vv
Exercice 2 : historique propre (rebase -i)
Dans cet exercice, vous êtes un contributeur qui doit repasser sur une branche pour nettoyer l’historique avant de la fusionner.
Exécutez les commandes suivantes dans l’ordre :
- Basculez sur la branche
feature:git switch feature - Comparez l’historique de
featureavecmain:git log main,git log feature - Mettez à jour votre branche
featureavec les derniers changements demain:git rebase main - Comparez à nouveau les historiques.
- Identifiez les commits à nettoyer (commits à supprimer, à fusionner, ou à réécrire pour clarifier les messages).
- Réécrivez l’historique via
git rebase -i main.- Marquez les commits à supprimer avec
drop(ou en commentant la ligne) - Marquez les commits à fusionner avec
squash(s) oufixup(f) - Marquez les commits à réécrire avec
reword(r) - Enregistrez et quittez l’éditeur pour appliquer les changements.
- Marquez les commits à supprimer avec
- Étudiez à nouveau l’historique pour vérifier le résultat.
- Basculez sur la branche
tp-git-NOMDEFAMILLE:git switch+ le nom de votre branche - Fusionnez
featuredanstp-git-NOMDEFAMILLE:git merge feature. Quel type de merge est utilisé ? Pourquoi ? - Poussez
tp-git-NOMDEFAMILLEsur le remoteorigin:git push
Exercice 3 : résolution de conflit
Dans cet exercice, vous devez résoudre un conflit de fusion entre une branche bugfix qui corrige un bug, mais qui a été créée à partir d’une ancienne version de main, et la version actuelle de main qui a évolué depuis.
Exécutez les commandes suivantes dans l’ordre :
- Basculez sur la branche
bugfix:git switch bugfix - Comparez l’historique de
bugfixavecmain:git log main,git log bugfix - Analysez le changement introduit par
bugfix(git show bugfix) et les changements récents dansmain(git log -p main) pour comprendre les sources potentielles de conflit. - Mettez à jour votre branche
bugfixavec les derniers changements demain:git rebase main - Des conflits de fusion apparaissent. Identifiez les fichiers en conflit :
git status - Ouvrez les fichiers en conflit et résolvez les conflits manuellement.
- Vérifiez que les conflits sont résolus :
git status - Vérifiez que vous avez correctement résolu les conflits en lançant les tests :
make test - Terminez le rebase :
git add .,git rebase --continue - Comparez à nouveau les historiques pour vérifier que le rebase a réussi.
- Fusionnez
bugfixdanstp-git-NOMDEFAMILLE:git switch+ le nom de votre branche,git merge bugfixet poussez :git push
Exercice 4 : récupération (stash/pop + reset --hard)
Dans cet exercice, vous avez commencé à travailler sur une nouvelle modification dans une branche basée sur main, mais vous réalisez que vous devez d’abord mettre à jour votre branche avec un refactoring important qui sera fusionné dans main avant que vous ne puissiez terminer votre travail. Vous devez donc temporairement mettre de côté vos changements en cours, mettre à jour votre branche, puis reprendre votre travail.
Exécutez les commandes suivantes dans l’ordre :
- Basculez sur une nouvelle branche de travail basée sur
main:git switch main -c wip - Ajoutez un test vérifiant que 15/3=5, sans le commiter. Vérifiez que vous avez des changements non committés :
git status - C’est le moment où vous réalisez que vous devez d’abord mettre à jour votre branche avec les changements de
refactorqui seront bientôt fusionnés dansmain. Mettez de côté vos changements en cours :git stash - Tirez les changements de
refactor:git pull upstream refactor - Vérifiez que les changements de
refactorsont bien présents :git log - Reprenez vos changements en cours :
git stash pop - Vérifiez que vos changements sont bien appliqués :
git status,git diff
Heureusement il n’y a pas de conflit entre vos changements et ceux de refactor. S’il y avait eu des conflits, vous auriez dû les résoudre manuellement, comme dans l’exercice précédent.