Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 220 minDébutant

Les commandes Git de base : init, add, commit, log

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • créer un dépôt avec git init ;
  • situer un fichier dans les trois zones de Git avec git status ;
  • enregistrer ton travail avec git add et git commit, avec un bon message ;
  • relire l'historique et les différences avec git log, git diff et git blame.

4 exercices corrigés1 schéma

Les commandes Git de base sont celles du cycle quotidien : git init crée un dépôt, git status montre son état, git add prépare des modifications, git commit les enregistre, git log et git diff relisent l'historique. Ce chapitre les présente sur un vrai projet, en partant du modèle qui rend tout le reste logique : les trois zones de Git. Tu y apprendras aussi à écrire un message de commit qui sert à quelque chose.

Le projet fil rouge

Dans tout le cours, tu suis Lina et Hugo, deux étudiants en deuxième année de BTS SIO SLAM. Ils développent Sorbier Frais, l'application de notes de frais de Sorbier Logistique, une PME fictive : une API REST en Node.js et Express, un front en React et une base MySQL. Lina s'occupe de l'API et de la base, Hugo du front. Le projet leur sert de réalisation professionnelle pour l'E6.

Pour suivre, crée un dossier de travail et un premier fichier. Tu n'as besoin ni de Node.js ni de MySQL : les fichiers du cours sont de simples fichiers texte.

bash
mkdir sorbier-frais
cd sorbier-frais
echo "# Sorbier Frais" > README.md

git init : créer un dépôt

bash
git init
text
Initialized empty Git repository in /home/lina/sorbier-frais/.git/

Git a créé un dossier caché .git : c'est le dépôt proprement dit, avec la base de données des commits, les branches et la configuration locale. Tes fichiers, eux, restent à leur place. Affiche les fichiers cachés avec ls -a (ou Get-ChildItem -Force dans PowerShell) pour le voir.

Ne crée jamais un dépôt à l'intérieur d'un autre. Si tu ouvres un terminal dans un sous-dossier d'un dépôt, Git remonte l'arborescence jusqu'au premier .git qu'il trouve : toutes tes commandes s'appliquent au dépôt parent.

Les trois zones de Git

C'est la notion qui déroute tous les débutants, et celle qui rend tout le reste simple une fois comprise. Git ne passe pas directement de « j'ai modifié un fichier » à « c'est enregistré ». Il y a une étape intermédiaire.

  1. Le répertoire de travail (working directory) : tes fichiers, tels que tu les vois et les modifies dans ton éditeur.
  2. La zone de préparation (staging area, appelée aussi index) : la liste des modifications que tu as choisies pour le prochain commit. Tu y places des modifications avec git add.
  3. Le dépôt local (le dossier .git) : l'historique des commits. git commit y enregistre le contenu de la zone de préparation.

Une quatrième zone s'ajoute quand tu travailles avec une forge : le dépôt distant, que git push alimente.

Répertoirede travailtes fichiersZone depréparation(index)Dépôt local.gitles commitsDépôt distantGitHuborigingit addgit commitgit pushgit restoregit restore --stagedgit pull : récupère les commits et met à jour tes fichiers
Les trois zones de Git, plus le dépôt distant : chaque commande fait passer les modifications d'une zone à l'autre

Pourquoi cette zone intermédiaire ? Parce qu'elle te laisse composer tes commits. Tu as corrigé un bug dans app.js et commencé une nouvelle fonction dans export.js : tu ajoutes seulement app.js, tu commites la correction, puis tu termines l'export et tu le commites à part. Chaque commit raconte une seule chose, et il pourra être annulé seul si besoin.

git status : où en suis-je ?

git status est la commande que tu tapes le plus souvent. Elle dit sur quelle branche tu es, ce qui est modifié, ce qui est préparé, et elle suggère la commande suivante.

bash
printf 'node_modules/\n.env\n' > .gitignore
git status
text
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	README.md

nothing added to commit but untracked files present (use "git add" to track)

Les fichiers sont non suivis (untracked) : ils existent dans le répertoire de travail, mais Git ne les a jamais enregistrés. Un fichier passe par quatre états possibles :

ÉtatCe que dit git statusSignification
Non suiviUntracked filesGit ne l'a jamais enregistré
ModifiéChanges not staged for commitSuivi, modifié depuis le dernier commit, pas encore préparé
PréparéChanges to be committedLa modification est dans la zone de préparation
InchangéIl n'apparaît pasIdentique au dernier commit

