Guide Git : Bases et Bonnes Pratiques

par

dans

Git est un système de contrôle de version distribué. Il facilite la collaboration, le suivi des modifications et la traçabilité complète de toutes les versions d'un projet, et permet de gérer les livraisons de façon rigoureuse grâce aux tags et aux releases.

Sa gestion fine de l'historique — notamment le rebase interactif — contribue à produire un code plus propre. Un historique cohérent inspire confiance : il témoigne d'un code maîtrisé et de livrables de qualité.

Les commandes de base

git init             # Initialise un depot
git clone URL        # Clone un depot distant
git status           # Verifie l etat des fichiers
git add fichier      # Ajoute un fichier a l index
git commit -m "msg"  # Cree un commit
git log              # Affiche l historique

Les plus utiles au quotidien :

git commit --amend --no-edit          # corriger le dernier commit
git checkout -b release/x             # creer une branche et s y placer
git log --graph --decorate --oneline  # historique en graphe
git diff SHA^ SHA                     # voir un commit sous forme de patch
git cherry-pick SHA                   # rejouer un commit ailleurs

Ces commandes gagnent à être raccourcies par des alias dans la configuration Git :

co=checkout
can=commit --amend --no-edit
lk=log --graph --decorate --oneline
diffp=!f() { git diff "$1^" "$1"; }; f
cp=cherry-pick

Le cycle de vie d'un fichier

Depuis Vers Commande
répertoire de travail index git add
index dépôt local git commit
dépôt local dépôt distant git push
État Description
untracked fichier non suivi
staged fichier prêt à être commité
committed fichier enregistré dans l'historique

Les dépôts distants

git remote -v affiche la liste des dépôts distants, nom et URL — en général un seul, origin, en lecture et en écriture. On en ajoute un avec :

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

Un commit est une modification logique unique

Chaque commit possède un SHA-1 unique qui l'identifie dans l'historique. Pour partager un commit avec quelqu'un, on lui communique ce SHA et la branche — git checkout SHA est une commande valide.

Le principe d'atomicité

Un commit doit être indivisible et cohérent : une seule modification logique complète. Concrètement, il doit représenter une étape fonctionnelle autonome, qui peut être appliquée ou annulée sans casser le projet — les tests passent, le code compile, un plan d'infrastructure ne remonte pas d'erreur.

Si une modification touche plusieurs aspects indépendants — corriger un bug et reformater du code — il vaut mieux faire plusieurs commits séparés :

* 7f44b46 feat: ajout du formulaire de contact
* 5be4bae fix: corrige le bug d affichage sur mobile
* ad56a90 doc: met a jour le README
* 43007ad refactor: simplifie la fonction d authentification
* 971d4a7 chore: changement d URL d inscription

Organisés par branche, ces mêmes commits se lisent ainsi :

git lk release/20251110
* b6e8041 (HEAD -> release/20251110, origin/release/20251110) feat: ajout du formulaire de contact
* e3a437c refactor: simplifie la fonction d authentification
* d81b76f doc: met a jour le README
* 81ddefd (origin/feature/20251110) chore: changement d URL d inscription
* 1243ddd (origin/hotfix/20251110, origin/master) fix: corrige le bug d affichage sur mobile

Pourquoi l'atomicité compte

L'intégration continue devient fiable : un commit laisse toujours le projet dans un état stable.

L'historique se retravaille : on s'adapte à la feuille de route des livraisons en fonction des aléas du projet. Selon les besoins, on supprime les commits non retenus pour la mise en production, ou on regroupe les fonctionnalités livrées dans une même release. C'est sur ce point que Git apporte une réelle valeur ajoutée au travail quotidien.

La rigueur ne doit pas être compromise : sans elle, la gestion de l'historique est sapée et les équipes perdent confiance dans la qualité du livrable. Ce travail en amont fait gagner du temps sur le long terme.

Les branches

Branche Rôle
main branche stable, la production
develop branche principale de développement
feature/xxx nouvelle fonctionnalité
hotfix/xxx correction urgente
release/xxx prochaine livraison
git branch                           # Liste les branches
git checkout -b feature/ajout-login  # Cree une branche et s y place
git checkout main                    # Retourne sur la principale

Fusion ou rebase : deux façons de rapprocher deux branches

Prenons deux branches divergentes, X et Y.

La fusion conserve l'historique

git checkout release/next
git merge feature/xy --no-ff

Les commits X et Y conservent leur SHA d'origine, et un commit de fusion vient marquer la rencontre des deux branches.

Le rebase réécrit l'historique

git checkout feature/ajout-login
git rebase main

Les commits sont rejoués sur une autre base, ce qui produit un historique linéaire. X' et Y' correspondent à X et Y, avec un SHA différent — le contenu, lui, est normalement identique.

C'est ce « normalement » qui demande de la vigilance. Après tout rebase, il faut comparer l'avant et l'après, en général avant un git push --force. La résolution des conflits peut avoir laissé tomber quelque chose : on évalue alors l'écart avec git diff origin > ../unpatch.diff, on le rejoue avec patch -p1 < ../unpatch.diff, puis on l'intègre au bon commit.

Bonnes pratiques en équipe

Préparer la branche de livraison par un rebase depuis la production, avant d'ouvrir une demande de fusion.

Cela permet de traiter les conflits en amont, et d'enlever les commits sans valeur — typiquement les fusions de branches de fonctionnalité dans la branche de livraison.

Faire apparaître les tags précédents pour chaque livraison qui part en production, avec git rebase X.Y.Z-1.

Sur une branche déjà partagée, git pull --rebase traite les divergences et les conflits éventuels avec vos propres commits.

Avec un seul commit et un gros retard, copiez son SHA, alignez-vous sur la branche distante avec git reset --hard origin/release/xy, puis rejouez le commit avec git cherry-pick SHA.

Pour préparer une demande de fusion, un rebase interactif git rebase -i origin/release/xy permet de regrouper vos commits et d'écarter ceux qui ne font pas partie de votre travail. Les commits dont le SHA a changé à cause d'une divergence remontent dans votre historique pendant l'opération : vous aurez donc probablement des git rebase --skip à passer.

Pour corriger un commit sans en créer un nouveau, git reset --soft SHA sur le commit qui porte le bon message, puis git commit --amend --no-edit.

Rien n'est jamais vraiment perdu : git reflog retrace votre navigation dans le dépôt.

Les mauvaises pratiques

Ne jamais fusionner la branche de production dans une autre branche. La fusion va dans l'autre sens : c'est la branche de livraison qui entre dans la branche stable. En ne respectant pas ce principe, l'historique de la production devient illisible dès qu'on le remonte en graphe.

Ne pas laisser traîner les commits qui corrigent le précédent. Ils alourdissent l'historique, et donc le travail de tous les rebases suivants entre la branche de livraison et celle de production.


Liens

Articles connexes