Quelle est la différence entre 'git format-patch et' git diff '?

92

Je ne vois pas de différence entre la sortie de 'git format-patch' et 'git diff', y en a-t-il? Et ne pourrai-je pas utiliser 'git diff' pour produire un patch puis l'appliquer en utilisant git apply?

Mon problème est que j'ai des modifications ajoutées à l'index, mais apparemment git format-patch n'accepte que les commits, donc si je peux utiliser la sortie de diff, alors je peux utiliser cette commande pour produire un correctif pour les modifications de l'index:

git diff --cached > index.patch
Rafid
la source

Réponses:

129

Un patch créé avec git format-patchcomprendra également des méta-informations sur le commit (committer, date, commit message, ...) et contiendra des diff de données binaires. Tout sera formaté sous forme de courrier électronique, de sorte qu'il puisse être facilement envoyé. La personne qui le reçoit peut alors recréer le commit correspondant avec git amet toutes les méta-données seront intactes. Il peut également être appliqué git applycar il s'agit d'un super-ensemble d'un diff simple.

Un patch créé avec git diffsera un simple diff avec contexte (pensez diff -u). Il peut également être appliqué avec git applymais les méta-données ne seront pas recréées (car elles ne sont pas présentes).

En résumé, git format-patchest utile pour transmettre un commit, tandis que git diffc'est utile pour obtenir un différentiel entre deux arbres.

Sylvain Defresne
la source
12

À partir des manuels, git-format-patch prépare des correctifs adaptés à l'envoi d'e-mails, tandis que git-diff montre les changements.

Ce sont deux choses différentes et ont des objectifs différents, ils produisent juste un format de patch. Mais git-format-patchajoute des données sur un commit (date, auteur, message de commit) et le regroupe dans un format qui convient à l'envoi en tant que message électronique Unix (bien que ce ne soient que des fichiers, ils peuvent donc être envoyés à d'autres méthodes et toujours appliqués par git-am).

Génère également git-format-patchun fichier de correctif pour chaque validation dans la plage que vous spécifiez. Ces modifications seront ajoutées en tant que commits à votre référentiel avec git-am.

git-diffmontre simplement la différence entre les deux états que vous demandez et peut être utilisé pour créer un fichier de correctif. Mais ce n'est qu'un fichier de correctif normal et l'application du correctif ne fera que changer l'état du répertoire de travail.

Et oui, vous pouvez créer un patch pour votre index de cette façon.

Abizern
la source
Merci. Quelle est la particularité du courrier UNIX pour qu'ils aient conçu le correctif basé sur celui-ci?
Rafid le
7
Il n'y a rien de vraiment spécial. C'est juste que git a été conçu par Linus Torvalds dont le workflow impliquait l'envoi et la réception de correctifs par e-mail pour validation avant intégration dans le noyau Linux.
Sylvain Defresne
Git a été conçu par Linus Torvalds pour conserver le noyau Linux. Le courrier Unix était un format courant.
Abizern
1

Le fichier de patch peut être généré avec la git diffcommande, mais en comparaison avec le patch généré par la git format-patchcommande, les différences majeures sont:

  1. Pas de métadonnées sur un commit (comme la date, l'auteur, le message de commit, etc.);
  2. Aucune statistique sur le diff (diffstat, comme x fichiers modifiés, y insertions (+), z suppressions (-));
  3. Pas de diffs binaires, seulement des diffs textuels.

entrez la description de l'image ici

Pour générer le fichier de correctif pour tous les fichiers modifiés (dans l'index ou le répertoire de travail):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Pour appliquer le fichier de correctif généré:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Symbole
la source