Skip to content

Instantly share code, notes, and snippets.

@enimiste
Last active July 28, 2026 06:40
Show Gist options
  • Select an option

  • Save enimiste/951931daef5a3d22d58af8fabbd8c99a to your computer and use it in GitHub Desktop.

Select an option

Save enimiste/951931daef5a3d22d58af8fabbd8c99a to your computer and use it in GitHub Desktop.
Commandes usuelles de Git

Cheatsheet Git — Merge & gestion de branches


1. Configuration

Éditeur par défaut

git config --global core.editor "code --wait"    # VS Code
git config --global core.editor "nano"            # Nano
git config --global core.editor "vim"             # Vim

2. Branches — Gestion

Créer une branche

git checkout main
git checkout -b nouvelle-branche                          # depuis la branche courante
git checkout -b nouvelle-branche origin/branche-source   # depuis une branche distante, nouveau nom + tracking auto
git checkout --track origin/branche-source               # depuis une branche distante, même nom + tracking auto

Lister les branches

git branch                  # branches locales
git branch -r               # branches distantes
git branch -a               # toutes (locales + distantes)

Renommer une branche (locale + distante)

git branch -m ancien-nom nouveau-nom     # depuis une autre branche
git branch -m nouveau-nom                # si on est dessus

git push origin --delete ancien-nom      # supprimer l'ancienne distante
git push origin -u nouveau-nom           # pousser la nouvelle + lier le tracking

git branch --set-upstream-to=origin/nouveau-nom nouveau-nom   # mettre à jour le tracking local

⚠️ Si des collègues ont l'ancienne branche en local, ils doivent mettre à jour leur tracking :

git fetch origin --prune
git branch -u origin/nouveau-nom nouveau-nom

Supprimer une branche

git branch -d nom-branche               # locale, refuse si pas mergée
git branch -D nom-branche               # locale, force la suppression
git push origin --delete nom-branche    # distante

3. Branches — Synchronisation avec le remote

git fetch origin                                   # mettre à jour les refs distantes
git fetch origin nom-branche:nom-branche           # mettre à jour une branche locale depuis la remote sans checkout
git fetch origin --prune                           # nettoie les références aux branches distantes supprimées

4. Tags — Gestion

Créer et pousser un tag

git tag nom-tag                              # tag léger sur le commit courant
git tag -a nom-tag -m "message du tag"      # tag annoté (recommandé, avec message)
git tag -a nom-tag <hash> -m "message"      # tag annoté sur un commit spécifique
git tag -a nom-tag                           # ouvre l'éditeur pour un message long

git push origin nom-tag                     # pousser un tag spécifique
git push origin --tags                      # pousser tous les tags locaux

Tag léger = simple pointeur sur un commit. Tag annoté = objet Git complet avec auteur, date et message — recommandé pour les releases.

Supprimer un tag

git tag -d nom-tag                      # local
git push origin --delete nom-tag        # distant
git fetch --prune --prune-tags          # synchronise les suppressions de tags distants en local (Git 2.17+)

5. Commit

git commit -m "Titre du commit" -m "Description plus détaillée sur plusieurs lignes si besoin."
git commit              # ouvre l'éditeur pour rédiger titre + description librement

Chaque -m ajoute un paragraphe séparé par une ligne vide. Titre court (~50 caractères), description plus longue pour expliquer le pourquoi. Pour annuler : quitte l'éditeur sans sauvegarder (message vide → Aborting commit due to empty commit message).


6. Merge

Mise en place

git checkout main
git checkout -b integration       # branche cible créée depuis main

Merge classique (avec commit de merge)

git merge branche1
git merge branche2 --no-edit      # sans ouvrir l'éditeur pour le message
git merge branche3 --no-ff        # force un commit de merge même en cas de fast-forward

Merge sans commit de merge (squash)

git merge branche1 --squash
git merge branche2 --squash
git commit -m "feat: integration des branches"

