Aide-mémoire Git
Commandes, flags, exemples et erreurs courantes
Configuration
Lit ou définit les options de configuration de Git à trois niveaux: système, utilisateur (global) ou dépôt (local).
git config --global user.name "John Doe" git config --global user.email "john.doe@example.com"
Définit comment Git mémorise les identifiants HTTPS pour ne pas redemander le mot de passe à chaque push.
git config --global credential.helper manager
Définit un .gitignore global appliqué à tous les dépôts.
git config --global core.excludesfile ~/.gitignore_global
Dépôts
Crée un nouveau dépôt Git dans le répertoire courant.
git init git init --initial-branch=main meu-projeto
Copie un dépôt distant sur la machine locale avec tout l'historique.
git clone https://github.com/user/repo.git
Stage et commit
Affiche l'état du working directory et du staging: ce qui est modifié, en stage ou non suivi.
git status
Déplace les modifications du working directory vers le staging area, prêtes pour le prochain commit.
git add src/components/Button.tsx git add .
Enregistre le contenu du staging dans un nouveau commit du dépôt local avec un message.
git commit -m "feat: adiciona git cheat sheet"
Restaure des fichiers: les retire du staging ou annule des modifications dans le working directory.
git restore --staged file.txt git restore file.txt
Supprime des fichiers du dépôt (et éventuellement du disque).
git rm secret.env
Renomme ou déplace un fichier suivi, équivalent à mv + git add + git rm.
git mv old.tsx new.tsx
Branches
Liste, crée, renomme ou supprime des branches.
git branch git branch feature/login
Ancienne commande pour changer de branche ou restaurer des fichiers. Aujourd'hui git switch et git restore sont recommandés.
git checkout main git checkout -b feature/x
Version moderne de checkout dédiée au changement de branche.
git switch main git switch -c feature/login
Merge et rebase
Fusionne les modifications d'une autre branche dans la courante, créant un commit de merge si nécessaire.
git switch main git merge feature/login
Réapplique les commits de la branche courante au-dessus d'une autre base, en réécrivant l'historique.
git switch feature git rebase main
Applique un commit spécifique d'une autre branche sur la branche courante.
git cherry-pick a1b2c3d
Ouvre un outil graphique pour résoudre les conflits de merge.
git mergetool --tool=meld
Remote
Gère les distants du dépôt (origin, upstream, etc).
git remote -v
Télécharge les commits et refs du distant sans les intégrer dans la branche locale.
git fetch origin
Équivaut à git fetch suivi de git merge (ou rebase) sur la branche courante.
git pull origin main
Envoie les commits locaux vers le distant.
git push -u origin feature/login
Stash
Sauvegarde les modifications non commitées dans une pile temporaire pour nettoyer le working directory.
git stash push -m "WIP login"
Manipulation de la pile de stashes.
git stash list git stash pop
Tags
Crée, liste, supprime ou vérifie des tags. Les tags marquent des points de l'historique (releases).
git tag -a v1.2.0 -m "Release 1.2"
Renvoie un nom lisible basé sur la tag la plus proche.
git describe --tags --always --dirty
Log
Affiche l'historique des commits avec des filtres et formats flexibles.
git log --oneline --graph --decorate --all
Affiche le contenu d'un commit, tag ou objet.
git show HEAD git show a1b2c3d:src/file.tsx
Affiche les différences entre working dir, staging, commits ou branches.
git diff git diff --cached git diff main feature
Affiche qui a modifié chaque ligne d'un fichier et dans quel commit.
git blame -L 10,30 file.tsx
Résumé groupé par auteur (utile pour les release notes).
git shortlog -sne
Historique local de tout ce que HEAD a touché. Bouée de sauvetage pour récupérer des commits perdus.
git reflog
git reset --hard HEAD@{2}Annuler
Déplace HEAD vers un autre commit, en altérant éventuellement le staging et le working dir.
git reset --soft HEAD~1 git reset --mixed HEAD~1 git reset --hard HEAD~1
Crée un nouveau commit qui annule les modifications d'un autre. Sûr sur les branches partagées.
git revert a1b2c3d
Supprime les fichiers non suivis du working directory. Opération destructive.
git clean -nfd
Sous-modules
Ajoute un dépôt comme sous-module à l'intérieur du courant.
git submodule add -b main https://github.com/user/lib.git vendor/lib
Initialise et télécharge les sous-modules définis dans .gitmodules.
git submodule update --init --recursive
Voir l'état, exécuter une commande dans chaque sous-module ou le désactiver.
git submodule foreach 'git pull origin main'
Hooks
Crée un fichier exécutable dans .git/hooks/ portant le nom de l'événement (pre-commit, pre-push, commit-msg, post-merge, etc).
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
Définit un répertoire de hooks partagé (versionnable, en dehors de .git).
git config core.hooksPath .githooks
Outil JS qui versionne les hooks dans package.json et les installe automatiquement.
npx husky init echo "npm test" > .husky/pre-commit
Saute les hooks pre-commit et commit-msg (à utiliser avec parcimonie).
git commit --no-verify -m "hotfix"
Avancé
Recherche binaire dans l'historique pour trouver le commit qui a introduit un bug.
git bisect start git bisect bad HEAD git bisect good v1.0 git bisect reset
Crée plusieurs working directories liés au même .git, permettant de travailler sur plusieurs branches en parallèle.
git worktree add ../proj-hotfix hotfix/urgente
Réécrit l'historique: combiner, réordonner, éditer ou supprimer des commits.
git rebase -i HEAD~5 # pick a1b2 feat: x # squash c3d4 fix typo # reword e5f6 chore: y # drop g7h8 wip
Réécrit l'historique en masse, remplaçant moderne de git filter-branch. Utile pour supprimer des fichiers sensibles.
git filter-repo --path secrets.env --invert-paths
Crée un tarball ou zip du contenu d'une ref, sans .git.
git archive --format=zip --prefix=app/ -o release.zip v1.0
Empaquette des commits dans un seul fichier, transférable hors ligne.
git bundle create repo.bundle --all git clone repo.bundle nova-pasta
Résout une référence en SHA complet, court ou nom.
git rev-parse HEAD git rev-parse --abbrev-ref HEAD git rev-parse --short HEAD
Inspecte les objets Git (blobs, trees, commits, tags).
git cat-file -p HEAD git cat-file -t a1b2c3d
Liste les fichiers suivis (ls-files) ou le contenu d'une tree (ls-tree).
git ls-files git ls-tree -r HEAD --name-only
Maintenance: garbage collection, intégrité, suppression d'objets isolés.
git gc --aggressive --prune=now git fsck --full
Permet de n'avoir qu'un sous-ensemble de l'arbre localement, utile pour les gros monorepos.
git sparse-checkout init --cone git sparse-checkout set apps/web libs/ui
Ajoute des notes aux commits sans changer leur SHA.
git notes add -m "reviewed by QA" HEAD
Référence
┌──────────────┐ git add ┌────────────┐ git commit ┌─────────────┐ git push ┌──────────┐
│ Working Dir │ ───────────▶ │ Staging │ ───────────▶ │ Local Repo │ ──────────▶ │ Remote │
│ (files) │ ◀─────────── │ (index) │ ◀─────────── │ (.git) │ ◀────────── │ (origin) │
└──────────────┘ git restore └────────────┘ git reset └─────────────┘ git fetch └──────────┘
git pull = git fetch + git merge- untrackedfichier nouveau, Git ne le connaît pas encore
- modifiedfichier connu a été modifié
- stagedmarqué pour le prochain commit
- committedenregistré dans .git, fait partie de l'historique
- ignoredlisté dans .gitignore
Branches partagées, intégrer de grosses features en préservant le contexte, branches de release.
- Ne réécrit pas l'historique
- Sûr en toute situation
- Préserve la timeline réelle
- Historique avec losanges et bruit
- git log plus difficile à lire
Mettre à jour une feature branch locale avec main avant la PR. Garder l'historique linéaire.
- Historique linéaire et propre
- git log lisible
- git bisect plus efficace
- Réécrit les SHAs (JAMAIS sur des branches publiques)
- Les conflits peuvent être répétitifs
- Perd le contexte temporel
Avant de merger une feature avec plusieurs commits 'wip' ou 'fix typo' dans main.
- 1 commit propre par feature
- main avec un historique ultra lisible
- Perd la granularité du développement
- git bisect ne localise que la feature entière
Règle d'or: rebase en local, merge en public. Ne jamais faire de rebase sur des branches partagées.
--softGarde le staging et le working dirDéplace HEAD. Garde le staging et le working dir intacts. Les fichiers restent en stage.
Regrouper des commits sans perdre les modifications.
--mixedVide le staging, garde le working dir(default) Déplace HEAD. Vide le staging mais garde le working dir. Les fichiers redeviennent unstaged.
Refaire ce qui partait au prochain commit.
--hardEfface tout (destructif)Déplace HEAD. Vide le staging ET le working dir. Efface les modifications non commitées. Destructif.
Revenir à l'état d'un autre commit en abandonnant tout.
fatal: refusing to merge unrelated historiesLes deux dépôts n'ont pas de commit ancêtre commun.
git pull origin main --allow-unrelated-histories
Updates were rejected because the remote contains work that you do not haveLe distant a des commits que le local ignore.
git pull --rebase origin main puis git push. Ne jamais faire push --force sans --force-with-lease.
Please commit your changes or stash them before you switch branchesIl y a des modifications locales qui entreraient en conflit en changeant de branche.
git stash, git switch autre-branche, puis git stash pop.
CONFLICT (content): Merge conflict in <file>Le merge ou rebase a touché les mêmes lignes qu'une autre branche.
Éditer entre <<<<<<< ======= >>>>>>> puis git add fichier suivi de git merge --continue. Pour abandonner: git merge --abort.
detached HEADCheckout d'un SHA ou d'une tag au lieu d'une branche.
Pour garder le travail: git switch -c nouvelle-branche. Pour jeter: git switch main.
Permission denied (publickey)Clé SSH non configurée sur GitHub ou GitLab.
Exécuter ssh-keygen -t ed25519 -C "email" et ajouter ~/.ssh/id_ed25519.pub aux clés SSH du service.
fatal: Authentication failed (HTTPS)GitHub n'accepte plus le mot de passe, il faut un Personal Access Token.
Générer un PAT sur GitHub et l'utiliser comme mot de passe, ou passer le remote en SSH.
Your branch and 'origin/main' have divergedLes deux côtés ont des commits différents.
git pull --rebase sur une feature locale, ou git pull simple sur une main partagée.
error: failed to push some refs (non-fast-forward)Le distant a avancé, impossible de pousser sans intégrer d'abord.
git pull --rebase suivi de git push.
J'ai supprimé la mauvaise branche ou fait reset --hard et perdu du travailOpération destructive sans sauvegarde.
git reflog pour trouver le SHA, puis git checkout -b recupere <sha>. Les commits restent ~30 jours avant le gc.
.gitignore ne fonctionne pasLe fichier était déjà suivi avant d'être ignoré.
git rm --cached <fichier> suivi de git commit -m "untrack". Pour les répertoires: git rm -r --cached <dossier>.
J'ai commité un secret, mot de passe ou fichier .envgit add . sans précaution.
Faire tourner le secret, exécuter git filter-repo --path .env --invert-paths, git push --force-with-lease, et prévenir l'équipe de recloner.
LF will be replaced by CRLFDifférences de fin de ligne entre Windows et Unix.
git config --global core.autocrlf true sur Windows, ou input sur Mac et Linux.
Filename too long (Windows)Limite de 260 caractères de Windows.
git config --system core.longpaths true