Disons que j'ai des modifications non validées dans mon répertoire de travail. Comment puis-je faire un patch à partir de ceux-là sans avoir à créer un commit?
git diff
pour les modifications non mises en scène. git diff --cached
pour les modifications planifiées.
Si vous n'avez pas encore validé les modifications, alors:
git diff > mypatch.patch
Mais il arrive parfois qu'une partie de ce que vous faites est constituée de nouveaux fichiers non suivis qui ne figurent pas dans votre sortie git diff
. Donc, une façon de faire un correctif est de tout organiser pour un nouveau commit (git add
chaque fichier, ou tout simplement git add .
) mais ne faites pas le commit, puis:
git diff --cached > mypatch.patch
Ajoutez l'option "binaire" si vous souhaitez ajouter des fichiers binaires au correctif (fichiers mp3, par exemple):
git diff --cached --binary > mypatch.patch
Vous pouvez ensuite appliquer le patch:
git apply mypatch.patch
Remarque: vous pouvez également utiliser --staged
comme synonyme de --cached
.
git diff
et git apply
fonctionneront pour les fichiers texte, mais ne fonctionneront pas pour les fichiers binaires.
Vous pouvez facilement créer un correctif binaire complet, mais vous devrez créer un commit temporaire. Une fois que vous avez effectué vos validations temporaires, vous pouvez créer le correctif avec:
git format-patch <options...>
Une fois le correctif créé, exécutez cette commande:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Cela annulera votre ou vos validations temporaires. Le résultat final laisse votre copie de travail (intentionnellement) sale avec les mêmes modifications que celles que vous aviez initialement.
Du côté du destinataire, vous pouvez utiliser la même astuce pour appliquer les modifications à la copie de travail, sans avoir l'historique de validation. Appliquez simplement le ou les patchs et git reset --mixed <SHA of commit *before* the patches>
.
Notez que vous devrez peut-être être bien synchronisé pour que toute cette option fonctionne. J'ai constaté des erreurs lors de l'application de correctifs alors que la personne qui les fabriquait n'avait pas apporté autant de modifications que moi. Il y a probablement des moyens de le faire fonctionner, mais je ne me suis pas penché sur la question.
Voici comment créer les mêmes correctifs dans Tortoise Git (non que je recommande d'utiliser cet outil):
Tortoise Git
-> Create Patch Serial
.Since
: FETCH_HEAD
fonctionnera si vous êtes bien synchronisé)Tortise Git
-> Show Log
reset "<branch>" to this...
.Mixed
Et comment les appliquer:
Tortoise Git
-> Apply Patch Serial
Tortise Git
-> Show Log
reset "<branch>" to this...
.Mixed
Pour créer un patch avec à la fois des fichiers modifiés et des nouveaux fichiers (mis en scène), vous pouvez exécuter:
git diff HEAD > file_name.patch
J'aime:
git format-patch HEAD~<N>
où <N>
est le nombre des derniers commits à enregistrer sous forme de patch.
Les détails sur l’utilisation de la commande se trouvent dans le DOC
UPD
Ici vous pouvez trouver comment les appliquer ensuite.
UPD Pour ceux qui n'ont pas eu l'idée de format-patch
Ajouter un alias:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
Ensuite, dans n'importe quel répertoire de votre référentiel de projet, exécutez:
git make-patch
Cette commande créera 0001-uncommited.patch
dans votre répertoire actuel. Patch contiendra toutes les modifications et les fichiers non suivis visibles pour la prochaine commande:
git status .
Si vous voulez faire du binaire, donnez une option --binary
lorsque vous exécutez git diff
.