🐙 Git et GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Date de publication

31 août 2025

Commandes Git basiques et avancées pour le contrôle de version, les branches, les dépôts distants, le stash, les tags et GitHub CLI.

🔹 Commandes de base

Commande

Exemple

Description

git add Ajouter un fichier à la zone de staging
git add file.txt

Ajouter un fichier spécifique au prochain commit

git add .

Ajouter toutes les modifications dans le répertoire courant et ses sous-dossiers

git add -p

Choisir de manière interactive quelles parties de fichiers ajouter (utile pour les commits partiels)

git clone Cloner un dépôt dans un nouveau répertoire
git clone -b branch_name URL

Cloner uniquement la branche spécifiée (au lieu de la branche par défaut)

git clone --depth 1 URL

Cloner uniquement le dernier commit, créant une copie légère pour gagner temps et espace

git commit Enregistrer les modifications dans le dépôt
git commit -m "Initial commit"

Commit avec un message sans ouvrir l’éditeur

git commit -a -m "Fix bugs"

Ajouter et committer tous les fichiers suivis modifiés avec un message

git commit --amend

Mettre à jour le dernier commit (modifier le message ou inclure plus de changements)

git commit --fixup abc1234

Créer un commit fixup pour l’écraser automatiquement plus tard lors d’un rebase interactif

git config Obtenir et définir des options globales ou locales du dépôt
git config --global user.name "Name"

Définir le nom d’utilisateur Git global

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

Définir l’email Git global

git config --list

Lister toutes les configurations Git (nom, email, éditeur, etc.)

git diff Afficher les différences entre commits, entre un commit et l’arborescence de travail, etc.
git diff HEAD

Afficher les modifications depuis le dernier commit (non indexées)

git diff --staged

Afficher ce qui sera inclus dans le prochain commit

git diff --word-diff HEAD~1

Afficher les différences au niveau des mots

git grep Rechercher dans les fichiers du dépôt
git grep "functionName"

Trouver toutes les occurrences de functionName dans le projet

git grep -n "TODO"

Trouver les lignes contenant TODO avec numéros de lignes

git grep -i "login"

Rechercher le mot login sans tenir compte de la casse

git init Créer un dépôt Git vide ou réinitialiser un dépôt existant
git init my-project

Initialiser un nouveau dépôt dans le dossier my-project

git init --bare

Initialiser un dépôt nu

git log Afficher l’historique des commits
git log --oneline

Afficher l’historique des commits en format compact (une ligne)

git log --graph --all

Afficher toutes les branches sous forme de graphe

git log -p --stat

Afficher patch et statistiques de modifications des fichiers

git reset Retirer des fichiers de la zone de staging, en conservant les changements locaux
git reset HEAD file.txt

Retirer un fichier du staging (garde vos modifications)

git reset --hard HEAD~1

Revenir un commit en arrière et supprimer tous les changements (irréversible!)

git reset --soft HEAD~1

Annuler le dernier commit mais conserver les changements prêts à être recommis

git reset --mixed HEAD~1

Annuler un commit mais garder les changements non indexés

git show Afficher différents types d’objets
git show <commit_hash>

Afficher les changements et message d’un commit spécifique

git show HEAD~1

Afficher le commit précédent

git show --stat

Afficher un résumé des changements du dernier commit

git status Afficher l’état de l’arborescence de travail
git status -s

Afficher l’état en format court

git status -b

Afficher la branche courante et l’état des fichiers

🌿 Branches et fusions

Commande

Exemple

Description

git branch Créer, lister ou supprimer des branches
git branch new-feature

Créer une nouvelle branche new-feature

git branch -d old-feature

Supprimer une branche locale old-feature

git checkout Changer de branche ou restaurer des fichiers d’un autre commit
git checkout main

Basculer sur la branche main

git checkout -b new-branch

Créer et basculer sur une nouvelle branche new-branch

git switch Changer de branche (alternative simplifiée à checkout)
git switch main

