Je fais quelque chose de très simple mal. J'essaie de préparer un fichier de correctif ordinaire, afin de pouvoir réappliquer certaines modifications:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Avec something_here
vide, cela fonctionne presque, mais les noms de fichiers ne sont pas corrects. Je pense qu'il me manque juste une option.
Dans la vraie vie, je vais faire une fusion après le paiement, donc le correctif peut échouer là-bas, mais vous voyez à quoi je veux en venir.
Modifier
Ma faute ici pour avoir posé la mauvaise question. La vraie question est la suivante: je veux enregistrer mes modifications, faire une fusion, puis réappliquer les modifications, si possible? Je l'ai mal posé car je suis habitué à utiliser patch pour résoudre ce genre de problèmes et il git diff
semblait que c'était ce qu'il voulait que je fasse.
Le commentaire de Charles Bailey avait la bonne réponse. Pour moi, git-apply est la bonne chose à faire (git-stash semble plus lourd que ce dont j'ai besoin et le rebasage et les bundles dépassent définitivement mon niveau de compétence actuel.) Je vais accepter la réponse que Charles a donnée (parce que vous ne peut accepter un commentaire). Merci pour toutes les suggestions.
Edit, 6 ans plus tard
Comme tous ceux qui connaissent le sujet le savent, j'ai surestimé la difficulté de git stash
. Presque tous les jours environ, j'utiliserai la séquence suivante:
$ git stash
$ git merge
$ git stash pop
patch
plutôt quegit apply
?git stash
ou d'autres outils git?git stash
c'est la solution la plus simple pour ce que vous essayez de faire, mais il existe de nombreuses approches qui fonctionnent.git-svn
.Réponses:
Si vous souhaitez utiliser patch, vous devez supprimer les
a/
b/
préfixes que git utilise par défaut. Vous pouvez le faire avec l'--no-prefix
option (vous pouvez également le faire avec l'-p
option patch ):Cependant, il est généralement plus facile d'utiliser directement
git diff
, puis d'utiliser la sortie pour alimentergit apply
.La plupart du temps, j'essaie d'éviter d'utiliser des patchs textuels. Habituellement, un ou plusieurs commits temporaires combinés à un rebase,
git stash
et les bundles sont plus faciles à gérer.Pour votre cas d'utilisation, je pense que
stash
c'est le plus approprié.la source
git diff --no-prefix master > diff.patch
et puisgit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
avant d'émettre la dernière commande.patch
dehors de git (peut-être en utilisant un fichier de correctif généré pardiff
) dans un cas d'utilisation plus général.Il suffit d'utiliser
-p1
: vous devrez de toute façon utiliser-p0
dans le--no-prefix
cas, vous pouvez donc simplement omettre--no-prefix
et utiliser-p1
:la source
git diff
renvoie une ligne quipatch
ignore.git apply
est la voie à suivre.Les diffs git ont un segment de chemin supplémentaire ajouté aux chemins de fichier. Vous pouvez supprimer l'entrée this dans le chemin en spécifiant -p1 avec patch, comme ceci:
la source
save.patch
fichier n'importe où (y compris les fichiers binaires).git apply <file>
la source
git diff > save.patch
etgit checkout .
au lieu d'une réinitialisation, mais oui ...git apply
ou rendre le diff pertinent à votre état et le pointeur vers le dernier commit disponible. Fairegit diff
n'a tout simplement rien fait du toutgit apply
. Le problèmegit diff
est (je pense) de l'utilisationgit reset
- les relations entre le repo, l'index et la zone de travail sont le problème.Une astuce utile pour éviter de créer des fichiers de correctifs temporaires:
la source
git stash show -p stash@{3} | patch -p1 -d [dst-dir]