🐙 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-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-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