git add : préparer un commit

bash
git add README.md
git status
text
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore

Le README.md est passé dans la zone de préparation ; le .gitignore attend encore. Les formes de git add que tu utiliseras :

CommandeEffet
git add fichierPrépare ce fichier
git add dossier/Prépare tout ce qui a changé dans ce dossier
git add .Prépare tout ce qui a changé dans le dossier courant et ses sous-dossiers
git add -APrépare tout ce qui a changé dans le dépôt entier, suppressions comprises
git add -pPasse en revue chaque bloc modifié et te demande s'il faut le préparer (y, n, s pour découper, q pour quitter)

git add -p est le meilleur ami des commits propres : il te montre chaque modification avant de la préparer, et tu repères au passage le console.log de débogage oublié.

git commit : enregistrer

bash
git add .gitignore
git commit -m "Initialise le projet"
text
[main (root-commit) 24b02c7] Initialise le projet
 2 files changed, 3 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md

Git a enregistré le contenu de la zone de préparation. main est la branche, root-commit signale le tout premier commit, 24b02c7 est le début de son empreinte. Chez toi, l'empreinte sera différente : elle dépend de la date et de ton nom.

OptionEffet
-m "message"Donne le message sur la ligne de commande ; sans -m, Git ouvre ton éditeur
-aPrépare automatiquement les fichiers déjà suivis et modifiés, puis commite (les fichiers non suivis sont ignorés)
--amendRemplace le dernier commit : pour corriger son message ou y ajouter un fichier oublié (chapitre 4)

Si Git répond Please tell me who you are, c'est que ton nom et ton adresse ne sont pas configurés (chapitre 1). S'il répond nothing to commit, working tree clean, il n'y a rien de nouveau : soit tu n'as rien modifié, soit tu as oublié git add.

Écrire un bon message de commit

Le message est ce que toi, dans trois mois, ou la commission de l'E6, liront pour comprendre ton historique. « modif », « fix », « wip » ou « ça marche enfin » ne disent rien.

Les règles qui font consensus :

  • une ligne de titre courte, autour de 50 caractères, 72 au maximum ;
  • à l'impératif ou à l'infinitif, comme une consigne : « Ajoute le filtre par date », « Corriger le calcul du plafond ». Choisis l'un des deux et tiens-toi-y dans tout le projet ;
  • ce que fait le commit, pas ce que tu as fait : « Corrige l'arrondi des indemnités kilométriques » plutôt que « J'ai regardé le bug » ;
  • si le titre ne suffit pas, une ligne vide puis un corps qui explique pourquoi : la cause du bug, le choix fait, le numéro du ticket.
Mauvais messageBon message
fixCorrige le total des frais quand une ligne est vide
modif READMEDocumente l'installation de la base de test
wipAjoute la route GET /notes avec pagination
ajout de trucs + correction bug + cssTrois commits, un par sujet

Pour un message avec un corps, lance git commit sans -m : ton éditeur s'ouvre. Ou enchaîne plusieurs -m, chacun devient un paragraphe :

bash
git commit -m "Corrige l'arrondi des indemnités kilométriques" -m "Le calcul arrondissait chaque trajet avant la somme. On arrondit maintenant le total, comme l'exige le barème. Ticket #14."

Beaucoup d'équipes ajoutent un préfixe qui donne la nature du changement, selon la convention Conventional Commits : feat:, fix:, docs:. Le chapitre 10 la présente.

git log : relire l'historique

bash
echo "console.log('API Sorbier Frais')" > app.js
git add app.js
git commit -m "Ajoute le point d'entrée de l'API"
git log
text
commit 0f0c3b3a6d2c41f1b5e7a8c9d0e1f2a3b4c5d6e7 (HEAD -> main)
Author: Lina Morel <lina.morel@example.com>
Date:   Mon Oct 12 14:03:27 2026 +0200

    Ajoute le point d'entrée de l'API

commit 24b02c7e9f8a7b6c5d4e3f2a1b0c9d8e7f6a5b4c
Author: Lina Morel <lina.morel@example.com>
Date:   Mon Oct 12 13:58:02 2026 +0200

    Initialise le projet