--squash applique les changements en staging sans créer de commit de merge. Résultat : un seul commit final propre, mais l'historique des branches sources n'apparaît plus dans le log.

Merger depuis une branche distante

git merge origin/ma-branche
git merge origin/ma-branche --squash --no-edit

7. Résolution de conflits

Résolution manuelle (fichiers texte)

git status                          # voir les fichiers en conflit
git diff --name-only --diff-filter=U    # version concise
git add <fichier>                   # marquer le conflit comme résolu après édition manuelle
git merge --continue                # reprendre le merge après résolution

Prendre la version "theirs" ou "ours"

git checkout --theirs chemin/vers/fichier   # prend la version de la branche mergée
git checkout --ours chemin/vers/fichier     # prend la version de la branche courante
git add chemin/vers/fichier                 # indispensable : marque le conflit comme résolu

--ours = la branche qui reçoit le merge (celle sur laquelle tu es). --theirs = la branche que tu merges (locale ou distante). Ces notions ne sont pas liées à local/distant mais au sens du merge en cours.

Appliquer theirs sur tous les fichiers en conflit

git checkout --theirs .
git add .

Ou cibler certains types de fichiers :

git checkout --theirs -- '*.png' '*.pdf'
git add '*.png' '*.pdf'

One-liner pour les binaires en conflit

git diff --name-only --diff-filter=U | grep -E '\.(png|jpg|bin|pdf)$' | xargs git checkout --theirs --
git diff --name-only --diff-filter=U | grep -E '\.(png|jpg|bin|pdf)$' | xargs git add

Finaliser ou annuler

git commit              # finaliser le merge après résolution
git merge --abort       # annuler le merge en cours et revenir à l'état d'avant

8. Annuler / Corriger

:q!                          # quitter vim sans sauvegarder → annule le commit de merge en cours
git reset --soft HEAD~1      # annule le dernier commit, garde les modifications en staging
git reset --hard HEAD~1      # annule le dernier commit, supprime les modifications
git merge --abort            # annule un merge en cours avec conflits non résolus

Rollback d'un reset via reflog

git reflog                   # affiche l'historique de tous les mouvements de HEAD
git reset --hard HEAD@{2}    # restaure l'état avant les resets (via ref reflog)
git reset --hard <hash>      # ou via le hash du commit cible

Le reflog est disponible en local uniquement, conservé ~90 jours par défaut.

Annuler les modifications sur un fichier

git checkout -- nom-fichier  # restaure le fichier à l'état du dernier commit
git restore nom-fichier      # idem, syntaxe moderne (Git 2.23+)
git restore .                # restaure tous les fichiers modifiés

⚠️ Les modifications non commitées sont perdues définitivement, le reflog ne peut pas les récupérer.


9. Worktree

git -C chemin/vers/worktree status          # git status depuis le repo parent
git -C chemin/vers/worktree log --oneline   # fonctionne avec n'importe quelle commande git
git -C chemin/vers/worktree diff

10. Visualiser / Comparer

git log --oneline --graph --all             # vue graphique de toutes les branches et commits
git diff HEAD~1                             # vérifier ce qu'a changé le dernier merge

git diff branche1 branche2                  # comparer deux branches locales
git diff branche1 origin/branche2           # comparer une locale et une distante
git diff origin/branche1 origin/branche2    # comparer deux branches distantes

git log branche1..branche2                  # commits présents dans branche2 mais pas dans branche1
git log branche1...branche2                 # commits qui diffèrent dans les deux sens

Points de vigilance généraux

  • Même si les branches partent du même commit, des conflits peuvent survenir si deux branches modifient les mêmes lignes.
  • Teste/compile après chaque merge pour isoler les régressions.
  • --squash masque l'historique des branches sources dans le log — choix à faire en connaissance de cause.
  • git fetch --prune nettoie les références aux branches distantes supprimées.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment