MaisTools
Développeur/

Aide-mémoire Git

Référence rapide Git: commandes, flags, exemples et variations organisés par section, avec recherche instantanée.

Aide-mémoire Git

Commandes, flags, exemples et erreurs courantes

Configuration

git config

Lit ou définit les options de configuration de Git à trois niveaux: système, utilisateur (global) ou dépôt (local).

Flags--global--local--system--list--unset--edit
Exemple
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config credential.helper

Définit comment Git mémorise les identifiants HTTPS pour ne pas redemander le mot de passe à chaque push.

Exemple
git config --global credential.helper manager
git config --global core.excludesfile

Définit un .gitignore global appliqué à tous les dépôts.

Exemple
git config --global core.excludesfile ~/.gitignore_global

Dépôts

git init

Crée un nouveau dépôt Git dans le répertoire courant.

Flags--bare--initial-branch=--shared
Exemple
git init
git init --initial-branch=main meu-projeto
git clone

Copie un dépôt distant sur la machine locale avec tout l'historique.

Flags--depth--branch--single-branch--recurse-submodules--mirror--bare
Exemple
git clone https://github.com/user/repo.git

Stage et commit

git status

Affiche l'état du working directory et du staging: ce qui est modifié, en stage ou non suivi.

Flags-s-b--ignored-uno
Exemple
git status
git add

Déplace les modifications du working directory vers le staging area, prêtes pour le prochain commit.

Flags-A-p-i-u-n-f
Exemple
git add src/components/Button.tsx
git add .
git commit

Enregistre le contenu du staging dans un nouveau commit du dépôt local avec un message.

Flags-m-a--amend--no-edit-S--allow-empty--no-verify--fixup--squash
Exemple
git commit -m "feat: adiciona git cheat sheet"
git restore

Restaure des fichiers: les retire du staging ou annule des modifications dans le working directory.

Flags--staged--source=--worktree
Exemple
git restore --staged file.txt
git restore file.txt
git rm

Supprime des fichiers du dépôt (et éventuellement du disque).

Flags--cached-r-f-n
Exemple
git rm secret.env
git mv

Renomme ou déplace un fichier suivi, équivalent à mv + git add + git rm.

Flags-f-n
Exemple
git mv old.tsx new.tsx

Branches

git branch

Liste, crée, renomme ou supprime des branches.

Flags-a-r-vv-d-D-m-M--merged--no-merged--contains
Exemple
git branch
git branch feature/login
git checkout

Ancienne commande pour changer de branche ou restaurer des fichiers. Aujourd'hui git switch et git restore sont recommandés.

Flags-b-B--orphan--detach
Exemple
git checkout main
git checkout -b feature/x
git switch

Version moderne de checkout dédiée au changement de branche.

Flags-c-C--detach--discard-changes
Exemple
git switch main
git switch -c feature/login

Merge et rebase

git merge

Fusionne les modifications d'une autre branche dans la courante, créant un commit de merge si nécessaire.

Flags--no-ff--ff-only--squash--abort--continue-X-s
Exemple
git switch main
git merge feature/login
git rebase

Réapplique les commits de la branche courante au-dessus d'une autre base, en réécrivant l'historique.

Flags-i--onto--continue--abort--skip--autosquash--autostash
Exemple
git switch feature
git rebase main
git cherry-pick

Applique un commit spécifique d'une autre branche sur la branche courante.

Flags-x-n--continue--abort
Exemple
git cherry-pick a1b2c3d
git mergetool

Ouvre un outil graphique pour résoudre les conflits de merge.

Flags--tool=-y
Exemple
git mergetool --tool=meld

Remote

git remote

Gère les distants du dépôt (origin, upstream, etc).

Sous-commandesaddremoverenameset-urlshowprune
Flags-v
Exemple
git remote -v
git fetch

Télécharge les commits et refs du distant sans les intégrer dans la branche locale.

Flags--all--prune--tags--depth--unshallow
Exemple
git fetch origin
git pull

Équivaut à git fetch suivi de git merge (ou rebase) sur la branche courante.

Flags--rebase--ff-only--no-rebase--autostash
Exemple
git pull origin main
git push

Envoie les commits locaux vers le distant.

Flags-u--force--force-with-lease--tags--delete--dry-run--all
Exemple
git push -u origin feature/login

Stash

git stash

Sauvegarde les modifications non commitées dans une pile temporaire pour nettoyer le working directory.

Sous-commandespush
Flags-u-a-m-k-p
Exemple
git stash push -m "WIP login"
git stash list / show / pop / apply / drop / clear

