← Sommaire SkyLinux

Leçon 29 : Git - Gestion de version

Dans cette leçon, tu vas découvrir Git, l'outil de gestion de version le plus utilisé au monde. Git permet de suivre les modifications de tes fichiers, de collaborer avec d'autres et de revenir à des versions précédentes. Que tu codes seul ou en équipe, Git est indispensable.


1. Pourquoi un outil de gestion de versions ?

Voici ce qui se passe sans Git :

Tu modifies script.sh

→ Tu ajoutes une fonctionnalité

→ Ça casse tout

→ Tu n'as plus la version qui marchait

→ Panique

**Avec Git**, chaque modification est enregistrée. Tu peux revenir à n'importe quel moment, voir exactement ce qui a changé, et travailler avec d'autres personnes sans écraser leur travail.



14. Qu'est-ce que Git ?

**Git** est un système de gestion de version distribué. Il enregistre les modifications de tes fichiers dans un historique et te permet de :

**Concepts de base :**


14. Installation et configuration

Installation

# Ubuntu / Debian

sudo apt update

sudo apt install git

# Vérifier l'installation

git --version

Configuration initiale

Avant ta première utilisation, configure ton identité :

# Ton nom (remplace par ton vrai nom)

git config --global user.name "Ton Nom"

# Ton email (utilise le même que sur GitHub/GitLab)

git config --global user.email "ton.email@example.com"

# Vérifier ta configuration

git config --list

Configuration de l'éditeur

# Par défaut, Git utilise Vim. Tu peux changer :

git config --global core.editor nano

# couleur dans le terminal

git config --global color.ui auto


14. Créer un dépôt Git

git init - Initialiser un nouveau dépôt

# Créer un nouveau projet

mkdir mon-projet

cd mon-projet

# Initialiser Git

git init

Résultat :

Initialized empty Git repository in /home/david/mon-projet/.git/

Un dossier .git/ a été créé. C'est le cœur de Git — il contient tout l'historique.

git clone - Cloner un dépôt existant

Si tu veux travailler sur un projet existant (sur GitHub par exemple) :

# Cloner un dépôt public

git clone https://github.com/someuser/some-repo.git

# Cloner dans un dossier spécifique

git clone https://github.com/someuser/some-repo.git mon-dossier


14. Les états d'un fichier

Dans Git, chaque fichier peut être dans l'un de ces états :

ÉtatDescription
**Modified**Fichier modifié mais pas encore indexé
**Staged**Fichier indexé, prêt à être commité
**Committed**Fichier enregistré dans l'historique

┌──────────────┐ edit ┌──────────────┐ add ┌──────────────┐ commit ┌──────────────┐

│ Untracked │ ─────────► │ Modified │ ───────► │ Staged │ ─────────► │ Committed │

│ (non suivi) │ │ (modifié) │ │ (indexé) │ │ (enregistré)│

└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘


14. Les commandes de base

git status - État du dépôt

git status

Affiche quels fichiers sont modifiés, stagés ou commité.

On branch master

Changes not staged for commit:

modified: readme.txt

Untracked files:

nouveau.txt

git add - Indexer un fichier

# Indexer un fichier précis

git add readme.txt

# Indexer tous les fichiers modifiés

git add .

# Indexer tous les fichiers

git add -A

git commit - Enregistrer les modifications

# Commiter avec un message (OBLIGATOIRE)

git commit -m "Ajout du fichier readme"

# Indexer ET commiter en une commande

git commit -am "Correction d'un bug"

⚠️ L'option -am ne fonctionne que pour les fichiers déjà suivis. Les nouveaux fichiers doivent être ajoutés avec git add d'abord.


14. L'historique des commits

git log - Voir l'historique

# Voir l'historique complet

git log

# Affichage condensé sur une ligne

git log --oneline

# Voir les 5 derniers commits

git log -5

# Affichage avec graphe des branches

git log --oneline --all --graph

Exemple de sortie --oneline :

a1b2c3d Fix navigation bug

e4f5g6h Add user profile page

i7j8k9l Initial commit

Chaque commit a un identifiant court (ex: a1b2c3d).

git show - Détails d'un commit

# Voir les détails d'un commit

git show a1b2c3d

# Voir seulement le message

git log -1 --format="%B" a1b2c3d


14. Les branches

Les branches permettent de travailler sur des fonctionnalités isolées sans perturber le code principal.

git branch - Lister et créer des branches

# Lister les branches (celle avec * est la branche active)

git branch

# Créer une nouvelle branche

git branch ma-fonctionnalite

# Créer et basculer sur la nouvelle branche

git checkout -b ma-fonctionnalite

# Raccourci moderne (Git 2.23+)

git switch -c ma-fonctionnalite

git checkout / git switch - Changer de branche

# Basculer sur une branche existante

git checkout master

git switch master

# Revenir à la branche principale (souvent master ou main)

git merge - Fusionner des branches

# 1. Basculer sur la branche principale

git checkout master

# 2. Fusionner la branche secondaire

git merge ma-fonctionnalite

git branch -d - Supprimer une branche

# Supprimer une branche (après fusion)

git branch -d ma-fonctionnalite

# Supprimer de force (même si pas fusionnée)

git branch -D ma-fonctionnalite


14. Annuler des modifications

git checkout - Annuler les modifications non commitées

# Annuler les modifications d'un fichier

git checkout -- fichier.txt

# Syntaxe moderne

git restore fichier.txt

git reset - Annuler l'indexation

# Retirer un fichier de l'index (sans supprimer les modifications)

git reset fichier.txt

# Retirer TOUT de l'index

git reset

git revert - Annuler un commit (en créant un nouveau commit)

# Annuler le dernier commit (crée un nouveau commit)

git revert HEAD

# Annuler un commit spécifique

git revert a1b2c3d

💡 git revert est **sûr** car il ne réécrit pas l'historique. Il crée un nouveau commit qui "défait" les modifications.

git reset - Revenir à un commit précédent

# Revenir au dernier commit (garde les modifications staged)

git reset --soft HEAD~1

# Revenir au dernier commit (garde les modifications, enlève du staging)

git reset --mixed HEAD~1

# Revenir au dernier commit (SUPPRIME les modifications !)

git reset --hard HEAD~1

⚠️ --hard est dangereux : il supprime définitivement les modifications. Utilise-le avec prudence.


14. Travailler avec un remote (GitHub/GitLab)

git remote - Gérer les dépôts distants

# Voir les dépôts distants

git remote -v

# Ajouter un remote

git remote add origin https://github.com/user/repo.git

# Renommer le remote

git remote rename origin github

# Supprimer un remote

git remote remove origin

git push - Envoyer sur le remote

# Envoyer la branche master sur origin

git push origin master

# Raccourci (si origin et master sont les valeurs par défaut)

git push

# Premier push avec création de la branche distante

git push -u origin ma-branche

git pull - Récupérer les modifications

# Récupérer et fusionner les modifications distantes

git pull

# Récupérer sans fusionner (voir ce qui va changer)

git fetch

git fetch vs git pull

CommandeRécupèreFusionne
git fetch
git pull

fetch te permet de voir ce qui a changé avant de fusionner.


14. Ignorer des fichiers (.gitignore)

Le fichier .gitignore indique à Git quels fichiers ne doivent pas être suivis.

Créer un .gitignore

nano .gitignore

Exemple de .gitignore classique

