TP1re année17 livrablesQuiz corrigé
Git & GitHub : versionner ton portfolio
« J'ai tout cassé et je ne peux plus revenir en arrière. » Plus jamais. Git enregistre l'histoire de ton code ; GitHub la met en sécurité en ligne. Outil n°1 de tout développeur — tu l'apprends sur ton portfolio.
Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .
- Objectif
- versionner ton portfolio avec Git (commits, historique) et le sauvegarder en ligne sur GitHub
- On manipule
- Git en ligne de commande + un compte GitHub, sur ton projet portfolio
- Pré-requis
- savoir utiliser le terminal et avoir un projet portfolio (HTML/CSS)
- Pour qui
- SLAM et SISR, 1re année
- Durée
- environ 3 h
Compétences : C1.4 Travailler en mode projet, C2.2 Assurer la maintenance corrective ou évolutive d'une application
Git est le filet de sécurité du dev : avec lui, on peut tout essayer et toujours revenir en arrière.
Avant de commencer
Pourquoi Git va changer ta vie de dev
Sans Git, sauvegarder = faire des copies portfolio-final, portfolio-final-2, portfolio-VRAIMENT-final… le cauchemar. Avec Git, tu enregistres des versions de ton projet : tu peux voir l'historique, comparer, et revenir à n'importe quel état. Et avec GitHub, tout est sauvegardé en ligne et partageable. C'est l'outil que tous les développeurs utilisent, tous les jours — et un vrai plus pour ton portfolio.
Ce que tu sauras faire à la fin
| Geste | Tu sauras… |
|---|---|
| Versionner | enregistrer des versions de ton projet (commits) |
| L'historique | voir, comparer, revenir à une version |
| GitHub | créer un dépôt en ligne, t'authentifier et y envoyer ton code |
| Récupérer | cloner un dépôt existant, savoir ce que fait pull |
| Sécuriser | ne plus jamais perdre ton travail |
0. C'est quoi « versionner » ?
Versionner, c'est enregistrer des points de sauvegarde de ton projet au fil du temps. Chaque sauvegarde (un commit) garde l'état complet de tes fichiers à ce moment-là, avec un message qui décrit ce que tu as fait.
| Mot | Définition |
|---|---|
| Git | le logiciel qui gère les versions de ton code (sur ta machine) |
| Dépôt (repo) | un projet suivi par Git |
| Commit | une version enregistrée (un point de sauvegarde) |
| GitHub | un site qui héberge tes dépôts en ligne |
Flag A1
Checkpoint
Avec tes mots : qu'est-ce qu'un commit, et pourquoi versionner vaut mieux que faire des copies projet-final-2-bis ?
Rends : ta réponse (2-3 phrases).
1. Installer & configurer Git
Étape 1 — Vérifier que Git est là
git --version
git version 2.43.0
Étape 2 — Te présenter à Git (une seule fois)
Git marque chaque commit avec ton nom et ton email. On les règle une fois pour toutes :
git config --global user.name "Marc Dupont"
git config --global user.email "marc@exemple.fr"
Étape 3 — Relire ce que tu as réglé
git config --global user.name
git config --global user.email
Marc Dupont
marc@exemple.fr
Étape 4 — Régler le nom de branche par défaut (évite un piège courant)
Avant Git 2.28 (sorti juillet 2020), la branche créée par git init s'appelait master. Depuis, Git laisse le choix — mais si le réglage n'est pas fait, il affiche un avertissement à chaque git init. GitHub utilise main par défaut depuis octobre 2020. Pour éviter tout conflit :
git config --global init.defaultBranch main
Flag B1
Production
Vérifie ta version de Git, puis configure ton nom et ton email.
Rends : ta version de Git et la sortie des deux git config de relecture (Étape 3).
2. Initialiser un dépôt
On transforme le dossier de ton portfolio en dépôt Git.
cd ~/mon-site
git init
Initialized empty Git repository in /home/marc/mon-site/.git/
Vérifier que le dossier .git existe
ls -a
. .. .git index.html style.css
Flag B2
Production
Initialise un dépôt Git dans ton dossier portfolio, puis prouve que .git existe.
Rends : la commande, le message de confirmation, et la sortie de ls -a.
3. Les 3 zones de Git
Git ne te fait pas passer directement de « j'écris du code » à « c'est enregistré ». Il y a une étape intermédiaire, et c'est le truc qui déroute tous les débutants. Comprends ça maintenant, et tout le reste devient simple.
| Zone | C'est… | On y va avec |
|---|---|---|
| Répertoire de travail | tes fichiers, tels que tu les modifies | (tu édites) |
| Zone de transit (staging / index) | le « panier » des changements que tu t'apprêtes à enregistrer | git add |
| Dépôt local (.git) | l'historique gravé de tes commits | git commit |
| Dépôt distant (GitHub) | la copie en ligne | git push |
Vert = on avance (add → commit → push). Violet = on récupère / on revient en arrière (restore, pull).
Flag A2
Checkpoint
Cite les 3 zones côté local (travail, transit, dépôt) et la commande qui fait passer de l'une à l'autre. À quoi sert la zone de transit ?
Rends : ta réponse.
4. Le cycle : add → commit
Maintenant que tu connais les zones, enregistrer une version est limpide : on met dans le panier (add), puis on grave (commit).
Étape 1 — Voir ce qui a changé
git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
style.css
nothing added to commit but untracked files present
Étape 2 — Mettre dans le panier (add)
git add .
Étape 3 — Vérifier le panier
git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: index.html
new file: style.css
Étape 4 — Graver (commit)
git commit -m "Première version de mon portfolio"
[main (root-commit) a1b2c3d] Première version de mon portfolio
2 files changed, 40 insertions(+)
Étape 5 (bonus) — Inspecter le panier avant de graver
Une fois git add fait, tu peux relire une dernière fois ce qui va entrer dans le commit :
git diff --staged
| Commande | Compare quoi avec quoi | Quand l'utiliser |
|---|---|---|
git diff | répertoire de travail ↔ panier | avant git add : voir ce que j'ai modifié |
git diff --staged | panier ↔ dernier commit (HEAD) | après git add : vérifier ce qui va entrer dans le commit |
git diff HEAD | répertoire de travail + panier ↔ dernier commit | vue globale : tout ce qui a changé depuis le commit |
Flag B3
Production (ton premier commit)
Fais ton premier commit : git status → git add . → git status → git commit -m "…".
Rends : ton message de commit et la ligne de confirmation (avec l'identifiant du commit).
5. Écrire un bon message de commit
Un message de commit, ce n'est pas une formalité : c'est ce que toi dans 3 semaines (ou un recruteur) liras pour comprendre ton historique. Un bon message dit ce que fait le commit, en clair.
| Mauvais | Bon |
|---|---|
truc | Ajoute la section « Projets » |
modif | Corrige le menu qui débordait sur mobile |
fichiers | Met en place la palette de couleurs violette |
aaaa | Ajoute mon CV en PDF dans la page contact |
Flag B4
Production
Voici 3 mauvais messages : "j'ai changé des trucs", "fix", "page".
Réécris-les en bons messages (impératif, clairs), en imaginant un changement plausible pour chacun.
Rends : tes 3 réécritures.
6. L'historique & un 2e commit
Voir l'historique
git log --oneline
a1b2c3d Première version de mon portfolio
git show a1b2c3d
Variantes utiles de git log
| Commande | Ce qu'elle affiche | Quand l'utiliser |
|---|---|---|
git log --oneline | 1 commit par ligne (SHA court + message) | vue rapide de l'historique |
git log --oneline --graph | idem + arbre des branches en ASCII | visualiser les fusions de branches |
git log --stat | chaque commit + liste des fichiers modifiés + nb de lignes | mesurer l'ampleur d'un commit |
git log -3 | seulement les 3 derniers commits | se concentrer sur le récent |
git log --author="Marc" | seulement les commits de cet auteur | en projet d'équipe |
git show SHA | contenu complet (diff) d'un commit précis | inspecter ce qu'a changé un commit |
Modifier, puis enregistrer à nouveau
Change quelque chose dans ta page (ajoute une section, une couleur). Avant d'ajouter, regarde ce que tu as modifié :
git diff
diff --git a/index.html b/index.html
@@ -10,6 +10,9 @@
<h1>Mon portfolio</h1>
+ <section id="projets">
+ <h2>Mes projets</h2>
+ </section>
Puis le cycle habituel :
git add .
git commit -m "Ajoute la section projets"
e4f5g6h Ajoute la section projets
a1b2c3d Première version de mon portfolio
Flag B5
Production
Modifie ta page, regarde le git diff, fais un 2e commit avec un bon message, puis affiche l'historique.
Rends : la sortie de git log --oneline (tes 2 messages doivent apparaître).
7. Ignorer des fichiers (.gitignore)
Certains fichiers ne doivent jamais être versionnés : fichiers temporaires du système, dépendances lourdes (réinstallables), et surtout les secrets (mots de passe, clés d'API). On les liste dans un fichier nommé exactement .gitignore, à la racine du dépôt.
Créer le .gitignore
echo "node_modules/" > .gitignore
echo ".DS_Store" >> .gitignore
echo "*.log" >> .gitignore
echo ".env" >> .gitignore
Que veulent dire ces lignes ?
| Ligne | Ignore… |
|---|---|
node_modules/ | le dossier des dépendances (le / final = c'est un dossier). Énorme et réinstallable avec npm install. |
.DS_Store | fichier système créé par macOS dans chaque dossier. Inutile et invisible. |
*.log | tous les fichiers finissant par .log (le * = « n'importe quoi »). |
.env | le fichier où l'on range les secrets (mots de passe, clés d'API). Jamais sur GitHub. |
Syntaxe des patterns .gitignore
| Patron | Effet | Exemple |
|---|---|---|
*.log | tous les fichiers portant cette extension | debug.log, error.log |
dossier/ | tout un dossier (et son contenu) | node_modules/, bin/ |
**/*.tmp | ** = n'importe quelle profondeur de dossiers | build/cache/x.tmp |
!important.log | ! = exception : ce fichier précis n'est PAS ignoré | ignorer *.log mais garder important.log |
secret.* | tous les fichiers nommés secret quelle que soit l'extension | secret.txt, secret.json |
#commentaire | ligne ignorée (commentaire humain) | # Dépendances |
Diagnostiquer pourquoi un fichier est ignoré (ou pas)
Situation courante : tu penses avoir ignoré un fichier, mais git status le propose encore — ou l'inverse, un fichier disparaît du suivi sans raison. Pour comprendre quelle règle s'applique :
git check-ignore -v .env
.gitignore:4:.env .env
Trois niveaux de .gitignore — lequel choisir ?
| Niveau | Fichier | Partagé avec l'équipe ? | Quand l'utiliser |
|---|---|---|---|
| Projet | .gitignore à la racine | Oui (versionné) | Règles propres au projet : node_modules/, *.log, .env |
| Local seulement | .git/info/exclude | Non (hors dépôt) | Fichiers perso sur ta machine uniquement, sans polluer le .gitignore partagé |
| Global machine | ~/.gitignore_global | Non (ta machine) | Fichiers liés à ton OS ou éditeur : .DS_Store, Thumbs.db, .idea/, *.swp |
Jamais de secrets dans Git
Le danger : un mot de passe ou une clé d'API commité — surtout sur un dépôt GitHub public — est une fuite grave.
Le piège : même si tu le supprimes après, il reste dans l'historique (rappelle-toi : Git garde tout). Des robots scannent GitHub en continu pour voler ces clés.
La règle : les secrets vont dans un fichier ignoré (.env), jamais dans un commit.
Flag A3
Checkpoint
Pourquoi ne veut-on pas versionner un fichier contenant un mot de passe ? Pourquoi le supprimer « après coup » ne suffit pas ? Comment l'empêcher dès le départ ?
Rends : ta réponse.
8. C'est quoi GitHub ?
Git vit sur ta machine. GitHub est un site web qui héberge tes dépôts en ligne : une copie de sécurité, accessible partout, et partageable. (Git ≠ GitHub : on peut utiliser Git tout seul, sans jamais aller en ligne. GitHub, c'est juste le coffre-fort distant le plus populaire — il en existe d'autres comme GitLab.)
Git (local) garde ton historique ; GitHub (en ligne) en garde une copie. On envoie avec push, on récupère avec pull.
À quoi ça sert, concrètement
Sauvegarde : si ton PC meurt, ton code est en ligne.
Portfolio public : les recruteurs regardent les profils GitHub.
Collaboration : travailler à plusieurs sur le même projet (séance « Git en équipe » plus tard).
GitHub vs les alternatives — quand choisir quoi
| Forge | Hébergement | Plan gratuit | CI/CD intégré | Point fort | Quand choisir |
|---|---|---|---|---|---|
| GitHub | Cloud (Microsoft) | Dépôts publics + privés illimités, Actions 2 000 min/mois | GitHub Actions | Communauté open-source n°1, Pages statiques gratuites, Copilot | Projet personnel, portfolio, open-source, équipe < 10 |
| GitLab | Cloud ou self-hosted | Dépôts illimités, 400 min CI/mois | GitLab CI/CD (intégré nativement) | DevOps complet dans un seul outil, hébergement privé en entreprise | Entreprise qui veut tout gérer en interne, pipeline CI/CD avancé |
| Bitbucket | Cloud (Atlassian) | 5 utilisateurs max, dépôts illimités | Bitbucket Pipelines (50 min/mois gratuit) | Intégration Jira/Confluence native | Équipe qui utilise déjà l'écosystème Atlassian (Jira, Confluence) |
| Forgejo / Gitea | Self-hosted uniquement | Gratuit (open-source) | Gitea Actions (compatible GitHub Actions) | Contrôle total, légèreté (< 100 Mo RAM) | Serveur perso ou labo, données confidentielles à ne jamais externaliser |
Pour le BTS SIO : GitHub est le standard
Les recruteurs et les jurys d'E5/E6 connaissent GitHub. Un profil GitHub actif (commits réguliers, README soignés, dépôt portfolio) est un vrai plus lors de la présentation E5. GitLab est courant en entreprise — tu le croiseras en stage.
Flag A4
Checkpoint
Quelle est la différence entre Git et GitHub ? Cite 2 avantages d'avoir son code sur GitHub.
Rends : ta réponse.
9. S'authentifier sur GitHub
C'est l'étape qui bloque tout le monde, alors on la traite à fond, avant d'essayer de pousser. Depuis 2021, GitHub n'accepte plus ton mot de passe de compte pour envoyer du code. Il faut prouver ton identité autrement. Choisis une des méthodes ci-dessous (la 1 est la plus simple).
Méthode 1 (recommandée) — GitHub CLI
L'outil officiel gh gère l'authentification pour toi, via ton navigateur.
gh auth login
expl.
gh — l'outil en ligne de commande officiel de GitHub (à installer : brew install gh, sudo apt install gh, ou sur Windows via l'installeur de cli.github.com).
auth login — lance la connexion. Réponds aux questions : choisis GitHub.com, protocole HTTPS, puis « Login with a web browser ».
! First copy your one-time code: ABCD-1234
Press Enter to open github.com in your browser...
✓ Authentication complete.
✓ Logged in as ton-pseudo
expl.
Tu copies le code à 8 caractères, tu le colles dans la page qui s'ouvre, tu valides — et c'est réglé pour toujours sur cette machine. gh configure Git pour utiliser cette connexion.
Méthode 2 — Jeton d'accès personnel (PAT)
Un Personal Access Token est un mot de passe spécial, long et généré par GitHub, que tu utilises à la place de ton mot de passe quand Git le demande.
Classic vs Fine-grained — lequel choisir ?
| Type | Chemin dans GitHub | Granularité | Expiration max | Quand l'utiliser |
|---|---|---|---|---|
| Classic | Developer settings → Tokens (classic) | Par portée globale (repo, read:org…) | 1 an (ou « No expiration » déconseillé) | Usage simple, projet perso, compatible avec tous les outils |
| Fine-grained | Developer settings → Fine-grained tokens | Par dépôt ET par permission précise | 1 an | Besoin de limiter l'accès à un seul dépôt (recommandé en entreprise) |
Pour le portfolio, un PAT classic avec la portée repo cochée suffit. Procédure :
- Sur github.com : ton avatar → Settings → tout en bas Developer settings.
- Personal access tokens → Tokens (classic) → Generate new token (classic).
- Donne-lui un nom évocateur (ex. « PC lycée »), une expiration de 90 jours, et coche uniquement la case repo (accès complet aux dépôts privés et publics).
- Clique Generate token et copie-le tout de suite (il ne sera plus jamais réaffiché — même GitHub ne le connaît que sous forme hachée).
expl.
Au prochain git push, quand Git demande Username mets ton pseudo, et pour Password colle le jeton (pas ton mot de passe de compte). Un jeton PAT ressemble à : ghp_A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7 — 40 caractères commençant par ghp_.
Mémorisation automatique : le credential helper
Tu ne veux pas retaper ton jeton à chaque push. Git peut le stocker via un credential helper :
| OS | Commande | Où le jeton est stocké |
|---|---|---|
| macOS | git config --global credential.helper osxkeychain | Trousseau macOS (chiffré) |
| Linux | git config --global credential.helper store | ~/.git-credentials en clair — suffisant sur un PC perso |
| Windows | git config --global credential.helper manager | Windows Credential Manager |
credential.helper store sur un PC partagé
store (Linux) enregistre le jeton en clair dans ~/.git-credentials. Sur un PC de lycée partagé, préfère gh auth login (méthode 1) qui chiffre les tokens dans le trousseau système.
Méthode 3 — VS Code
Si tu codes dans VS Code : clique sur l'icône compte (en bas à gauche) → Sign in to GitHub. VS Code ouvre le navigateur, tu autorises, et il gère l'authentification de Git automatiquement.
Comparaison des 3 méthodes
| Méthode | Complexité | Durée de vie | Quand choisir |
|---|---|---|---|
GitHub CLI (gh auth login) | Très simple (navigateur) | Permanente sur la machine | Recommandé : le plus simple, zéro copier-coller de token |
| PAT (jeton) | Moyen (générer + copier) | Expire (30/60/90 jours selon réglage) | Si gh n'est pas disponible (serveur, CI/CD) |
| VS Code | Simple (clic) | Permanente | Si VS Code est ton éditeur principal |
| SSH (clé RSA/ED25519) | Plus technique (générer une paire de clés) | Permanente | Pros et serveurs : plus rapide, pas de token à renouveler |
SSH existe
qu'est-ce que c'est ?
En plus de HTTPS, GitHub accepte le protocole SSH pour envoyer du code. Avec SSH, tu génères une paire de clés (publique + privée) sur ta machine (ssh-keygen -t ed25519), tu déposes la clé publique dans les réglages de ton compte GitHub, et à partir de là, Git s'authentifie automatiquement — sans mot de passe ni token. L'URL du dépôt prend alors la forme git@github.com:ton-pseudo/portfolio.git au lieu de https://github.com/....
Pour cette séance, HTTPS + gh auth login est largement suffisant. SSH sera vu en projet d'équipe.
Sécurité d'un PAT
Un PAT est un mot de passe de remplacement : qui le connaît peut agir sur tes dépôts. Règles impératives :
• Ne jamais coller un PAT dans un fichier commité — configure une durée d'expiration courte (30-90 jours).
• Si tu penses avoir exposé un PAT (GitHub public, email, Slack) → révoque-le immédiatement : Settings → Developer settings → Tokens → Delete.
• Un PAT révoqué est inoffensif en quelques secondes.
Erreur courante
le message exact à reconnaître
Symptôme :
remote: Support for password authentication was removed.
fatal: Authentication failed for 'https://github.com/...'
Cause : tu as tapé ton mot de passe de compte au lieu d'un jeton / d'une connexion moderne.
Solution : utilise une des 3 méthodes ci-dessus (le plus simple : gh auth login).
Flag D1
Investigation
Mets en place une méthode d'authentification. Explique en 2-3 phrases pourquoi GitHub n'accepte plus le simple mot de passe, et ce qu'est un PAT.
Rends : la méthode choisie + ton explication (ne colle évidemment jamais ton vrai jeton).
10. Créer un dépôt GitHub & le relier
Étape 1 — Créer le dépôt en ligne
- Sur github.com, clique le + en haut à droite → New repository.
- Nom :
portfolio. Laisse-le Public. - Ne coche PAS « Add a README », ni
.gitignore, ni licence : on a déjà des fichiers en local, et cocher créerait un commit côté GitHub qui entrerait en conflit (voir chapitre 11). - Clique Create repository.
GitHub affiche alors l'adresse du dépôt, du type https://github.com/ton-pseudo/portfolio.git.
Étape 2 — Relier ton dépôt local au dépôt distant
git remote add origin https://github.com/ton-pseudo/portfolio.git
git branch -M main
expl.
git remote add — enregistre une destination distante.
origin — le surnom qu'on donne à ce dépôt distant (par convention, le principal s'appelle origin).
l'URL — colle la tienne, celle affichée par GitHub.
git branch -M main — renomme ta branche principale en main (le nom standard aujourd'hui, et celui qu'attend GitHub).
Étape 3 — Vérifier le lien
git remote -v
expl.
git remote -v — liste les dépôts distants connus (-v = verbeux, affiche les URLs). Tu dois voir origin avec ton URL, en fetch et push.
origin https://github.com/ton-pseudo/portfolio.git (fetch)
origin https://github.com/ton-pseudo/portfolio.git (push)
Si « remote origin already exists »
Cause : tu as déjà fait un git remote add origin (peut-être avec une mauvaise URL).
Solution : corrige-la avec git remote set-url origin LA-BONNE-URL, puis revérifie avec git remote -v.
Flag B6
Production
Crée le dépôt portfolio sur GitHub et relie-le à ton dépôt local.
Rends : l'URL de ton dépôt et la sortie de git remote -v.
11. Envoyer ton code en ligne (push)
git push -u origin main
expl.
git push — envoie tes commits locaux vers le dépôt distant.
origin — vers le distant nommé origin.
main — la branche à envoyer.
-u — « upstream » : mémorise ce couple origin main. Après ça, un simple git push (sans rien d'autre) suffira.
Si tu as fait le chapitre 9, l'authentification passe toute seule. Sinon, Git te la demandera ici.
Enumerating objects: 4, done.
Writing objects: 100% (4/4), 1.20 KiB, done.
To https://github.com/ton-pseudo/portfolio.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
Recharge la page de ton dépôt sur github.com : tes fichiers y sont !
Erreur courante
push « rejected »
Symptôme :
! [rejected] main -> main (fetch first)
error: failed to push some refs ...
hint: Updates were rejected because the remote contains work that you do not have locally.
Cause : le dépôt GitHub contient des commits que ta machine n'a pas (typiquement : tu as coché « Add a README » à la création). Les deux histoires divergent ; Git refuse d'écraser.
Solution : récupère d'abord le distant, puis repousse :
git pull origin main --allow-unrelated-histories puis git push.
Comprendre fetch & pull (concept)
L'inverse de push, c'est récupérer ce qui est en ligne :
git fetch — télécharge les nouveautés du distant sans toucher à tes fichiers (juste « voir »).
git pull — fait fetch puis les intègre à ta branche. C'est ce que tu feras quand tu travailleras sur deux machines, ou à plusieurs : on pull avant de bosser, on push après.
Flag B7
Production (ton code en ligne)
Pousse ton portfolio sur GitHub.
Rends : l'URL publique de ton dépôt et confirme que tes commits y apparaissent (onglet « commits »).
12. Lire ton dépôt sur github.com & le README
Te repérer sur la page du dépôt
| Élément de la page | À quoi ça sert |
|---|---|
| Liste des fichiers | tes fichiers, tels que dans ton dernier commit poussé |
| Onglet Code | la vue principale (fichiers + README affiché dessous) |
| Lien commits (au-dessus des fichiers) | tout ton historique, comme git log mais en visuel |
| Bouton vert <> Code | donne l'URL à cloner (HTTPS / SSH) |
| Onglet Settings | réglages du dépôt (renommer, supprimer, visibilité) |
Ajouter un README.md
Le README.md est la vitrine de ton dépôt : GitHub l'affiche automatiquement sur la page d'accueil. C'est la première chose qu'un recruteur lit. Il est écrit en Markdown (.md) : un texte simple où quelques symboles donnent la mise en forme.
# Mon Portfolio
Site personnel présentant mon parcours et mes projets BTS SIO.
## Technologies
- HTML5
- CSS3
## Me contacter
[Mon profil GitHub](https://github.com/ton-pseudo)
expl.
# — un grand titre ; ## — un sous-titre (plus de # = plus petit).
- — un élément de liste à puces.
**texte** — du gras ; [libellé](url) — un lien cliquable.
Crée ce fichier nommé exactement README.md à la racine, puis versionne-le comme le reste :
git add README.md
git commit -m "Ajoute le README de présentation"
git push
expl.
Note le git push tout seul : grâce au -u du chapitre 11, plus besoin de préciser origin main. Recharge github.com : ton README s'affiche, joliment mis en forme, sous tes fichiers.
Flag B8
Production
Ajoute un README.md (titre, une description, une liste, un lien), commite-le et pousse-le.
Rends : l'URL du dépôt où l'on voit le README rendu.
13. Cloner un dépôt existant
Jusqu'ici tu es parti d'un dossier local. Le cas inverse est tout aussi courant : un dépôt existe déjà en ligne (le tien depuis un autre PC, celui d'un camarade, un projet open-source) et tu veux le récupérer entier sur ta machine. C'est cloner.
git clone https://github.com/ton-pseudo/portfolio.git
expl.
git clone — télécharge tout le dépôt (fichiers + historique complet) dans un nouveau dossier.
l'URL — celle du bouton vert <> Code sur la page GitHub.
Bonus : le clone configure déjà origin tout seul — pas besoin de git remote add.
Cloning into 'portfolio'...
remote: Enumerating objects: 8, done.
Receiving objects: 100% (8/8), done.
expl.
Un dossier portfolio/ apparaît, prêt à l'emploi. Tu fais cd portfolio, tu modifies, tu add/commit/push comme d'habitude.
init vs clone
ne pas confondre
git init : je démarre un dépôt à partir d'un dossier qui n'en a pas.
git clone : je copie un dépôt qui existe déjà en ligne.
On ne fait jamais les deux sur le même projet.
Flag D2
Investigation
Clone un dépôt public de ton choix (par ex. le tien depuis le dossier ~/Téléchargements, ou un petit projet open-source).
Rends : la commande git clone utilisée et la sortie de git log --oneline faite dans le dossier cloné (tu vois l'historique d'un projet que tu n'as pas écrit !).
14. Revenir en arrière
Le super-pouvoir de Git : annuler. Tu as cassé ta page ? Reviens à un état qui marchait.
Annuler des modifications non commitées
git restore index.html
expl.
git restore index.html — remet ce fichier dans l'état du dernier commit : il annule les modifications que tu n'as pas encore enregistrées. Ton point de sauvegarde te sauve.
Sortir un fichier du panier (sans perdre tes modifs)
git restore --staged index.html
expl.
--staged — retire le fichier de la zone de transit (annule un git add de trop), mais garde tes modifications dans le répertoire de travail. Utile quand tu as ajouté au panier par erreur.
Regarder une ancienne version
Avec git log --oneline, tu vois l'identifiant de chaque commit. On peut consulter le code d'un commit précis ou y revenir — on approfondira ce retour en arrière (et les branches) à la séance « Git en équipe ».
Attention
restore efface tes modifs non enregistrées
git restore fichier est définitif pour ce qui n'était pas commité : tes changements en cours sont perdus. Ne l'utilise que quand tu veux vraiment jeter ce que tu as fait depuis le dernier commit.
Pourquoi c'est libérateur
Avec Git, tu peux tout essayer sans peur : le pire qui puisse arriver, c'est de revenir au dernier commit qui marchait. Git est le vrai filet de sécurité quand toi (ou un outil) casse quelque chose.
git stash — mettre de côté sans commiter
Situation typique : tu bosses sur ta page, tu n'as pas fini (donc pas de commit propre à faire), mais tu dois récupérer le travail d'un camarade avec git pull — et Git refuse car tu as des modifications non commitées. Solution : ranger temporairement tes modifications dans une cachette.
git stash
expl.
git stash — met toutes tes modifications en cours (répertoire de travail + panier) dans une pile de côté, et remet ton dossier dans l'état du dernier commit. Ton code n'est pas perdu : il est juste rangé.
Saved working directory and index state WIP on main: a1b2c3d Première version
Après avoir fait ta manip (git pull, changé de branche, etc.), tu récupères ce que tu avais rangé :
git stash pop
expl.
git stash pop — sort la dernière entrée de la cachette et la réapplique sur ton code actuel. Tes modifications reprennent là où tu les avais laissées.
On branch main
Changes not staged for commit:
modified: index.html
Dropped refs/stash@{0}
| Commande | Effet |
|---|---|
git stash | range les modifications en cours (dossier propre) |
git stash list | affiche toutes les entrées rangées (numérotées stash@{0}, stash@{1}…) |
git stash pop | récupère la plus récente et la supprime de la cachette |
git stash drop | supprime la plus récente sans la récupérer |
Erreur courante
pull refusé à cause de modifications en cours
Symptôme :
error: Your local changes to the following files would be overwritten by merge:
index.html
Please commit your changes or stash them before you merge.
Cause : Git refuse de récupérer depuis GitHub car des modifications non commitées risquent d'être écrasées.
Solution : git stash, puis git pull, puis git stash pop.
Flag C1
Manipulation
Casse volontairement ta page (supprime des lignes), sans commiter. Vérifie le dégât avec git diff, puis restaure avec git restore.
Rends : ce que tu as cassé, la commande de restauration, et confirme que ta page est revenue intacte.
Chapitre 14 bis — Annuler un commit : revert vs reset
Deux commandes permettent d'annuler des commits, mais elles n'ont pas du tout le même effet. Confondre les deux est l'une des erreurs les plus dangereuses en Git professionnel.
git revert — annuler proprement (la méthode sûre)
git revert crée un nouveau commit qui fait l'inverse d'un commit précédent. L'historique reste intact — on ajoute, on n'efface pas.
git revert a1b2c3d
expl.
git revert — génère automatiquement un commit miroir : si le commit a1b2c3d avait ajouté 10 lignes, ce nouveau commit les supprime.
a1b2c3d — l'identifiant du commit à annuler (copié depuis git log --oneline).
Un éditeur de texte s'ouvre pour valider le message du commit de revert. Tape :q sous vim, ou ferme sous l'éditeur configuré.
[main f7a9b1c] Revert "Ajoute la section projets"
1 file changed, 3 deletions(-)
expl.
Résultat : l'historique montre maintenant deux commits — l'original et son revert. L'état de ta page revient à avant, mais l'historique reste complet. C'est la méthode à utiliser quand tu as déjà pushé.
git reset — réécrire l'historique (méthode locale seulement)
git reset déplace HEAD (et ta branche) vers un commit précédent. Il existe 3 modes :
| Mode | Commande | Commits annulés | Fichiers modifiés | Panier (staging) |
|---|---|---|---|---|
| --soft | git reset --soft HEAD~1 | oui | conservés dans le panier | gardé |
| --mixed (défaut) | git reset HEAD~1 | oui | conservés dans le répertoire | vidé |
| --hard | git reset --hard HEAD~1 | oui | perdus définitivement | vidé |
expl.
HEAD~1 — « un commit avant HEAD ». HEAD~2 = deux commits avant, etc. Tu peux aussi donner un SHA directement.
--soft : utile pour regrouper plusieurs petits commits en un seul (tu « défais » les commits mais gardes les fichiers modifiés dans le panier, prêts à être recommités).
--mixed : idem mais le panier est vidé (tu dois refaire git add).
--hard : revenir à un état propre en jetant tout ce qui a été fait depuis ce commit. Irréversible — les modifications perdues ne sont pas dans la corbeille.
Piège majeur
reset après push = danger
Situation : tu fais git reset --hard HEAD~1 puis git push.
Symptôme :
! [rejected] main -> main (non-fast-forward)
hint: Updates were rejected because the tip of your current branch is behind
Cause : ton historique local diverge de GitHub — tu as effacé un commit qui existe toujours en ligne.
La mauvaise solution (à ne faire que seul sur un projet) : git push --force — écrase GitHub avec ton historique réécrit. Si tu travailles à plusieurs, tu détruis le travail des autres.
La bonne solution : utilise git revert plutôt que git reset dès que tu as pushé.
Règle de décision
revert ou reset ?
Tu n'as pas encore pushé → git reset est possible (ton historique n'existe que sur ta machine).
Tu as déjà pushé → git revert toujours. Il crée un commit propre, visible, sans réécrire l'historique partagé.
Mnémo : revert = revenir avec une trace ; reset = effacer comme si ça n'avait jamais existé.
git reflog — la vraie bouée de sauvetage
Tu as fait git reset --hard et tu réalises que tu avais besoin de ces commits. Pas de panique : Git garde secrètement un journal de tous les déplacements de HEAD, pendant environ 30 jours (valeur de gc.reflogExpire). C'est le reflog.
git reflog
f7a9b1c (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
e4f5g6h HEAD@{1}: commit: Ajoute la section projets
a1b2c3d HEAD@{2}: commit (initial): Première version de mon portfolio
expl.
Le reflog montre tout ce que HEAD a visité, dans l'ordre inverse. Ici, avant le reset, HEAD était sur e4f5g6h (le commit « Ajoute la section projets »).
Pour récupérer ce commit perdu, il suffit d'y revenir :
git reset --hard e4f5g6h
expl.
Et voilà : ton commit est de retour, exactement dans l'état où il était. Le reflog est la raison pour laquelle un git reset --hard local n'est presque jamais une catastrophe définitive — tant que tu n'as pas attendu 30 jours.
--force vs --force-with-lease (le push forcé responsable)
Si tu dois absolument forcer un push (cas rare, jamais sur main partagé), préfère la version sécurisée :
| Commande | Ce qu'elle fait | Risque |
|---|---|---|
git push --force | Écrase GitHub avec ton historique local, sans vérification | Élimine les commits de tes coéquipiers s'ils ont pushé entre-temps |
git push --force-with-lease | Même chose, mais vérifie d'abord que GitHub n'a pas évolué depuis ton dernier fetch | Beaucoup plus sûr : refuse si quelqu'un a pushé depuis |
Règle d'or sur les branches partagées
Ne fais jamais git push --force (ni --force-with-lease) sur main d'un dépôt partagé. C'est la manière la plus rapide de détruire le travail de tes camarades et de te retrouver avec un historique impossible à réconcilier. En équipe, git revert est la seule option acceptable pour « annuler » un commit déjà pushé.
Flag A5
Checkpoint
Tu viens de pusher un commit qui introduit un bug. Dois-tu utiliser git revert ou git reset --hard ? Explique pourquoi l'autre option serait dangereuse dans ce contexte.
Rends : ton choix justifié (3-4 phrases).
15. Mini-projet : portfolio versionné & en ligne
La mission
- Ton portfolio est un dépôt Git (
git init+ config faite). - Au moins 3 commits avec des messages clairs à l'impératif (ex. « Met en place la base », « Ajoute la section projets », « Applique le thème violet »).
- Un
.gitignore(même minimal) versionné. - Un
README.mdde présentation, visible sur la page GitHub. - Le tout poussé sur GitHub, dépôt public, fichiers visibles en ligne.
- Tu sais montrer ton historique (
git log --oneline) et l'URL de ton dépôt.
Flag B9
Mini-projet (production)
Réalise le tout.
Rends : l'URL de ton dépôt GitHub, la sortie de git log --oneline (≥ 3 commits), et confirme que README + fichiers sont visibles en ligne. C'est une réalisation à mettre dans ton portfolio E5 !
Défis bonus
Bonus A : fais une modif depuis github.com directement (crayon « Edit » sur un fichier → commit en ligne), puis récupère-la en local avec git pull. Observe ce commit que tu n'as pas fait sur ta machine.
Bonus B : enrichis ton README avec une capture d'écran de ton site (Markdown image : ).
Bonus C : clone ton dépôt dans un autre dossier et vérifie que tout y est, historique compris.
Pour finir
Ton antisèche (le cycle Git)
| Je veux… | Commande |
|---|---|
| démarrer un dépôt | git init |
| copier un dépôt en ligne | git clone URL |
| voir l'état | git status |
| voir ce qui a changé (non stagé) | git diff |
| voir ce qui est dans le panier | git diff --staged |
| mettre dans le panier | git add . |
| enregistrer une version | git commit -m "message" |
| voir l'historique compact | git log --oneline |
| voir l'historique graphique | git log --oneline --graph |
| inspecter un commit précis | git show SHA |
| relier à GitHub | git remote add origin URL |
| envoyer en ligne | git push |
| récupérer en ligne | git pull |
| annuler des modifs (non commitées) | git restore fichier |
| ranger des modifs sans commiter | git stash |
| récupérer ce qui était rangé | git stash pop |
| annuler un commit (déjà pushé) | git revert SHA |
| enlever un fichier du suivi Git | git rm --cached fichier |
| s'authentifier sur GitHub | gh auth login |
Vérifie tes acquis
Exercice Réussi À revoir
- Qu'est-ce qu'un commit ?
- Cite les 3 zones locales de Git et la commande qui mène à chacune.
- Quelle est la différence entre
git addetgit commit? - Quelle est la différence entre Git et GitHub ?
- Pourquoi GitHub refuse-t-il ton mot de passe au push, et que faut-il à la place ?
- À quoi sert un
.gitignore? Donne un exemple de fichier à y mettre. - Quelle est la différence entre
git initetgit clone? - Comment annuler des modifications non commitées ?
- Que fait
git stashet quand l'utiliser ? - Quelle différence entre
git revertetgit reset --hard? Lequel est dangereux après un push ?
Voir le corrigéMasquer le corrigé de l'exercice
1. Un commit = une version enregistrée et datée de ton projet, avec un message et un identifiant SHA unique (40 chars hex).
2. Répertoire de travail (tu édites) → Zone de transit via git add → Dépôt local (.git) via git commit.
3. git add met les fichiers dans le panier (zone de transit). git commit grave définitivement le contenu du panier dans l'historique.
4. Git = logiciel sur ta machine qui gère les versions. GitHub = site web qui héberge tes dépôts en ligne (copie distante).
5. GitHub a supprimé l'auth par mot de passe en 2021 (trop facilement volé). Il faut un PAT (jeton) ou gh auth login ou SSH.
6. .gitignore liste les fichiers que Git doit ignorer : ex. .env (secrets), node_modules/ (lourd, réinstallable), *.log (fichiers temporaires).
7. git init = je démarre un dépôt à partir d'un dossier existant sur ma machine. git clone URL = je copie un dépôt existant depuis GitHub.
8. git restore fichier remet le fichier dans l'état du dernier commit (irréversible pour les modifications non commitées).
9. git stash range temporairement les modifications en cours sans commiter. On les récupère avec git stash pop après avoir fait la manip souhaitée (pull, changement de branche…).
10. git revert crée un nouveau commit qui annule un ancien (sûr, l'historique reste intact). git reset --hard efface des commits et les modifications (dangereux après un push car tu dois forcer un git push --force qui écrase GitHub).
Tu avais trouvé ?
Tu es bloqué ?
« Please tell me who you are » ? → fais le git config --global user.name/email (chapitre 1).
« Support for password authentication was removed » au push ? → il faut un jeton / une connexion moderne, pas ton mot de passe (chapitre 9).
Push « rejected / fetch first » ? → le distant a des commits que tu n'as pas : git pull origin main --allow-unrelated-histories puis git push (chapitre 11).
« nothing to commit » ? → tu n'as rien modifié, ou tu as oublié git add.
« remote origin already exists » ? → corrige l'URL avec git remote set-url origin URL (chapitre 10).
Pull refusé : « your local changes would be overwritten » ? → git stash, puis git pull, puis git stash pop (chapitre 14).
Un fichier ignoré est quand même suivi ? → il a déjà été commité — utilise git rm --cached fichier (chapitre 7).
Un mot incompris ? → glossaire ci-dessous.
Glossaire
| Mot | Définition |
|---|---|
| Git | logiciel de gestion de versions (sur ta machine) |
| GitHub | site qui héberge les dépôts Git en ligne |
| Dépôt (repo) | un projet suivi par Git |
| Commit | une version enregistrée, avec un message et un identifiant |
| Zone de transit (staging) | le panier des changements à enregistrer au prochain commit |
| add | mettre des changements dans le panier (staging) |
| push / pull | envoyer / récupérer les commits vers/depuis GitHub |
| clone | copier un dépôt en ligne (fichiers + historique) sur sa machine |
| PAT | jeton d'accès personnel : mot de passe spécial pour s'authentifier sur GitHub |
| .gitignore | la liste des fichiers que Git doit ignorer |
| README.md | fichier Markdown de présentation, affiché sur la page du dépôt |
| origin / main | le surnom du dépôt distant / la branche principale |
| HEAD | pointeur spécial vers le commit courant (« tu es ici ») |
| SHA / SHA-1 | identifiant unique d'un commit : 40 caractères hexadécimaux (affiché en 7 dans log --oneline) |
| git stash | rangement temporaire des modifications sans commit |
| git revert | crée un commit qui annule un commit précédent (sans réécrire l'historique) |
| git reset | déplace HEAD vers un commit précédent — peut effacer définitivement des modifications |
| git rm --cached | arrête de suivre un fichier dans Git sans le supprimer du disque |
| SSH | protocole d'authentification par paire de clés (alternative à HTTPS pour pousser sur GitHub) |
La prochaine fois
Ton portfolio est versionné et sur GitHub. On va le déployer en ligne avec Vercel : en quelques clics, il aura une vraie adresse web publique — prête à montrer au jury du BTS blanc.
Compétences mobilisées
référentiel BTS SIO SLAM
Bloc 1 · C1.4 Travailler en mode projet
→ Documenter les étapes et les résultats
→ Collaborer en équipe
Bloc 2 · C2.2 Assurer la maintenance corrective ou évolutive d'une solution applicative
→ Documenter les modifications et les évolutions réalisées