Basculer sur la branche main

git switch -c feature-x

Créer et basculer sur une nouvelle branche feature-x

git switch new-feature

Basculer sur une branche existante new-feature

git merge Fusionner les changements d’une autre branche dans la branche courante
git merge new-feature

Fusionner la branche new-feature dans la branche actuelle

git merge --no-ff new-feature

Toujours créer un commit de fusion (même si fast-forward possible)

git merge --abort

Annuler la fusion et revenir en arrière si conflits

git rebase Rejouer ou déplacer des commits sur une nouvelle base
git rebase main

Rejouer vos commits sur la branche main

git rebase -i HEAD~3

Modifier de manière interactive les 3 derniers commits

git rebase --abort

Annuler un rebase en cours

git rebase -i --autosquash HEAD~5

Écraser automatiquement les commits marqués fixup ou squash

git cherry-pick Appliquer des commits spécifiques d’une autre branche
git cherry-pick <hash>

Appliquer un commit spécifique (par hash) à la branche actuelle

git cherry-pick --continue

Continuer après avoir résolu des conflits

git cherry-pick A^..B

Appliquer une plage de commits de A (exclu) à B (inclus)

📡 Dépôts distants

Commande

Exemple

Description

git remote Gérer les liens vers les dépôts distants (comme GitHub)
git remote -v

Afficher les noms et URLs des dépôts distants

git remote add origin URL

Ajouter un dépôt distant nommé origin

git pull Télécharger et fusionner automatiquement les modifications d’une branche distante
git pull origin main

Récupérer et fusionner les changements de main distant dans la branche locale

git pull --rebase origin main

Récupérer et rebaser la branche courante sur la branche distante

git push Envoyer vos modifications locales vers un dépôt distant
git push origin main

Pousser la branche locale main vers origin

git fetch Télécharger les changements distants sans les fusionner
git fetch origin

Récupérer toutes les mises à jour de origin, sans les appliquer

git fetch origin main

Récupérer uniquement la branche main distante

git fetch --all

Récupérer les mises à jour de tous les dépôts distants

git fetch --prune

Nettoyer les branches supprimées à distance

git fetch --dry-run

Montrer ce qui serait récupéré sans rien télécharger

git fetch origin +main

Mettre à jour de force la branche de suivi locale (origin/main)

📦 Stash et nettoyage

Commande

Exemple

Description

git stash Sauvegarder temporairement les modifications non committées (travail en cours)
git stash

Sauvegarder fichiers modifiés et indexés puis restaurer l’état du dernier commit

git stash apply

Réappliquer le dernier stash (reste sauvegardé)

git stash pop

Réappliquer et supprimer le dernier stash

git stash list

Afficher la liste de tous les stash

git stash branch feature-fix

Créer une branche et y appliquer le dernier stash

git clean Supprimer définitivement les fichiers non suivis
git clean -f

Supprimer les fichiers non suivis du répertoire courant

git clean -fd

Supprimer fichiers et dossiers non suivis

git clean -n

Prévisualiser ce qui sera supprimé (dry run)

🏷️ Tags

Commande

Exemple

Description

git tag Créer, lister ou supprimer des tags pour marquer des points spécifiques (ex. releases)
git tag -a v1.0 -m "Version 1.0"

Créer un tag annoté v1.0 avec message (bon pour releases)

git tag -d v1.0

Supprimer le tag local v1.0

git push Pousser commits, branches et tags du local vers le dépôt distant
git push origin --tags

Pousser tous les tags locaux vers le dépôt distant

git push origin v1.0

Pousser un tag spécifique (ex. v1.0) vers le dépôt distant

git push origin :refs/tags/v1.0

Supprimer le tag distant v1.0

🛠️ Résolution de conflits

Commande

Exemple

Description

git mergetool Ouvrir un outil visuel pour résoudre les conflits de fusion
git mergetool --tool=meld

