Git Create Patch : les Commandes à Connaître (`diff`, `format-patch`)
Blog, Développement, Tutoriels

Git Create Patch : les Commandes à Connaître (`diff`, `format-patch`)

Vous avez besoin de partager des modifications de code sans faire un `git push` ? Vous ne savez pas s’il faut utiliser `git diff` ou `git format-patch` ? Comment être sûr de créer un fichier .patch propre que votre collègue pourra appliquer sans problème ?

Cet article vous montre les commandes exactes pour créer et appliquer un patch Git dans toutes les situations, que vos changements soient déjà dans un commit ou non. On va droit au but avec les commandes à copier-coller.

Tableau Comparatif : `git diff` vs `git format-patch` pour Créer un Patch

Pour choisir la bonne commande en un clin d’œil, voici le résumé. Tout dépend si vos modifications sont déjà commitées.

Commande Cas d’usage idéal Avantages Commande pour l’appliquer
git diff Modifications non commitées (working directory/staged) Simple, rapide, idéal pour un aperçu des changements. git apply
git format-patch Un ou plusieurs commits existants Conserve les métadonnées (auteur, date, message de commit), format standard pour les mailing lists. git am

Méthode 1 : Créer un Patch avec `git diff` (Pour les Modifications non Commitées)

La commande git diff est la solution la plus simple. Elle est parfaite pour les changements qui ne sont pas encore enregistrés dans l’historique de votre projet. On parle ici des fichiers que vous venez de modifier sur votre machine.

Il y a deux cas de figure principaux pour `git diff` : les modifications dans votre répertoire de travail et celles qui sont déjà dans l’index (staged).

Pour les modifications dans le « working directory »

Le « working directory » contient les fichiers que vous avez modifiés mais pas encore ajoutés à l’index avec git add. Pour créer un patch de ces changements, la commande est très directe.

git diff > mon_patch.patch

Cette commande compare votre répertoire de travail avec le dernier commit et enregistre la différence dans le fichier mon_patch.patch. C’est tout. Le fichier est prêt à être partagé.

Pour les modifications ajoutées à l’index (« staged »)

Si vous avez déjà utilisé git add pour préparer vos modifications pour le prochain commit, elles sont dans l’index (« staged »). La commande change un tout petit peu.

git diff --staged > mon_patch_staged.patch

L’option --staged (ou --cached) indique à Git de comparer l’index avec le dernier commit. C’est utile si vous voulez créer un patch uniquement pour les changements que vous avez validés, en ignorant d’autres modifications en cours dans votre working directory.

Méthode 2 : Créer un Patch avec `git format-patch` (Pour les Commits)

Quand vos modifications sont déjà dans des commits, git format-patch est la meilleure option. C’est une commande plus puissante et plus complète que git diff. Son principal avantage est qu’elle conserve toutes les métadonnées du commit : l’auteur, l’adresse email, la date et le message de commit.

Chaque patch généré est formaté comme un email, ce qui est le standard pour contribuer à beaucoup de projets open source (comme le noyau Linux).

Créer un patch pour le dernier commit

Pour créer un patch à partir du commit le plus récent (celui sur lequel `HEAD` pointe), utilisez l’option -1.

git format-patch -1 HEAD

Git va créer un fichier avec un nom comme 0001-votre-message-de-commit.patch. Le nom est généré automatiquement à partir du message de votre commit, ce qui est très pratique pour s’y retrouver.

Créer des patchs pour plusieurs commits

Vous pouvez aussi créer plusieurs fichiers patch en une seule commande, un pour chaque commit récent. Par exemple, pour générer des patchs pour les 3 derniers commits :

git format-patch -3 HEAD

Cela va générer trois fichiers : 0001-....patch, 0002-....patch, et 0003-....patch. La personne qui les reçoit devra les appliquer dans le bon ordre pour reconstruire l’historique.

Créer des patchs pour une série de commits (range)

Pour encore plus de contrôle, vous pouvez spécifier une plage de commits en utilisant leur SHA. C’est très utile si vous voulez exporter les changements d’une branche de fonctionnalités spécifique.

git format-patch <SHA_commit_debut>

Cette commande créera des patchs pour tous les commits qui ont eu lieu après le SHA spécifié, jusqu’au commit actuel. C’est une bonne technique pour extraire tout le travail d’une branche par rapport à la branche `main`.

💡 Astuce de pro La commande git format-patch main..feature_branch créera des patchs pour tous les commits qui sont dans feature_branch mais pas dans main. C’est la façon la plus courante de préparer des modifications pour une revue.

Comment Appliquer un Patch Git ? (`git apply` vs `git am`)

Créer le patch, c’est la première étape. L’appliquer correctement est tout aussi important. Le choix de la commande dépend de la manière dont le patch a été créé.

  • Un patch créé avec git diff s’applique avec git apply.
  • Un patch créé avec git format-patch s’applique avec git am.

Appliquer un patch `diff` avec `git apply`

La commande git apply est simple. Elle prend le fichier .patch et modifie les fichiers de votre répertoire de travail. Attention, elle ne crée pas de commit. C’est à vous de vérifier les changements et de les commiter ensuite.

git apply mon_patch.patch

Avant d’appliquer un patch, il est prudent de vérifier s’il peut être appliqué sans conflit. L’option --check est là pour ça. Elle ne modifie rien mais vous dira si l’application va réussir.

git apply --check mon_patch.patch

S’il n’y a aucune sortie, c’est que tout est bon. Sinon, la commande vous signalera les conflits potentiels.

Appliquer un patch `format-patch` avec `git am`

La commande git am (pour « apply mailbox ») est bien plus puissante. Elle lit le fichier patch, applique les modifications ET recrée le commit original. Elle restaure l’auteur, la date et le message de commit. C’est la méthode à privilégier pour conserver un historique Git propre et fidèle.

git am 0001-votre-message-de-commit.patch

Si vous avez plusieurs patchs à appliquer (0001-..., 0002-...), vous pouvez les appliquer tous en une fois :

git am *.patch

Git les appliquera dans le bon ordre numérique. En cas de conflit, git am mettra le processus en pause, vous laissant le soin de résoudre le conflit avant de continuer avec git am --continue ou d’annuler avec git am --abort.

FAQ – Questions Fréquentes sur la Création de Patchs Git

Voici quelques réponses aux questions courantes sur la création et l’application de patchs avec Git.

  • Peut-on créer un patch pour des fichiers binaires ?
    Oui. git format-patch gère mieux les fichiers binaires que git diff. La commande `diff` peut produire un patch qui n’est pas toujours applicable. Pour les binaires, privilégiez un commit puis un `format-patch`.
  • Comment annuler l’application d’un patch ?
    Si vous avez utilisé git apply et n’avez pas encore commité, vous pouvez annuler avec git checkout .. Il existe aussi une option git apply --reverse mon_patch.patch pour annuler un patch spécifique. Si vous avez utilisé git am, un commit a été créé. Vous pouvez l’annuler avec git reset --hard HEAD~1.
  • Pourquoi mon patch ne s’applique pas ?
    La raison la plus fréquente est un conflit. Le code de la branche sur laquelle vous essayez d’appliquer le patch a changé depuis la création du patch. Il faut résoudre les conflits manuellement.
  • Quelle est la différence principale entre `git apply` et `git am` ?
    Pour résumer : git apply modifie juste les fichiers, l’historique n’est pas touché. git am modifie les fichiers ET crée un nouveau commit qui respecte l’auteur et le message d’origine.

Vous pourriez également aimer...