Disons que j’ai des modifications non validées dans mon répertoire de travail. Comment puis-je créer un patch à partir de ceux sans avoir à créer un commit?
git diff
pour les changements non planifiés. git diff --cached
pour les changements par étapes.
Si vous n’avez pas encore engagé les modifications, alors:
git diff > mypatch.patch
Mais il arrive parfois qu’une partie de ce que vous faites soit de nouveaux fichiers qui ne sont pas suivis et qui ne seront pas dans votre sortie git diff
. Ainsi, une façon de faire un patch consiste à tout mettre en scène pour un nouveau commit (mais ne le faites pas), puis:
git diff --cached > mypatch.patch
Ajoutez l’option ‘binary’ si vous voulez append des fichiers binarys au patch (ex: fichiers mp3):
git diff --cached --binary > mypatch.patch
Vous pouvez ensuite appliquer le patch:
git apply mypatch.patch
git diff
et git apply
fonctionneront pour les fichiers texte, mais ne fonctionneront pas pour les fichiers binarys.
Vous pouvez facilement créer un patch binary complet, mais vous devrez créer un commit temporaire. Une fois vos validations temporaires effectuées, vous pouvez créer le patch avec:
git format-patch
Après avoir créé le correctif, exécutez cette commande:
git reset --mixed
Cela annulera vos engagements temporaires. Le résultat final laisse votre copie de travail (intentionnellement) sale avec les mêmes modifications que vous aviez à l’origine.
Du côté de la réception, vous pouvez utiliser le même truc pour appliquer les modifications à la copie de travail sans avoir l’historique des validations. Appliquez simplement le ou les patch (s) et git reset --mixed
.
Notez que vous devrez peut-être être bien synchronisé pour que toute cette option fonctionne. J’ai vu des erreurs lors de l’application de patchs lorsque la personne qui les réalisait n’avait pas réduit autant de changements que j’avais. Il y a probablement des moyens de le faire fonctionner, mais je ne l’ai pas beaucoup regardé.
Voici comment créer les mêmes correctifs dans Tortoise Git (ce n’est pas ce que je recommande d’utiliser cet outil):
Tortoise Git
-> Create Patch Serial
FETCH_HEAD
( Since
: FETCH_HEAD
fonctionnera si vous êtes bien synchronisé) Tortise Git
-> Show Log
reset "" to this...
Mixed
Et comment les appliquer:
Tortoise Git
-> Apply Patch Serial
Tortise Git
-> Show Log
reset "" to this...
Mixed
Pour créer un patch avec à la fois les fichiers modifiés et les nouveaux fichiers (mis en scène), vous pouvez exécuter:
git diff HEAD > file_name.patch
Si vous voulez faire du binary, donnez une option --binary
lorsque vous exécutez git diff
.