Manipulation de la pile de stashes.

Exemple
git stash list
git stash pop

Tags

git tag

Crée, liste, supprime ou vérifie des tags. Les tags marquent des points de l'historique (releases).

Flags-a-m-s-d-l-f
Exemple
git tag -a v1.2.0 -m "Release 1.2"
git describe

Renvoie un nom lisible basé sur la tag la plus proche.

Flags--tags--always--dirty--abbrev
Exemple
git describe --tags --always --dirty

Log

git log

Affiche l'historique des commits avec des filtres et formats flexibles.

Flags--oneline--graph--all--decorate-p--stat--since--author--grep-S
Exemple
git log --oneline --graph --decorate --all
git show

Affiche le contenu d'un commit, tag ou objet.

Flags--stat--name-only--name-status
Exemple
git show HEAD
git show a1b2c3d:src/file.tsx
git diff

Affiche les différences entre working dir, staging, commits ou branches.

Flags--cached--staged--stat--name-only--word-diff
Exemple
git diff
git diff --cached
git diff main feature
git blame

Affiche qui a modifié chaque ligne d'un fichier et dans quel commit.

Flags-L-w-C-M
Exemple
git blame -L 10,30 file.tsx
git shortlog

Résumé groupé par auteur (utile pour les release notes).

Flags-s-n-e
Exemple
git shortlog -sne
git reflog

Historique local de tout ce que HEAD a touché. Bouée de sauvetage pour récupérer des commits perdus.

Sous-commandesshowexpiredelete
Exemple
git reflog
git reset --hard HEAD@{2}

Annuler

git reset

Déplace HEAD vers un autre commit, en altérant éventuellement le staging et le working dir.

Flags--soft--mixed--hard--keep--merge
Exemple
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert

Crée un nouveau commit qui annule les modifications d'un autre. Sûr sur les branches partagées.

Flags--no-commit-m--continue--abort
Exemple
git revert a1b2c3d
git clean

Supprime les fichiers non suivis du working directory. Opération destructive.

Flags-n-f-d-x-X-i
Exemple
git clean -nfd

Sous-modules

git submodule add

Ajoute un dépôt comme sous-module à l'intérieur du courant.

Flags-b--name
Exemple
git submodule add -b main https://github.com/user/lib.git vendor/lib
git submodule init / update

Initialise et télécharge les sous-modules définis dans .gitmodules.

Flags--init--recursive--remote--merge--rebase
Exemple
git submodule update --init --recursive
git submodule status / foreach / deinit

Voir l'état, exécuter une commande dans chaque sous-module ou le désactiver.

Flags--recursive
Exemple
git submodule foreach 'git pull origin main'

Hooks

Activer un hook manuel

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).

Exemple
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
git config core.hooksPath

Définit un répertoire de hooks partagé (versionnable, en dehors de .git).

Exemple
git config core.hooksPath .githooks
Husky

Outil JS qui versionne les hooks dans package.json et les installe automatiquement.

Exemple
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

Saute les hooks pre-commit et commit-msg (à utiliser avec parcimonie).

Exemple
git commit --no-verify -m "hotfix"

Avancé

git bisect

Recherche binaire dans l'historique pour trouver le commit qui a introduit un bug.

Sous-commandesstartgoodbadskipresetrun
Exemple
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect reset
git worktree

Crée plusieurs working directories liés au même .git, permettant de travailler sur plusieurs branches en parallèle.

Sous-commandesaddlistremoveprune
Exemple
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

Réécrit l'historique: combiner, réordonner, éditer ou supprimer des commits.

Sous-commandespickrewordeditsquashfixupdropexec
Exemple
git rebase -i HEAD~5
# pick    a1b2 feat: x
# squash  c3d4 fix typo
# reword  e5f6 chore: y
# drop    g7h8 wip
git filter-repo

Réécrit l'historique en masse, remplaçant moderne de git filter-branch. Utile pour supprimer des fichiers sensibles.

Flags--path--invert-paths--replace-text
Exemple
git filter-repo --path secrets.env --invert-paths
git archive

Crée un tarball ou zip du contenu d'une ref, sans .git.

Flags--format--prefix-o
Exemple
git archive --format=zip --prefix=app/ -o release.zip v1.0
git bundle

Empaquette des commits dans un seul fichier, transférable hors ligne.

Sous-commandescreateverifyunbundle
Exemple
git bundle create repo.bundle --all
git clone repo.bundle nova-pasta
git rev-parse

