Git

Commandes quotidiennes

Les commandes Git que vous utiliserez tous les jours : branches, stash, historique

Dans ce chapitre, nous allons voir les commandes Git que vous utiliserez régulièrement dans votre workflow de développement.

Gestion des branches

Les branches permettent de travailler sur plusieurs fonctionnalités en parallèle sans affecter le code principal.

Imaginez que vous développez une nouvelle fonctionnalité qui prendra 3 jours. Pendant ce temps, un bug critique est découvert en production. Grâce aux branches, vous pouvez :

  1. Mettre de côté votre feature
  2. Corriger le bug sur la branche main
  3. Revenir à votre feature

Créer une branche

# Créer une branche
git branch nom-de-la-branche

# Créer ET basculer sur une branche (recommandé)
git checkout -b nom-de-la-branche

Ou avec la syntaxe moderne :

git switch -c nom-de-la-branche

Convention de nommage :

git checkout -b feat/nouvelle-fonctionnalite
git checkout -b fix/bug-login
git checkout -b refactor/clean-code
git checkout -b docs/update-readme

Lister les branches

# Branches locales
git branch

# Toutes les branches (locales + distantes)
git branch -a

# Branches avec dernier commit
git branch -v

Résultat :

* feat/nouvelle-feature
  main
  fix/bug-login

L'astérisque * indique la branche active.

Switcher entre les branches

git checkout nom-de-la-branche

Ou avec la syntaxe moderne :

git switch nom-de-la-branche
Attention : Vous ne pouvez pas changer de branche si vous avez des modifications non commitées. Utilisez git stash (vu plus bas) pour les mettre de côté temporairement.

Supprimer une branche

# Supprimer une branche locale (seulement si déjà mergée)
git branch-Dnom-de-la-branche

# Forcer la suppression (si pas mergée)
git branch -D nom-de-la-branche

# Supprimer une branche distante sur GitHub
git push origin --delete nom-de-la-branche

Renommer une branche

# Renommer la branche actuelle
git branch -m nouveau-nom

# Renommer une autre branche
git branch -m ancien-nom nouveau-nom

Visualiser l'historique

Commandes git log

# Historique complet (appuyez sur 'q' pour quitter)
git log

# Historique condensé (recommandé pour un aperçu rapide)
git log --oneline

# Historique graphique (voir les branches et merges)
git log --graph --oneline --all

# Rechercher dans l'historique
git log --grep="fix"

# Historique d'un fichier spécifique
git log --follow src/app.js

# Derniers N commits
git log -n 5

Exemple de résultat git log --oneline :

e4f5g6h feat: add user authentication
a1b2c3d fix: resolve login timeout
b2c3d4e docs: update API documentation

Voir les différences

# Différences non indexées (working directory vs staging)
git diff

# Différences indexées (staging vs dernier commit)
git diff --staged

# Différences entre deux commits
git diff a1b2c3d e4f5g6h

# Différences entre deux branches
git diff main..feat/nouvelle-feature

# Différences pour un fichier spécifique
git diff src/app.js

Voir le détail d'un commit

git show a1b2c3d

Affiche les modifications apportées par ce commit spécifique.

Annuler et corriger des modifications

L'une des forces de Git est de pouvoir annuler ou corriger des erreurs. Voici comment.

Annuler les modifications d'un fichier

Vous avez modifié un fichier mais voulez abandonner ces changements :

# Syntaxe moderne (Git 2.23+)
git restore fichier.txt

# Ancienne syntaxe
git checkout -- fichier.txt

Résultat : Le fichier revient à l'état du dernier commit.

Retirer un fichier de la staging area

Vous avez fait git add par erreur et voulez retirer un fichier de la staging area :

# Syntaxe moderne (Git 2.23+)
git restore --staged fichier.txt

# Ancienne syntaxe
git reset HEAD fichier.txt

Résultat : Le fichier reste modifié mais n'est plus staged.

Modifier le dernier commit

Vous avez oublié d'ajouter un fichier ou vous voulez modifier le message du dernier commit :

# Modifier le message du dernier commit
git commit --amend -m "nouveau message"

# Ajouter un fichier oublié au dernier commit
git add fichier-oublie.txt
git commit --amend --no-edit
Danger : N'utilisez --amend que si le commit n'a pas encore été pushé ! Sinon, vous réécrirez l'historique et créerez des problèmes pour vos collaborateurs.

Annuler le dernier commit

Option 1 : Garder les modifications (recommandé)

git reset --soft HEAD~1

Résultat : Le commit est annulé, mais vos modifications restent dans la staging area.

Option 2 : Retirer de staging

git reset HEAD~1

Résultat : Le commit est annulé, vos modifications restent dans le working directory mais ne sont plus staged.

Option 3 : Tout supprimer (DANGEREUX )

git reset --hard HEAD~1

Résultat : Le commit ET les modifications sont supprimés définitivement.