Utiliser un outil spécifique (ex. Meld) pour résoudre les conflits

git rerere Permet à Git de se souvenir de la manière dont vous avez résolu des conflits précédents
git config --global rerere.enabled true

Activer la réutilisation automatique des résolutions de conflits

git rerere status

Afficher les fichiers avec résolutions enregistrées

git rerere diff

Afficher les changements sauvegardés pour réutilisation

⚙️ Commandes avancées

Commande

Exemple

Description

git bisect Utiliser une recherche binaire pour trouver le commit qui a introduit un bug
git bisect start

Démarrer une recherche binaire entre un commit bon et un commit défectueux

git bisect bad

Marquer le commit actuel comme « mauvais »

git bisect good <commit>

Marquer un commit comme « bon »

git blame Afficher qui a modifié chaque ligne d’un fichier, avec révision et auteur
git blame file.txt

Afficher l’auteur et le commit pour chaque ligne

git blame -L 10,20 file.txt

Afficher les infos seulement pour lignes 10 à 20

git blame --show-email file.txt

Afficher emails des auteurs avec les changements

git reflog Afficher et gérer le journal des références (reflog) des branches et HEAD
git reflog show main@{1.week.ago}

Voir où pointait la branche main il y a une semaine

git reflog expire --expire=30.days --dry-run

Prévisualiser les entrées du reflog de plus de 30 jours qui peuvent être nettoyées

git reflog delete HEAD@{2}

Supprimer une entrée reflog spécifique (⚠ impact possible sur récupération)

git submodule Ajouter, initialiser, mettre à jour ou inspecter des sous-modules
git submodule add URL path

Ajouter un dépôt externe comme sous-module

git submodule update --init

Initialiser et télécharger tous les sous-modules

git submodule foreach git pull

Lancer git pull dans chaque sous-module pour les mettre à jour

git submodule sync --recursive

Synchroniser les URLs des sous-modules après modification du .gitmodules

git submodule update --remote --merge

Mettre à jour les sous-modules au dernier commit de leurs branches

git archive Créer une archive (zip, tar, etc.) des fichiers depuis un commit ou branche spécifique
git archive --format=zip HEAD > archive.zip

Créer une archive ZIP des fichiers du projet à HEAD

git archive -o release.tar.gz HEAD

Créer une archive compressée .tar.gz depuis HEAD

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

Créer une archive .tar.gz avec tous les fichiers dans un dossier project/

git gc Nettoyer les fichiers inutiles et optimiser le dépôt
git gc --aggressive

Effectuer un nettoyage complet et optimisation (peut être long)

git gc --prune=now

Supprimer immédiatement tous les objets inaccessibles (dangereux si incertain)

git shortlog Résumé rapide des auteurs et de leurs commits
git shortlog -e

Afficher la liste des auteurs avec emails (pour analyser contributions)

git shortlog -s -n

Afficher combien de commits chaque auteur a fait, triés par nombre

git shortlog -sne

Même chose mais avec noms et emails — utile pour suivi détaillé

git revert Créer un nouveau commit qui annule un commit précédent sans réécrire l’historique
git revert HEAD

Annuler le dernier commit en créant un nouveau commit inverse

git revert <commit_hash>

Annuler un commit spécifique par son hash

🐙 GitHub CLI

gh vous permet de gérer GitHub depuis le terminal.

Commande

Exemple

Description

gh auth login S’authentifier auprès d’un hôte GitHub pour permettre aux commandes CLI d’interagir avec votre compte
gh auth login --with-token < mytoken.txt

S’authentifier avec un jeton d’accès personnel stocké dans un fichier (mytoken.txt)

gh auth login --hostname enterprise.internal

S’authentifier auprès d’un serveur GitHub Enterprise (autre que github.com)

gh repo clone Cloner un dépôt GitHub sur votre machine locale
gh repo clone user/repo

Cloner le dépôt repo appartenant à user dans un dossier nommé repo

gh repo clone cli/cli -- --depth=1