```gitignore

# Fichiers temporaires

*.tmp

*.log

# Dossiers de cache

__pycache__/

*.pyc

node_modules/

# Fichiers secrets

.env

*.pem

# OS

.DS_Store

Thumbs.db

### Cas d'usage : Python
gitignore

# Byte-compiled / optimized / DLL files

__pycache__/

*.py[cod]

*$py.class

# Virtual environments

venv/

env/

.env

# IDE

.vscode/

.idea/

# Logs

*.log

### Cas d'usage : Node.js
gitignore

node_modules/

package-lock.json

.env

dist/

build/

---

8. Commandes utiles du quotidien

bash

# État du dépôt

git status # quoi de modifié

git diff # détails des changements

git log --oneline # historique concis

# Ajouter et valider

git add fichier.txt # indexer un fichier précis

git add . # indexer TOUS les fichiers modifiés

git commit -m "Message" # valider avec message

# Branches

git branch # lister les branches

git checkout -b nom # créer et basculer

git checkout master # revenir à master

git merge branche # fusionner une branche

# Synchronisation

git clone url # télécharger un dépôt

git push origin master # envoyer sur le serveur

git pull origin master # récupérer du serveur

---


14. Résumé des commandes

CommandeDescription
git initCréer un nouveau dépôt
git clone urlCloner un dépôt existant
git statusVoir l'état du dépôt
git add fichierIndexer un fichier
git commit -m "msg"Enregistrer les modifications
git logVoir l'historique
git log --onelineHistorique condensé
git branchLister les branches
git branch nomCréer une branche
git checkout brancheBasculer sur une branche
git switch brancheBasculer (syntaxe moderne)
git merge brancheFusionner une branche
git pushEnvoyer sur le remote
git pullRécupérer depuis le remote
git fetchRécupérer sans fusionner
git restore fichierAnnuler les modifications
git revert commitAnnuler un commit
git reset --hardRevenir à un commit (⚠️ destructif)

14. Exercice pratique

Exercice : Ton premier projet Git

**Objectif** : Créer un projet avec Git, faire des modifications et les pousser sur GitHub.

**Étape 1 : Création du projet**

bash

mkdir projet-test

cd projet-test

git init

git config user.name "Ton Nom"

git config user.email "ton.email@example.com"

**Étape 2 : Premier commit**
bash

echo "# Mon Projet" > README.md

git add README.md

git commit -m "Premier commit : ajout du README"

**Étape 3 : Modifier et suivre les changements**
bash

# Modifier le README

echo "Description de mon projet" >> README.md

# Vérifier l'état

git status

# Indexer et commiter

git add .

git commit -m "Ajout de la description"

**Étape 4 : Voir l'historique**
bash

git log --oneline

**Étape 5 : Créer une branche**
bash

# Créer une branche pour une fonctionnalité

git checkout -b feature-calculatrice

# Ajouter un fichier

echo "print('Calculatrice')" > calculatrice.py

git add .

git commit -m "Ajout de la calculatrice"

# Revenir sur master

git checkout master

**Étape 6 : Simuler un conflit de fusion**
bash

# Merger la feature sur master

git merge feature-calculatrice

**Étape 7 : Annuler une erreur (optionnel)**
bash

# Si tu veux revenir au dernier commit propre

git log --oneline

# Note le hash du commit propre

git reset --hard HEAD~1

✅ Tu connais maintenant les bases de Git !


15. Bonnes pratiques

  • **Commits atomiques** : un commit = une modification logique
  • **Messages de commit clairs** : décris ce qui a changé, pas comment
  • **Braches courtes** : fusionne fréquemment pour éviter les conflits
  • **.gitignore** : configure-le dès le début du projet
  • **Ne jamais commiter de secrets** : utilise les variables d'environnement

Format de message de commit recommandé

type: Description courte (max 50 caractères)

Explication plus détaillée si nécessaire.

Décompose en plusieurs lignes si le contexte est important.

Liens: #12, #15

Types courants : feat, fix, docs, style, refactor, test, chore

Exemples de bons messages

feat: Ajout de la connexion utilisateur

fix: Correction du bug de navigation sur mobile

docs: Mise à jour du README avec installation

refactor: Simplification de la logique d'authentification

```