Annuler un commit sans réécrire l'historique

Si le commit a déjà été pushé, utilisez revert au lieu de reset :

git revert a1b2c3d

Résultat : Crée un nouveau commit qui annule les changements du commit spécifié. L'historique est préservé.

Remiser son travail avec stash

Le stash (remise) permet de mettre de côté des modifications en cours sans les commiter.

Cas d'usage typique

Vous travaillez sur une feature, mais vous devez immédiatement corriger un bug sur main :

  1. Votre code n'est pas prêt à être commité
  2. Vous ne pouvez pas changer de branche avec des modifications en cours
  3. Solution : Utilisez git stash !

Sauvegarder les modifications

# Remiser toutes les modifications
git stash

# Remiser avec un message descriptif (recommandé)
git stash save "WIP: working on feature X"

# Remiser en incluant les fichiers non suivis
git stash -u

Résultat : Votre working directory est propre, comme si vous n'aviez rien modifié.

Lister les stashes

git stash list

Résultat :

stash@{0}: WIP on feat/login: a1b2c3d Add login form
stash@{1}: WIP on main: e4f5g6h Update README

Récupérer un stash

# Appliquer le dernier stash ET le supprimer (le plus courant)
git stash pop

# Appliquer un stash spécifique
git stash pop stash@{1}

# Appliquer sans supprimer
git stash apply

Supprimer un stash

# Supprimer le dernier stash
git stash drop

# Supprimer un stash spécifique
git stash drop stash@{1}

# Supprimer TOUS les stashes
git stash clear

Workflow avec stash

# 1. Vous travaillez sur une feature
git checkout -b feat/nouvelle-feature
# ... modifications en cours ...

# 2. Urgence : il faut corriger un bug !
git stash save "WIP: nouvelle feature"

# 3. Correction du bug
git checkout main
git pull
git checkout -b fix/bug-urgent
# ... correction ...
git add .
git commit -m "fix: resolve urgent bug"
git push

# 4. Retour à votre feature
git checkout feat/nouvelle-feature
git stash pop

# 5. Continuer à travailler

Synchronisation avec Origin

Récupérer les changements

# Fetch : récupère les changements SANS les fusionner
git fetch origin

# Pull : récupère ET fusionne les changements
git pull

# Pull avec rebase (historique plus propre)
git pull --rebase

Différence fetch vs pull :

  • fetch : Télécharge les changements mais ne modifie pas votre code
  • pull : Télécharge ET fusionne les changements dans votre branche

Envoyer les changements

# Push vers la branche actuelle
git push

# Push vers une branche spécifique
git push origin nom-de-la-branche

# Push avec suivi de la branche distante (première fois)
git push -u origin nom-de-la-branche

# Push forcé (DANGEREUX :icon{name="i-heroicons-exclamation-triangle" class="text-orange-500"} - à éviter sur branches partagées)
git push --force

# Force with lease (plus sûr, vérifie avant d'écraser)
git push --force-with-lease

Règle d'or : Ne forcez JAMAIS un push sur une branche partagée (main, develop) sauf si vous savez exactement ce que vous faites !

Gestion des fichiers

Supprimer un fichier

# Supprimer et commiter en une fois
git rm fichier.txt
git commit -m "chore: remove unused file"

# Garder le fichier localement mais le retirer de Git
git rm --cached fichier.txt
git commit -m "chore: untrack sensitive file"

Après git rm --cached, ajoutez le fichier au .gitignore pour éviter de le re-commiter.

Renommer un fichier

git mv ancien-nom.txt nouveau-nom.txt
git commit -m "chore: rename file"

Git détecte automatiquement que c'est un renommage, pas une suppression + création.

Autres commandes utiles

Voir qui a modifié une ligne

git blame fichier.txt

Affiche pour chaque ligne : qui l'a modifiée, quand, et dans quel commit.

Rechercher dans l'historique

# Rechercher un mot dans les messages de commit
git log --grep="login"

# Rechercher un mot dans le code
git log -S "fonction_importante"

Nettoyer les branches obsolètes

# Voir les branches déjà mergées dans main
git branch --merged main

# Supprimer toutes les branches locales déjà mergées
git branch --merged main | grep -v "main" | xargs git branch -d

Résumé des commandes

CommandeDescription
git branchListe les branches
git checkout -b nomCrée et bascule sur une branche
git switch nomBascule sur une branche (moderne)
git branch-DnomSupprime une branche
git log --onelineHistorique condensé
git diffVoir les modifications
git restore fichierAnnuler les modifications
git restore --staged fichierRetirer de staging
git reset --soft HEAD~1Annuler le dernier commit
git revert commitAnnuler un commit (nouveau commit)
git stashRemiser les modifications
git stash popRécupérer les modifications remisées
git pull --rebaseRécupérer avec rebase
git push -u origin nomPousser et définir le tracking