← retour aux snippets

diff/patch: créer et appliquer un patch proprement

Comparer des fichiers ou dossiers, générer un patch unifié et l'appliquer avec prévisualisation.


objectif

Générer un patch unifié entre deux versions (fichier ou dossier) et l’appliquer en toute sécurité, avec dry-run et gestion des chemins.

code minimal

# créer un patch unifié (gère fichiers ajoutés/supprimés)
diff -ruN ./ancien ./nouveau > changes.patch

# appliquer le patch depuis le dossier cible
cd ./ancien
patch -p1 < ../changes.patch

utilisation

# patch pour un seul fichier
diff -u config.old config.new > config.patch
patch -p0 < config.patch

# prévisualiser l'application (dry-run)
patch --dry-run -p1 < changes.patch

# exclure certains motifs (ex: node_modules, fichiers minifiés)
diff -ruN --exclude='node_modules' --exclude='*.min.js' ./ancien ./nouveau > web.patch

# inverser un patch (rollback)
patch -R -p1 < changes.patch

# créer un patch depuis un dépôt git (worktree vs index)
git diff > worktree.patch             # modifications non indexées
git diff --cached > staged.patch      # modifications indexées

# vérifier et appliquer avec git (meilleure intégration)
git apply --check worktree.patch && git apply worktree.patch

# patchs email (série de commits) puis application
git format-patch -1 HEAD              # produit 0001-*.patch
git am 0001-*.patch                   # applique en créant un commit

variante(s) utile(s)

# générer un patch en ignorant les espaces (attention: peut masquer des soucis)
diff -ruN -w ./ancien ./nouveau > changes.patch

# limiter la profondeur et cibler des extensions spécifiques
diff -ruN --include='*.{py,sh}' ./ancien ./nouveau > code.patch

# coloriser la lecture du patch (GNU diffutils)
diff --color=always -u config.old config.new | less -R

# sauvegarder des rejets et backups lors de l'application
patch --backup --reject-file=- -p1 < changes.patch  # rejets sur stdout

notes

  • -r recurse, -u format unifié lisible, -N traite les fichiers absents comme vides (ajouts/suppressions).
  • le niveau -p lors de l’application retire des segments de chemin: -p0 garde tout, -p1 retire le premier segment.
  • générez et appliquez les patchs depuis des racines cohérentes pour éviter des erreurs de chemin.
  • utilisez --dry-run avant toute application réelle; en cas d’échec, patch peut produire des .rej.
  • sur macOS (BSD diff), --color peut être indisponible; gardez -u pour la portabilité.