web-dev-qa-db-fra.com

Créez un patch git à partir des modifications du répertoire de travail actuel

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?

757
vrish88

git diff pour les modifications non mises en scène. git diff --cached pour les modifications planifiées.

352
sigjuice

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.

1611
jcarballo

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):

  1. Commettez vos changements de travail
  2. Cliquez avec le bouton droit sur le répertoire racine de la branche, puis cliquez sur Tortoise Git -> Create Patch Serial .
    1. Choisissez la plage qui convient le mieux (Since: FETCH_HEAD fonctionnera si vous êtes bien synchronisé)
    2. Créer le ou les patchs
  3. Faites un clic droit sur le répertoire racine de la branche et cliquez sur Tortise Git -> Show Log
  4. Cliquez avec le bouton droit sur la validation avant votre ou vos validations temporaires, puis cliquez sur reset "<branch>" to this....
  5. Sélectionnez l'option Mixed

Et comment les appliquer:

  1. Faites un clic droit sur le répertoire racine de la branche et cliquez sur Tortoise Git -> Apply Patch Serial
  2. Sélectionnez les correctifs appropriés et appliquez-les.
  3. Faites un clic droit sur le répertoire racine de la branche et cliquez sur Tortise Git -> Show Log
  4. Cliquez avec le bouton droit sur la validation avant la (les) validation (s) du correctif, puis cliquez sur reset "<branch>" to this....
  5. Sélectionnez l'option Mixed
79

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
30
Ionel Sirbu

J'aime:

git format-patch HEAD~<N>

<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 .
10
Eugen Konkov

Si vous voulez faire du binaire, donnez une option --binary lorsque vous exécutez git diff.

9
gitster