Chapitre 1413 minDébutant
Exercices Git corrigés : cas de synthèse
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- prédire un historique et lire
git status -s; - choisir la bonne annulation dans un cas concret ;
- dérouler une journée de travail en équipe, côté SLAM comme côté SISR ;
- répondre aux questions d'entretien sur Git.
7 exercices corrigés
Ces exercices Git corrigés mélangent les notions de tout le cours, comme dans une situation réelle de projet ou une question d'entretien au BTS SIO : prédire un historique, lire git status, enchaîner les commandes d'un travail d'équipe, choisir la bonne annulation, versionner des scripts d'administration en SISR. Chaque corrigé a été vérifié en exécutant les commandes. Fais-les sur papier d'abord, puis rejoue-les dans un dépôt de test pour vérifier.
Comment s'entraîner
Crée un dossier d'essai que tu peux casser sans risque :
mkdir ~/essais-git
cd ~/essais-git
git init -b main bac-a-sable
cd bac-a-sable
L'option -b main nomme la branche initiale, quel que soit ton réglage init.defaultBranch. Pour créer rapidement des commits de test, une ligne suffit : echo "texte" > fichier.txt && git add fichier.txt && git commit -m "Message". Le site Learn Git Branching propose aussi des exercices visuels sur les branches et le rebase, dans le navigateur.
Exercice 1 : prédire l'historique
Exercice 1 sur 7 Prédire l'historique Réussi À revoir
Dans un dépôt neuf, sur main, on exécute dans l'ordre : un commit A, un commit B ; git switch -c feature/x ; des commits C et D ; git switch main ; git merge feature/x ; git switch -c feature/y ; un commit E ; git switch main ; un commit F ; git merge feature/y.
- Le premier
git mergecrée-t-il un commit de fusion ? Et le second ? - Combien de commits sont accessibles depuis
mainà la fin ? - Combien de parents a le dernier commit de
main? - Dessine (ou écris) la sortie de
git log --oneline --graph --allen remplaçant les empreintes par les lettres, et en appelant M le commit de fusion.
Voir la réponseMasquer la réponse de l'exercice 1
- Le premier non :
mainest restée sur B pendant quefeature/xavançait, c'est une avance rapide (Fast-forward). Le second oui :maina reçu F pendant quefeature/yrecevait E, les deux lignes ont divergé, Git crée un commit de fusion. - Sept : A, B, C, D, E, F et le commit de fusion M.
- Deux : F (le dernier commit de
mainavant la fusion) et E (le dernier commit defeature/y). -
* M (HEAD -> main) Merge branch 'feature/y' |\ | * E (feature/y) * | F |/ * D (feature/x) * C * B * A
Tu avais trouvé ?
Exercice 2 : lire git status -s
Exercice 2 sur 7 Lire git status -s Réussi À revoir
Après le dernier commit, on a : modifié app.js, lancé git add app.js, modifié de nouveau app.js ; modifié README.md sans le préparer ; lancé git rm ancien.js ; créé export.js.
- Écris la sortie de
git status -s. - Qu'est-ce qui part si on lance
git commit -m "…"maintenant ? - Quelle commande prépare tout le reste, y compris le nouveau fichier ?
Voir la réponseMasquer la réponse de l'exercice 2
-
M README.md D ancien.js MM app.js ?? export.jsLes fichiers sont triés par nom. Première colonne, la zone de préparation ; deuxième colonne, le répertoire de travail.
M: modifié, non préparé.D: suppression préparée.MM: une version préparée, puis une nouvelle modification non préparée.??: non suivi. -
La suppression de
ancien.jset la version deapp.jstelle qu'elle était au moment dugit add. NiREADME.md, ni la seconde modification deapp.js, niexport.js. -
git add -A.
Tu avais trouvé ?
Exercice 3 : une journée en équipe
Exercice 3 sur 7 Une journée en équipe Réussi À revoir
Lina et Hugo travaillent sur le dépôt sorbier-frais en GitHub Flow, avec la branche main protégée. Lina doit ajouter la pagination de la liste des notes (issue 21).
- Écris les commandes de Lina, du matin (dépôt déjà cloné) jusqu'à l'ouverture de la pull request, avec deux commits : la route paginée, puis ses tests.
- Pendant la revue, Hugo demande de renommer un paramètre. Comment Lina met-elle à jour la pull request ?
- Entre-temps, une autre pull request a été fusionnée dans
mainet touche le même fichier : GitHub signale This branch has conflicts that must be resolved. Lina est seule sur sa branche. Donne deux façons de régler le problème en local. - Après la fusion par Squash and merge, quelles commandes remettent son dépôt local au propre ?
Voir la réponseMasquer la réponse de l'exercice 3
-
git switch main git pull git switch -c feature/21-pagination # ... code de la route ... git add routes/notes.js git commit -m "feat(api): pagine la liste des notes" # ... tests ... git add tests/notes.test.js git commit -m "test(api): couvre la pagination de la liste des notes" git push -u origin feature/21-pagination gh pr create --base main --title "Pagine la liste des notes" --body "Closes #21"La pull request peut aussi s'ouvrir depuis le bandeau Compare & pull request de GitHub.
-
Elle corrige sur sa branche, commite et pousse :
git commit -am "refactor(api): renomme le paramètre page en numeroPage"puisgit push. La pull request se met à jour toute seule ; elle répond au commentaire et redemande une relecture. -
Première façon, par fusion :
git switch feature/21-pagination,git fetch,git merge origin/main, résoudre le conflit,git add,git commit,git push. Seconde façon, par rebase, possible car elle est seule sur la branche :git fetch,git rebase origin/main, résoudre,git add,git rebase --continue, puisgit push --force-with-lease. -
git switch main git pull git branch -D feature/21-pagination git fetch --prune-Dest nécessaire : après un Squash and merge, les commits de la branche ne sont pas dansmaintels quels, et-drefuserait.
Tu avais trouvé ?
Exercice 4 : choisir la bonne annulation
Exercice 4 sur 7 Choisir la bonne annulation Réussi À revoir
git log --oneline affiche, sur main :
5cd72bc Ajoute l'export CSV
dc85ba1 Arrondit les indemnités
25c1286 Ajoute la validation du montant
9192bcb Ajoute la route GET /notes
1ef822c Initialise l'API
- Quel commit désigne
HEAD~2? EtHEAD~4? - Tout est poussé et partagé. L'arrondi des indemnités est faux. Quelle commande l'annule ? Combien de commits affiche ensuite
git log --oneline? - Situation différente : rien n'est poussé. Tu veux retirer les deux derniers commits de l'historique en gardant leurs modifications dans tes fichiers, pour les recomposer. Quelle commande ?
- Toujours sans rien avoir poussé, tu lances par erreur
git reset --hard HEAD~3. Sur quel commit estmain? Comment reviens-tu à5cd72bc?
Voir la réponseMasquer la réponse de l'exercice 4
HEAD~2est25c1286(« Ajoute la validation du montant ») ;HEAD~4est1ef822c(« Initialise l'API »).HEAD~nremonte de n parents.git revert dc85ba1. L'historique compte ensuite 6 commits : les 5 d'origine plusRevert "Arrondit les indemnités".git reset HEAD~2(mode--mixedpar défaut) :mainrevient sur25c1286, les modifications des deux commits restent dans le répertoire de travail, non préparées.- Sur
9192bcb(« Ajoute la route GET /notes »).git reflogmontre5cd72bcà la ligneHEAD@{1}, etgit reset --hard 5cd72bc(ougit reset --hard HEAD@{1}) y ramènemain.
Tu avais trouvé ?
Exercice 5 : versionner des scripts d'administration (SISR)
Exercice 5 sur 7 Versionner des scripts d'administration Réussi À revoir
Au service informatique de Sorbier Logistique, Karim, alternant SISR, maintient des scripts PowerShell : création des comptes Active Directory à partir d'un fichier CSV, sauvegarde des partages, rapport hebdomadaire. Ils vivent dans C:\Scripts sur un serveur, sans historique. Le dossier contient aussi les journaux d'exécution (*.log), les CSV des nouveaux arrivants (noms, prénoms, services) et un fichier credentials.xml qui contient un mot de passe chiffré de compte de service. L'entreprise héberge un serveur Gitea.
- Pourquoi versionner ces scripts ?
- Écris le
.gitignoredu dépôt. - Écris les commandes pour créer le dépôt local, faire le premier commit et le pousser sur
https://gitea.sorbier.local/infra/scripts.git. - Le script de création des comptes est en production depuis lundi. Comment marquer cette version, et pourquoi ?
- Une modification du script de sauvegarde, poussée hier, a cassé la sauvegarde de cette nuit. Quelle commande rétablit la version précédente sans réécrire l'historique ?
Voir la réponseMasquer la réponse de l'exercice 5
-
Savoir qui a changé quoi et quand, revenir à une version qui marchait quand une modification casse la production, faire relire une modification avant de la déployer, et disposer d'une copie des scripts ailleurs que sur le serveur.
-
# Journaux d'exécution *.log # Données personnelles des arrivants *.csv !exemples/arrivants-exemple.csv # Secrets credentials.xmlLe CSV d'exemple, avec des personnes fictives, montre le format attendu ; les vrais CSV contiennent des données personnelles et n'ont rien à faire dans le dépôt. Le mot de passe du compte de service, même chiffré, ne se versionne pas : un fichier chiffré avec les clés de l'utilisateur Windows reste un secret.
-
cd C:\Scripts git init -b main git add .gitignore git add . git status git commit -m "Versionne les scripts d'administration existants" git remote add origin https://gitea.sorbier.local/infra/scripts.git git push -u origin mainLe
.gitignoredoit exister avant legit add ., etgit statuspermet de vérifier qu'aucun CSV nicredentials.xmln'est préparé. -
Avec un tag annoté :
git tag -a creation-comptes-v1.0 -m "Script de création des comptes en production"puisgit push origin creation-comptes-v1.0. On sait ainsi exactement quelle version tourne en production, et on peut y revenir ou la comparer à la version en cours (git diff creation-comptes-v1.0). -
git revert <empreinte-du-commit>puisgit push, et redéployer le script sur le serveur. Le commit est partagé : on ne réécrit pas l'historique.
Tu avais trouvé ?
Exercice 6 : questions d'entretien
Exercice 6 sur 7 Questions d'entretien Réussi À revoir
Réponds en deux ou trois phrases, comme devant une commission ou un recruteur.
- Quelle différence entre Git et GitHub ?
- À quoi sert la zone de préparation ?
- Quelle différence entre
git fetchetgit pull? - Pourquoi ne faut-il pas rebaser une branche partagée ?
- Qu'est-ce qu'une pull request, et qu'apporte-t-elle par rapport à un
git mergelocal ? - Un mot de passe a été poussé sur GitHub. Que fais-tu en premier ?
- Comment montres-tu, dans ton dépôt, que tu gères les versions de ton application ?
Voir la réponseMasquer la réponse de l'exercice 6
- Git est le logiciel de gestion de versions installé sur le poste : il enregistre l'historique en local. GitHub est un service en ligne qui héberge des dépôts Git et ajoute la collaboration : pull requests, issues, intégration continue.
- Elle permet de choisir précisément ce qui entre dans le prochain commit : on prépare avec
git addles modifications qui vont ensemble, on commite, puis on prépare la suite. Chaque commit reste ainsi centré sur un seul sujet. git fetchtélécharge les nouveaux commits du dépôt distant et met à jour les branches de suivi, sans toucher à mes branches ni à mes fichiers.git pullfait unfetchpuis intègre les commits dans ma branche courante, par fusion ou par rebase.- Le rebase recrée les commits avec de nouvelles empreintes. Si un coéquipier a déjà récupéré les anciens, son dépôt contient les deux versions : doublons, conflits et historique incohérent. On rebase donc seulement des commits qu'on est seul à avoir.
- C'est une demande d'intégration d'une branche dans une autre, sur la forge. Elle permet la revue de code, la discussion, les tests automatiques avant la fusion, et garde une trace de tout cela ; un
git mergelocal intègre sans que personne n'ait relu. - Je révoque le secret : je change le mot de passe ou je régénère la clé, parce qu'il faut le considérer comme compromis. Ensuite seulement, je le retire du suivi et je nettoie l'historique si nécessaire.
- Par des commits réguliers aux messages clairs, des tags de version selon le versionnage sémantique, un CHANGELOG à jour, des issues reliées aux corrections, et un pipeline qui teste chaque version.
Tu avais trouvé ?
Exercice 7 : cas type E6 SLAM
Exercice 7 sur 7 Cas type E6 SLAM Réussi À revoir
Expression des besoins reçue pendant l'épreuve : « Les comptables souhaitent pouvoir marquer une note de frais comme payée, avec la date du paiement. Une note payée ne peut plus être modifiée. » Ton application est Sorbier Frais, ton dépôt est propre et à jour sur main, en version 1.2.0.
- Écris les commandes Git de ton heure de réalisation, avec trois commits correspondant à trois étapes testées.
- À la fin de l'heure, quelle commande montre à la commission la liste des fichiers modifiés depuis
main? - Si l'évolution était livrée, quel serait le numéro de version, et que faudrait-il ajouter au CHANGELOG ?
Voir la réponseMasquer la réponse de l'exercice 7
-
git status git switch -c e6-note-payee # Étape 1 : la base git add sql/migration-note-payee.sql git commit -m "Ajoute la colonne date_paiement à la table note" # Étape 2 : l'API git add routes/notes.js git commit -m "Ajoute la route PATCH /notes/:id/paiement réservée aux comptables" # Étape 3 : la règle métier et son test git add routes/notes.js tests/notes.test.js git commit -m "Interdit la modification d'une note payée" git log --oneline main..HEADChaque commit ne part qu'une fois l'étape testée.
git log --oneline main..HEADliste les trois commits de l'évolution. -
git diff main --stat: les fichiers modifiés et le nombre de lignes ajoutées et supprimées.git diff maindonne le détail. -
1.3.0: une fonctionnalité nouvelle, compatible avec l'existant. Dans le CHANGELOG, une section## [1.3.0] - dateavec, sous Ajouté : « Un comptable peut marquer une note comme payée, avec la date du paiement ; une note payée n'est plus modifiable. »
Tu avais trouvé ?