Cloner le dépôt mais ne télécharger que le dernier commit pour un clone plus rapide et plus léger

gh repo clone cli/cli workspace/cli

Cloner le dépôt dans un dossier personnalisé workspace/cli

gh issue list Lister les issues d’un dépôt GitHub, éventuellement filtrées par différents critères
gh issue list --assignee "@me"

Lister les issues qui vous sont assignées

gh issue list --state all

Lister toutes les issues, quel que soit leur état (ouvertes ou fermées)

gh issue list --search "error no:assignee sort:created-asc"

Lister les issues correspondant à « error », non assignées, triées par date de création croissante

gh pr create Créer une pull request sur GitHub via la CLI
gh pr create --title "..."

Créer une pull request avec un titre donné

gh pr create --project "Roadmap"

Lier la pull request à un projet GitHub nommé « Roadmap »

gh pr create --base develop --head monalisa:feature

Créer une PR depuis la branche feature du fork monalisa vers la branche develop

gh repo create Créer un nouveau dépôt GitHub depuis la CLI
gh repo create my-project

Créer un nouveau dépôt appelé my-project sur GitHub (avec invites interactives)

gh repo create my-project --public --clone

Créer un dépôt public et le cloner localement

gh repo create my-project --private --source=. --remote=upstream

Créer un dépôt privé distant depuis le dossier courant et ajouter un remote nommé upstream

💡 Alias Git (raccourcis utiles)

Configurer des alias pratiques pour accélérer l’exécution des commandes Git fréquentes :

git config --global alias.br branch                                       # raccourci pour : git branch
git config --global alias.ci commit                                       # raccourci pour : git commit
git config --global alias.co checkout                                     # raccourci pour : git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # joli graphe de l’historique
git config --global alias.last "log -1 HEAD"                              # afficher le dernier commit
git config --global alias.st status                                       # raccourci pour : git status

🚀 Commandes Git avancées pour professionnels

Commande

Exemple

Description

git filter-repo Un outil puissant et performant pour réécrire l’historique Git afin de supprimer ou modifier des fichiers, l’auteur ou des chemins ; remplace git filter-branch avec plus de rapidité et de sécurité
git filter-repo --path secret.txt --invert-paths

Réécrire efficacement l’historique pour supprimer des fichiers ou dossiers sensibles sans les problèmes de performance de git filter-branch. À utiliser avec précaution

git filter-repo --replace-text replacements.txt

Remplacer en masse des chaînes ou motifs dans tout l’historique (ex. assainir des identifiants)

git filter-repo --subdirectory-filter src

Extraire l’historique d’un sous-répertoire dans un nouveau dépôt en conservant les métadonnées de commits

git worktree Gérer plusieurs arborescences de travail liées à un seul dépôt, permettant de travailler en parallèle sur différentes branches sans cloner
git worktree add ../feature feature-branch

Créer une arborescence de travail supplémentaire attachée au même dépôt pour pouvoir checkout plusieurs branches en parallèle

git worktree list

Lister toutes les worktrees actives, leurs chemins et branches associées

git worktree remove ../feature

Supprimer une worktree lorsqu’elle n’est plus nécessaire, en nettoyant les dossiers en toute sécurité

git replace Créer des références temporaires qui remplacent des objets existants, permettant une manipulation locale et non destructive de l’historique
git replace <old_commit> <new_commit>

Échanger temporairement un commit par un autre dans votre dépôt local, utile pour tester ou patcher l’historique sans le réécrire

git replace --list

Afficher toutes les références de remplacement actives

git replace -d <replace_ref>

Supprimer une référence de remplacement spécifique pour rétablir le comportement

git stash Sauvegarder temporairement les modifications non committées dans une pile, permettant de changer de contexte sans committer du travail en cours
git stash push -p

Sélectionner de manière interactive des blocs de changements à mettre en stash

git stash push -m "WIP selective stash"