Les commits sont listés du plus récent au plus ancien. (HEAD -> main) signifie que tu es sur la branche main et que ce commit est son dernier. Si l'historique dépasse l'écran, Git l'affiche page par page : Espace pour avancer, q pour quitter.

Les variantes utiles :

CommandeCe qu'elle affiche
git log --onelineUn commit par ligne : empreinte courte et titre
git log --oneline --graph --allToutes les branches, avec le dessin des fusions
git log -5Les 5 derniers commits
git log --statLes fichiers modifiés par chaque commit, avec le nombre de lignes
git log -p fichierLe détail de chaque modification de ce fichier
git log --author="Hugo"Les commits d'un auteur
git log --since="2 weeks ago"Les commits des deux dernières semaines
git log --grep="plafond"Les commits dont le message contient ce mot
git log -S "plafond"Les commits qui ont ajouté ou retiré ce texte dans le code
bash
git log --oneline
text
0f0c3b3 Ajoute le point d'entrée de l'API
24b02c7 Initialise le projet

Pour voir le contenu exact d'un commit, son message et ses lignes modifiées : git show 0f0c3b3. Sans argument, git show affiche le dernier commit.

git blame : qui a modifié cette ligne ?

git blame affiche, pour chaque ligne d'un fichier, le commit qui l'a écrite en dernier : empreinte courte, auteur et date.

bash
git blame app.js
git blame -L 10,20 app.js    # seulement les lignes 10 à 20

Sur GitHub, le bouton Blame d'un fichier donne la même vue. C'est le point de départ pour comprendre pourquoi une ligne a changé : copie l'empreinte, puis git show <empreinte> affiche le commit entier et son message.

HEAD, HEAD~1 et les références

Tu désignes un commit de plusieurs façons :

RéférenceDésigne
0f0c3b3Le commit dont l'empreinte commence par ces caractères
mainLe dernier commit de la branche main
HEADLe commit sur lequel tu te trouves
HEAD~1 ou HEAD~Le parent de HEAD, un commit avant
HEAD~3Trois commits avant HEAD
v1.0Le commit marqué par l'étiquette v1.0 (chapitre 11)

Ces références servent partout : git show HEAD~1, git diff HEAD~2 HEAD, git reset --soft HEAD~1.

git diff : voir ce qui a changé

bash
echo "// TODO : brancher la base" >> app.js
git diff
text
diff --git a/app.js b/app.js
index fbc902d..1fd1ef4 100644
--- a/app.js
+++ b/app.js
@@ -1 +1,2 @@
 console.log('API Sorbier Frais')
+// TODO : brancher la base

Les lignes qui commencent par + sont ajoutées, celles qui commencent par - sont supprimées, les autres servent de contexte. La ligne @@ -1 +1,2 @@ indique la zone : la ligne 1 de l'ancienne version devient les lignes 1 à 2 de la nouvelle.

Le piège : git diff sans option compare le répertoire de travail à la zone de préparation. Une fois tes fichiers préparés, il n'affiche plus rien.

CommandeCompare
git diffRépertoire de travail et zone de préparation : ce que tu n'as pas encore préparé
git diff --stagedZone de préparation et dernier commit : ce qui partira au prochain commit
git diff HEADRépertoire de travail et dernier commit : tout ce qui a changé
git diff main feature/exportDeux branches
git diff HEAD~2 HEAD -- app.jsUn fichier entre deux commits

Déplacer, renommer et supprimer des fichiers

Si tu supprimes ou renommes un fichier avec l'explorateur, Git le voit comme une suppression et un nouveau fichier non suivi : tu dois préparer les deux. Les commandes Git font les deux en une fois :

CommandeEffet
git rm fichierSupprime le fichier du disque et prépare la suppression
git rm --cached fichierArrête de suivre le fichier sans le supprimer du disque (chapitre 3)
git mv ancien nouveauRenomme ou déplace le fichier et prépare le changement

Git ne stocke pas les renommages : il les déduit en comparant les contenus. git log --follow fichier suit l'historique d'un fichier à travers ses renommages.

Le cycle de tous les jours

En pratique, ta journée ressemble à ceci :

