Comment puis-je formater un patch avec ce que je cache

140

Dans git, je cache mes modifications. Est-il possible que je puisse créer un patch avec ce que je cache? Et puis appliquer ce correctif dans un autre référentiel (celui de mon collègue)?

Je sais git format-patch -1, mais je pense que c'est pour ce que j'ai commis. Mais je recherche la même chose pour les changements que j'ai cachés.

Et comment puis-je appliquer un correctif dans un autre référentiel?

Silverburgh
la source

Réponses:

156

Bien sûr, git stash showprend en charge ceci:

git stash show -p

Alors, utilisez

git stash list

pour connaître le numéro de la réserve que vous souhaitez exporter en tant que patch, puis

git stash show -p stash@{<number>} > <name>.patch

pour l'exporter.

Par exemple:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
la source
1
J'ai une question connexe concernant l'application d'un correctif. Disons que mon patch touche plusieurs fichiers. Existe-t-il un moyen d'appliquer le patch «de manière interactive»? Choisissez quels fichiers du correctif je dois appliquer le correctif? Puis-je faire cela?
silverburgh
1
@silverburgh: J'ai jeté un coup d'œil rapide man patchet je n'ai vu aucune option pour l'application de patch interactif. Cependant, étant donné que les fichiers de correctifs sont eux-mêmes des fichiers de texte brut, on édite généralement le correctif dans un éditeur de texte pour découper les parties pertinentes à appliquer patch. Alternativement, si vous appliquez le correctif dans un autre référentiel Git, vous pouvez tout appliquer, puis sélectivement les git checkoutfichiers que vous ne souhaitez pas modifier ( git checkoutavec un nom de fichier annule les modifications non organisées).
Greg Hewgill
1
@silverburgh vous pouvez restreindre l'ensemble des fichiers patchés en utilisant les paramètres "--exclude" et "--include" de git apply.
Kelvin
@silverburgh vous pouvez effectuer les opérations suivantes en supposant que vous disposez d'un correctif. appliquez complètement le patch, puis faites-le git add --interactive ${YOUR_FILES}et cela vous donnera la possibilité de vous engager partiellement.
Alex
15
Merci. Cela a fonctionné pour moi:git stash show -p stash@{1} > patch.txt
Ryan
63

Cette réponse fournit des informations sur l'enregistrement du correctif et sur son application là où vous souhaitez l'utiliser.

Pour cacher la sortie dans un fichier:

 git stash show -p --color=never > my-patch-name.patch

Vérifiez que le correctif semble bon:

git apply --stat my-patch-name.patch

Ne vérifiez aucune erreur:

git apply --check my-patch-name.patch

Appliquer le patch

git apply my-patch-name.patch
calvinf
la source
Celui-ci fonctionnait pour moi avec des fichiers de code en texte brut, mais je devais tenir compte des espaces blancs. Vérifiez que le correctif semble bon: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Appliquez le correctif: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Explication agréable et concise. Pour que cela fonctionne, je devais être à la racine du dépôt lors de l'application du patch, sinon je git applyn'ai pas pris le diff.
Max
16

Utilisation

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

pour obtenir une liste de vos éléments récemment cachés. Git crée en fait des objets de validation lorsque vous stockez.

Ce sont des commits comme tout le reste. Vous pouvez les découvrir dans une agence:

$> git checkout -b with_stash stash@{0}

Vous pouvez ensuite publier cette branche et votre collègue peut fusionner ou sélectionner ce commit.

peritus
la source
13

Les solutions ci-dessus ne fonctionneront pas pour les données binaires. Les éléments suivants en ajoutent le support:

git stash show stash@{0} -p --binary

Éditer

Remarque: je voulais juste ajouter un commentaire aux réponses ci-dessus mais ma réputation n'est pas suffisante.

Davide Guerri
la source
3

Je pense que cela pourrait être l'une des mises à jour de Git récemment. vous n'avez plus à patcher les modifications que vous avez cachées. vous pouvez simplement appliquer vos modifications cachées d'une branche à une autre.

dites sur la branche A que vous avez caché certaines modifications, appelées stash @ {1}.

vous passez maintenant à la branche B. vous pouvez simplement faire:

$git stash apply stash@{1}

ceci applique vos modifications de branche A à la branche B.

stucash
la source