Créer un stash avec un message personnalisé pour une identification plus facile

git stash apply stash@{2}

Appliquer un stash spécifique de la liste sans le supprimer

git rebase Rejouer les commits sur une nouvelle base, facilitant un historique linéaire plus propre et l’édition interactive de l’historique
git rebase --interactive --autosquash

Démarrer un rebase interactif qui réordonne et fusionne automatiquement les commits marqués fixup/squash

git rebase -i --autosquash HEAD~10

Réordonner et fusionner automatiquement les commits fixup/squash avant de pousser

git commit --fixup <commit>

Créer un commit fixup qui sera fusionné automatiquement lors du rebase interactif

git commit --squash <commit>

Créer un commit squash à combiner avec un commit spécifié lors du rebase

git bisect Outil de recherche binaire pour identifier efficacement le commit qui a introduit un bug en testant successivement les commits
git bisect run

Automatiser le bisect en lançant un script de test sur chaque commit

git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh

Automatiser la recherche avec un script de test pour accélérer l’identification du bug

git bisect visualize

Ouvrir un outil graphique pour visualiser le processus de bisect

git bisect reset

Quitter le mode bisect et revenir au HEAD original

git commit Enregistrer des modifications avec options détaillées (amend, signature, fixup, personnalisation du message) pour maintenir un historique de qualité
git commit --gpg-sign

Créer un commit signé avec votre clé GPG pour garantir authenticité et auteur

git commit -S -m "Signed commit"

Signer cryptographiquement vos commits avec votre clé GPG

git config --global user.signingkey <key_id>

Configurer globalement la clé GPG utilisée pour signer les commits

git log --show-signature

Vérifier et afficher les infos de signature GPG des commits

git reflog Garder un journal des mises à jour de HEAD et des branches, essentiel pour récupérer des commits perdus
git reset --hard HEAD@{3}

Réinitialiser la branche courante à un état précédent depuis le reflog

git reflog expire --expire=now --all

Expirer immédiatement toutes les entrées du reflog (⚠ à utiliser avec prudence)

🧰 Conseils de flux de travail et automatisation pour pros

Sujet

Commandes / Exemple

Explication & Conseils Pro

Nettoyage agressif du dépôt

git gc --aggressive --prune=now

Effectue un garbage collection profond et supprime immédiatement les objets inaccessibles pour optimiser le dépôt. À utiliser pendant des maintenances

Worktrees de branches parallèles

git worktree add ../feature-branch feature

Conserver plusieurs arborescences de travail pour développer plusieurs fonctionnalités en parallèle, sans coût de clone

Historique linéaire propre

git rebase -i --autosquash

Avant de pousser, faire un rebase interactif avec autosquash pour garder un historique clair

Commits sécurisés

git commit -S

Signer les commits avec GPG pour renforcer la confiance dans les dépôts partagés

Bisect automatisé

git bisect run ./test-script.sh

Automatiser la chasse aux bugs avec un script de test exécuté sur chaque commit

Cache de résolution de conflits

git config --global rerere.enabled true

Activer la réutilisation des résolutions de conflits pour accélérer les résolutions répétées

Alias et hooks partagés

Stocker des alias Git et hooks communs dans un dépôt partagé ou un pipeline CI pour uniformiser les pratiques d’équipe

Ressources supplémentaires

🧠 Astuce

N’essayez pas de tout mémoriser. Utilisez --help, explorez, et pratiquez régulièrement :

git help <command>
git status

🌐 Liens utiles

📘 Documentation officielle Git — manuel détaillé de toutes les commandes Git :
https://git-scm.com/docs

📙 Learn Git Branching — tutoriel interactif visuel pour maîtriser les branches :
https://learngitbranching.js.org

📕 Livre Pro Git (gratuit, par Scott Chacon & Ben Straub) :
https://git-scm.com/book

📗 Git Cheatsheet (référence officielle concise) :
https://education.github.com/git-cheat-sheet-education.pdf