Résout une référence en SHA complet, court ou nom.

Flags--short--abbrev-ref--verify
Exemple
git rev-parse HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --short HEAD
git cat-file

Inspecte les objets Git (blobs, trees, commits, tags).

Flags-p-t-s
Exemple
git cat-file -p HEAD
git cat-file -t a1b2c3d
git ls-files / ls-tree

Liste les fichiers suivis (ls-files) ou le contenu d'une tree (ls-tree).

Flags--cached--others--ignored
Exemple
git ls-files
git ls-tree -r HEAD --name-only
git gc / fsck

Maintenance: garbage collection, intégrité, suppression d'objets isolés.

Flags--aggressive--prune=now
Exemple
git gc --aggressive --prune=now
git fsck --full
git sparse-checkout

Permet de n'avoir qu'un sous-ensemble de l'arbre localement, utile pour les gros monorepos.

Sous-commandesinitsetlistdisable
Exemple
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
git notes

Ajoute des notes aux commits sans changer leur SHA.

Sous-commandesaddshoweditremove
Exemple
git notes add -m "reviewed by QA" HEAD

Référence

Flux Git
┌──────────────┐  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
Merge vs Rebase vs Squash
Merge

Branches partagées, intégrer de grosses features en préservant le contexte, branches de release.

Avantages
  • Ne réécrit pas l'historique
  • Sûr en toute situation
  • Préserve la timeline réelle
Inconvénients
  • Historique avec losanges et bruit
  • git log plus difficile à lire
Rebase

Mettre à jour une feature branch locale avec main avant la PR. Garder l'historique linéaire.

Avantages
  • Historique linéaire et propre
  • git log lisible
  • git bisect plus efficace
Inconvénients
  • Réécrit les SHAs (JAMAIS sur des branches publiques)
  • Les conflits peuvent être répétitifs
  • Perd le contexte temporel
Squash

Avant de merger une feature avec plusieurs commits 'wip' ou 'fix typo' dans main.

Avantages
  • 1 commit propre par feature
  • main avec un historique ultra lisible
Inconvénients
  • 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.

Reset: soft, mixed, hard
--softGarde le staging et le working dir

Dé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.

Erreurs courantes et solutions
fatal: refusing to merge unrelated histories
Cause

Les deux dépôts n'ont pas de commit ancêtre commun.

Solution

git pull origin main --allow-unrelated-histories

Updates were rejected because the remote contains work that you do not have
Cause

Le distant a des commits que le local ignore.

Solution

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 branches
Cause

Il y a des modifications locales qui entreraient en conflit en changeant de branche.

Solution

git stash, git switch autre-branche, puis git stash pop.

CONFLICT (content): Merge conflict in <file>
Cause

Le merge ou rebase a touché les mêmes lignes qu'une autre branche.

Solution

Éditer entre <<<<<<< ======= >>>>>>> puis git add fichier suivi de git merge --continue. Pour abandonner: git merge --abort.

detached HEAD
Cause

Checkout d'un SHA ou d'une tag au lieu d'une branche.

Solution

Pour garder le travail: git switch -c nouvelle-branche. Pour jeter: git switch main.

Permission denied (publickey)
Cause

Clé SSH non configurée sur GitHub ou GitLab.

Solution

Exécuter ssh-keygen -t ed25519 -C "email" et ajouter ~/.ssh/id_ed25519.pub aux clés SSH du service.

fatal: Authentication failed (HTTPS)
Cause

GitHub n'accepte plus le mot de passe, il faut un Personal Access Token.

Solution

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 diverged
Cause

Les deux côtés ont des commits différents.

Solution

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)
Cause

Le distant a avancé, impossible de pousser sans intégrer d'abord.

Solution

git pull --rebase suivi de git push.

J'ai supprimé la mauvaise branche ou fait reset --hard et perdu du travail
Cause

Opération destructive sans sauvegarde.

Solution

git reflog pour trouver le SHA, puis git checkout -b recupere <sha>. Les commits restent ~30 jours avant le gc.

.gitignore ne fonctionne pas
Cause

Le fichier était déjà suivi avant d'être ignoré.

Solution

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 .env
Cause

git add . sans précaution.

Solution

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 CRLF
Cause

Différences de fin de ligne entre Windows et Unix.

Solution

git config --global core.autocrlf true sur Windows, ou input sur Mac et Linux.

Filename too long (Windows)
Cause

Limite de 260 caractères de Windows.

Solution

git config --system core.longpaths true