Créer un patch git à partir des modifications dans le répertoire de travail actuel
880
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-ci sans avoir à créer de commit?
git format-patchcomprend également des différences binaires et quelques méta-informations. En fait, ce serait le meilleur pari pour créer un patch, mais afaik, cela ne fonctionne que pour les sources / modifications enregistrées, non?
Eric
20
Parfois, il peut être utile de créer un patch par rapport au répertoire courant. Pour ce faire, utilisezgit diff --relative
ejboy
30
git diff> a.patch pour l'écrire dans un fichier
qasimzee
139
Verset bordant le sarcastique, la réponse ci-dessous est plus utile.
Air
1865
Si vous n'avez pas encore validé les modifications, alors:
git diff > mypatch.patch
Mais parfois, il arrive qu'une partie des choses que vous faites sont de nouveaux fichiers qui ne sont pas suivis et ne seront pas dans votre git diffsortie. Donc, une façon de faire un patch est de tout mettre en scène pour un nouveau commit ( git addchaque fichier, ou juste 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 patch (par exemple des fichiers mp3):
git diff --cached --binary > mypatch.patch
Vous pouvez ensuite appliquer le patch:
git apply mypatch.patch
Remarque: Vous pouvez également utiliser --stagedcomme synonyme de --cached.
Merci beaucoup pour l'exemple. Contrairement à la réponse acceptée, vous montrez aux commandes comment le faire et pas seulement à parler. Très utile et a fonctionné sans faille pour moi :)
nuala
4
J'ai fait exactement cela et j'ai obtenu "fatal: entrée non reconnue" lors de l'exécution de git apply. Une idée de ce qui peut provoquer cela et comment y remédier?
Vitaly
6
@Vitaly: votre patch est-il lisible si vous l'ouvrez avec un éditeur de texte? il doit être propre et sans caractères étranges, par exemple si le paramètre color.diff est défini, votre patch aura des «caractères de couleur» qui peuvent faire échouer «git apply», dans ce cas essayez git diff --no-color. Sinon, cela ressemble à un problème d'encodage.
jcarballo
3
Concernant les "nouveaux fichiers non suivis": "git diff" et "git diff --cached" ne fonctionnent que si "git add <file>" a été appelé en premier. (Je suis nouveau sur git et je me demandais pourquoi j'avais un patch vide à chaque fois)
Anonyme
5
Cela m'a fait sortir d'un enfer étrange de fusion / rebase assez facilement, merci :)
John Hunt
86
git diffet git applyfonctionnera pour les fichiers texte, mais ne fonctionnera pas pour les fichiers binaires.
Vous pouvez facilement créer un patch binaire complet, mais vous devrez créer un commit temporaire. Une fois que vous avez effectué vos validations temporaires, vous pouvez créer le patch avec:
git format-patch <options...>
Après avoir créé le correctif, exécutez cette commande:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Cela annulera vos validations temporaires. Le résultat final laisse votre copie de travail (intentionnellement) sale avec les mêmes modifications que vous aviez à l'origine.
Côté réception, vous pouvez utiliser la même astuce pour appliquer les modifications à la copie de travail, sans avoir l'historique de validation. Appliquez simplement le (s) patch (s) et git reset --mixed <SHA of commit *before* the patches>.
Notez que vous devrez peut-être être bien synchronisé pour que cette option fonctionne. J'ai vu des erreurs lors de l'application de correctifs alors que la personne qui les fabriquait n'avait pas supprimé autant de modifications que moi. Il y a probablement des moyens de le faire fonctionner, mais je n'y suis pas allé bien loin.
Voici comment créer les mêmes correctifs dans Tortoise Git (pas que je recommande d'utiliser cet outil):
Validez vos changements de travail
Cliquez avec le bouton droit sur le répertoire racine de la branche et cliquez sur Tortoise Git->Create Patch Serial
Choisissez la plage la plus appropriée ( Since: FETCH_HEADfonctionnera si vous êtes bien synchronisé)
Créer le (s) patch (s)
Cliquez avec le bouton droit sur le répertoire racine de la branche et cliquez sur Tortise Git->Show Log
Cliquez avec le bouton droit sur la validation avant vos validations temporaires, puis cliquez surreset "<branch>" to this...
Sélectionnez l' Mixedoption
Et comment les appliquer:
Cliquez avec le bouton droit sur le répertoire racine de la branche et cliquez sur Tortoise Git->Apply Patch Serial
Sélectionnez le ou les correctifs appropriés et appliquez-les
Cliquez avec le bouton droit sur le répertoire racine de la branche et cliquez sur Tortise Git->Show Log
Cliquez avec le bouton droit sur la validation avant les validations du correctif, puis cliquez surreset "<branch>" to this...
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.patchdans votre répertoire actuel. Le correctif contiendra toutes les modifications et les fichiers non suivis qui sont visibles pour la commande suivante:
Nous pourrions également spécifier les fichiers, pour inclure uniquement les fichiers avec des changements relatifs, en particulier lorsqu'ils s'étendent sur plusieurs répertoires ex
J'ai trouvé que cela n'était pas spécifié dans les réponses ou les commentaires, qui sont tous pertinents et corrects, j'ai donc choisi de l'ajouter. Explicite vaut mieux qu'implicite!
Réponses:
git diff
pour les modifications non mises en scène.git diff --cached
pour les changements par étapes.la source
git format-patch
comprend également des différences binaires et quelques méta-informations. En fait, ce serait le meilleur pari pour créer un patch, mais afaik, cela ne fonctionne que pour les sources / modifications enregistrées, non?git diff --relative
Si vous n'avez pas encore validé les modifications, alors:
Mais parfois, il arrive qu'une partie des choses que vous faites sont de nouveaux fichiers qui ne sont pas suivis et ne seront pas dans votre
git diff
sortie. Donc, une façon de faire un patch est de tout mettre en scène pour un nouveau commit (git add
chaque fichier, ou justegit add .
) mais ne faites pas le commit, puis:Ajoutez l'option «binaire» si vous souhaitez ajouter des fichiers binaires au patch (par exemple des fichiers mp3):
Vous pouvez ensuite appliquer le patch:
Remarque: Vous pouvez également utiliser
--staged
comme synonyme de--cached
.la source
git diff --no-color
. Sinon, cela ressemble à un problème d'encodage.git diff
etgit apply
fonctionnera pour les fichiers texte, mais ne fonctionnera pas pour les fichiers binaires.Vous pouvez facilement créer un patch binaire complet, mais vous devrez créer un commit temporaire. Une fois que vous avez effectué vos validations temporaires, vous pouvez créer le patch avec:
Après avoir créé le correctif, exécutez cette commande:
Cela annulera vos validations temporaires. Le résultat final laisse votre copie de travail (intentionnellement) sale avec les mêmes modifications que vous aviez à l'origine.
Côté réception, vous pouvez utiliser la même astuce pour appliquer les modifications à la copie de travail, sans avoir l'historique de validation. Appliquez simplement le (s) patch (s) et
git reset --mixed <SHA of commit *before* the patches>
.Notez que vous devrez peut-être être bien synchronisé pour que cette option fonctionne. J'ai vu des erreurs lors de l'application de correctifs alors que la personne qui les fabriquait n'avait pas supprimé autant de modifications que moi. Il y a probablement des moyens de le faire fonctionner, mais je n'y suis pas allé bien loin.
Voici comment créer les mêmes correctifs dans Tortoise Git (pas 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
optionEt comment les appliquer:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
optionla source
Pour créer un patch avec à la fois des fichiers modifiés et nouveaux (par étapes), vous pouvez exécuter:
la source
git diff --cached > mypatch.patch
ne fonctionne pas.file_name.patch
être utilisé par lapatch
commande? Sont-ils compatibles entre eux?J'aime:
où
<N>
est le nombre de dernières validations à enregistrer en tant que correctifs.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 d'
format-patch
ajouter un alias:
Ensuite, dans n'importe quel répertoire de votre référentiel de projet, exécutez:
Cette commande créera
0001-uncommited.patch
dans votre répertoire actuel. Le correctif contiendra toutes les modifications et les fichiers non suivis qui sont visibles pour la commande suivante:la source
Si vous voulez faire du binaire, donnez une
--binary
option lorsque vous exécutezgit diff
.la source
Nous pourrions également spécifier les fichiers, pour inclure uniquement les fichiers avec des changements relatifs, en particulier lorsqu'ils s'étendent sur plusieurs répertoires ex
J'ai trouvé que cela n'était pas spécifié dans les réponses ou les commentaires, qui sont tous pertinents et corrects, j'ai donc choisi de l'ajouter. Explicite vaut mieux qu'implicite!
la source