76 votes

Pourquoi `git stash -p` échoue parfois?

Je ♥ git stash -p . Mais parfois, après une session satisfaisante de y , n et s , je comprends ceci:

 Saved working directory and index state WIP on foo: 9794c1a lorum ipsum
error: patch failed: spec/models/thing_spec.rb:65
error: spec/models/thing_spec.rb: patch does not apply
Cannot remove worktree changes
 

Pourquoi?

29voto

Mu Mind Points 5142

Ce qui se passe pour moi à chaque fois que j'essaie de diviser un morceau en petits mecs qui sont trop rapprochées (moins de 3 lignes entre les changements). L'explication est que le patch a des lignes de contexte qui sont en conflit avec vos changements locaux. Une explication plus détaillée ci-dessous.


Supposons que j'ai un repo git avec ces modifications non validées:

--- a/pangram
+++ b/pangram
@@ -1,8 +1,8 @@
 The
-quick
+relatively quick
 brown
 fox
-jumps
+walks
 over
 the
 lazy

Si je planque le premier changement, j'obtiens:

--- a/pangram
+++ b/pangram
@@ -1,5 +1,5 @@
 The
-quick
+relatively quick
 brown
 fox
 jumps

L' git stash commande en fait de réussir à sauver le patch (vérifiez git stash list), mais alors git utilise ce patch dans le sens inverse pour retirer le planqué des changements de mon travail dir. Le contexte après le beau gosse a des "sauts", qui ne correspond pas à la "marche" toujours dans mon travail dir. Donc git écope avec

erreur: patch failed: pangram:1
erreur: pangram: patch ne s'applique pas
Impossible de supprimer worktree changements

et les feuilles de tous les changements dans ma façon de travailler dir, et la cachette devient assez beaucoup de valeur.


Je dirais que c'est un bug dans le git du morceau de fractionnement du support. Si il sait que c'est le fractionnement des changements de trop près, il pourrait raser quelques lignes de contexte à partir du patch, ou jimmy le patch pour avoir la modification de lignes de contexte au lieu de la vierge. Alternativement, si le fractionnement mecs cette proximité est officiellement pris en charge, il doit effectivement refuser de diviser les beaux mecs qui se ferment.

6voto

Johann Points 750

Après un git stash -p d'échouer dans cette même façon, j'ai eu de la chance avec cette solution de contournement git (2.0.2):

  • git add -p, le fractionnement de la même exacte mecs mais avec inverse de réponses ("y" add "garde" modifications", n" stash conserve les modifications).
  • git stash -k pour garder l'index et à ranger tout le reste
  • git stash reset continuer à travailler sur mes fichiers

Je ne suis pas sûr pourquoi, git add -p n'a pas manqué de la même manière qu' git stash -p a fait. Je suppose que parce que l'ajout d'œuvres avec l'index plutôt que de créer un fichier de patch?

-2voto

dean jase Points 432

L'application de l'état peut échouer avec des conflits; dans ce cas, il n'est pas supprimé de la liste de dissimulation. Vous devez résoudre les conflits à la main et appeler ensuite git stash drop manuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X