🐙 Git et GitHub CLI
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  | |
| git grep -n "TODO" | Trouver les lignes contenant  | |
| git grep -i "login" | Rechercher le mot  | |
| 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  | |
| git branch -d old-feature | Supprimer une branche locale  | |
| git checkout | Changer de branche ou restaurer des fichiers d’un autre commit | |
| git checkout main | Basculer sur la branche  | |
| git checkout -b new-branch | Créer et basculer sur une nouvelle branche  | |
| git switch | Changer de branche (alternative simplifiée à checkout) | |
| git switch main | Basculer sur la branche  | |
| git switch -c feature-x | Créer et basculer sur une nouvelle branche  | |
| git switch new-feature | Basculer sur une branche existante  | |
| git merge | Fusionner les changements d’une autre branche dans la branche courante | |
| git merge new-feature | Fusionner la branche  | |
| 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  | |
| 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  | 
📡 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é  | |
| 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  | |
| 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  | |
| git fetch | Télécharger les changements distants sans les fusionner | |
| git fetch origin | Récupérer toutes les mises à jour de  | |
| git fetch origin main | Récupérer uniquement la branche  | |
| 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 ( | 
📦 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é  | |
| git tag -d v1.0 | Supprimer le tag local  | |
| 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.  | |
| git push origin :refs/tags/v1.0 | Supprimer le tag distant  | 
🛠️ 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  | |
| 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 submodule sync --recursive | Synchroniser les URLs des sous-modules après modification du  | |
| 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  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Créer une archive  | |
| 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
ghvous 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 ( | |
| 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  | |
| 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é  | |
| 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  | |
| 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é  | |
| 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é  | 
💡 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-branchavec 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-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