bash
git status                    # où en suis-je ?
# ... tu modifies tes fichiers ...
git diff                      # qu'est-ce que j'ai changé ?
git add -p                    # je prépare ce qui va ensemble
git diff --staged             # je relis ce qui va partir
git commit -m "Ajoute la validation du montant"
git log --oneline -5          # mon historique raconte mon travail

Commite souvent : un commit par étape qui fonctionne, pas un commit par jour. Un petit commit se relit, se comprend et s'annule facilement ; un commit de 40 fichiers « fin de journée » ne s'annule qu'en bloc. À l'E6, un historique de petits commits clairs montre ta démarche à la commission.

Exercices

Exercice 1 sur 4 Lire git status Réussi À revoir

Voici la sortie de git status dans le dépôt de Hugo :

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   src/Formulaire.jsx

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   src/App.jsx
	modified:   src/Formulaire.jsx

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	src/Export.jsx
  1. Si Hugo lance git commit -m "…" maintenant, quels fichiers et quelles modifications partent dans le commit ?
  2. Pourquoi src/Formulaire.jsx apparaît-il deux fois ?
  3. Quelle commande prépare tout, y compris Export.jsx ?
  4. Que fait git commit -a -m "…" ici ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. Seule la version de src/Formulaire.jsx telle qu'elle était au moment du git add. Ni App.jsx, ni Export.jsx, ni les modifications faites dans Formulaire.jsx après le git add ne partent.
  2. Hugo a préparé Formulaire.jsx, puis l'a de nouveau modifié. La zone de préparation garde la version du git add ; la nouvelle modification n'est pas préparée.
  3. git add -A (ou git add . depuis la racine du dépôt).
  4. -a prépare les fichiers déjà suivis et modifiés, donc App.jsx et la dernière version de Formulaire.jsx, puis commite. Export.jsx, non suivi, reste en dehors du commit.

Tu avais trouvé ?

Exercice 2 sur 4 Composer deux commits Réussi À revoir

Tu as modifié app.js (une correction de bug) et README.md (la documentation d'une nouvelle route), et créé routes/notes.js (la nouvelle route). Écris la suite de commandes qui produit deux commits : d'abord la correction de bug seule, puis la nouvelle route avec sa documentation. Donne des messages clairs.

Voir la réponseMasquer la réponse de l'exercice 2
bash
git add app.js
git commit -m "Corrige le total des frais quand une ligne est vide"
git add routes/notes.js README.md
git commit -m "Ajoute la route GET /notes et sa documentation"

Vérifie entre les deux avec git status : après le premier commit, README.md doit apparaître comme modifié et routes/notes.js comme non suivi.

Tu avais trouvé ?

Exercice 3 sur 4 Quel diff ? Réussi À revoir

Tu as modifié app.js, puis lancé git add app.js. Tu tapes git diff et rien ne s'affiche.

  1. Pourquoi ?
  2. Quelle commande montre la modification ?
  3. Tu modifies encore app.js. Qu'affichent maintenant git diff, git diff --staged et git diff HEAD ?
Voir la réponseMasquer la réponse de l'exercice 3
  1. git diff compare le répertoire de travail à la zone de préparation. Les deux sont identiques puisque tout a été préparé.
  2. git diff --staged, qui compare la zone de préparation au dernier commit.
  3. git diff montre la nouvelle modification seule (pas encore préparée). git diff --staged montre la première modification seule (celle qui est préparée). git diff HEAD montre les deux réunies, car il compare le répertoire de travail au dernier commit.

Tu avais trouvé ?

Exercice 4 sur 4 Réécrire des messages Réussi À revoir

Réécris ces messages de commit pour qu'ils décrivent le changement. Invente un changement plausible pour chacun.

  1. maj
  2. j'ai corrigé le bug de Hugo
  3. final
  4. ajout login + fix css + suppression ancien code
Voir la réponseMasquer la réponse de l'exercice 4

Plusieurs réponses sont possibles ; ce qui compte, c'est un verbe d'action, un objet précis et un seul sujet par commit.

  1. Met à jour Express en version 5.1
  2. Corrige la date affichée dans la liste des notes (fuseau horaire)
  3. Prépare la version 1.0 : numéro de version et CHANGELOG
  4. Trois commits : Ajoute la page de connexion, Corrige le débordement du menu sur mobile, Supprime l'ancien module d'export.

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Le fichier .gitignore et les secretsRevoir le sommaire du cours