116 votes

Pourquoi stash ne peut-il pas s'appliquer au répertoire de travail ?

Je ne peux pas appliquer stash au répertoire de travail.

Petite histoire :

J'ai d'abord essayé de pousser quelques modifications validées, mais le système m'a dit : "non vous ne pouvez pas, tirez d'abord"... D'accord, je vais tirer les choses de GitHub et ensuite pousser mes changements. Quand j'ai essayé d'extraire, le système m'a dit que j'avais des modifications qui seraient écrasées, et que je devais cacher mes modifications. D'accord, j'ai caché les changements... j'ai fait le pull, et j'ai poussé les changements validés. Mais maintenant, je ne peux pas restaurer les modifications non validées sur lesquelles je travaillais.

Voici l'erreur :

MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash

Il est certain que je ne comprends pas encore tous les concepts de git, ils me déroutent un peu... peut-être que j'ai fait quelque chose de mal.

Ce serait formidable si quelqu'un pouvait m'aider à résoudre ce problème... J'ai cherché sur google et tout ça pendant plus d'une heure, et je n'ai pas encore trouvé de solution.

L'aide est très appréciée. Merci de votre aide.

86voto

blahdiblah Points 17382

Il semble que votre cache comprenait un fichier non suivi qui a été ajouté par la suite à la base de données. Lorsque vous essayez de l'extraire, git refuse à juste titre parce qu'il écraserait un fichier existant.

Pour remédier à cela, vous pouvez par exemple supprimer ce fichier (ce n'est pas grave, il est toujours dans le repo), appliquer votre stash, puis remplacer la version stashée du fichier par la version dans le repo, le cas échéant.

Edita: Il est également possible que le fichier n'ait été créé que dans l'arborescence de travail. sans ont été ajoutés à la base de données. Dans ce cas, ne supprimez pas simplement le fichier local :

  1. le déplacer ailleurs
  2. appliquer la réserve
  3. fusionner manuellement les deux versions du fichier (arbre de travail et fichier déplacé).

74voto

Koraktor Points 9532

Le moyen le plus sûr et le plus simple serait probablement de cacher à nouveau des objets :

git stash -u             # This will stash everything, including unstaged files
git stash pop stash@{1}  # This will apply your original stash

Ensuite, si vous êtes satisfait du résultat, vous pouvez téléphoner à

git stash drop

pour retirer votre réserve "sûre".

65voto

studgeek Points 4617

Comme indiqué par @bentolo, vous pouvez supprimer manuellement les fichiers dont il se plaint, changer de branche, puis les ajouter manuellement. Mais je préfère personnellement rester "dans git".

La meilleure façon d'y parvenir est de convertir la réserve en une branche. Une fois que c'est une branche, vous pouvez travailler normalement dans git en utilisant les techniques/outils normaux liés aux branches que vous connaissez et aimez. Il s'agit en fait d'une technique générale utile pour travailler avec des stashs, même si vous n'avez pas l'erreur mentionnée. Elle fonctionne bien parce qu'un stash est vraiment un commit sous les couvertures (voir PS).

Transformation d'une réserve en branche

La procédure suivante crée une branche basée sur le HEAD lorsque la réserve a été créée et applique ensuite la réserve (elle ne la valide pas).

git stash branch STASHBRANCH

Travailler avec la "branche réserve"

Ce que vous faites ensuite dépend de la relation entre la réserve et l'endroit où se trouve votre branche cible (que j'appellerai ORIGINALBRANCH).

Option 1 - Rebasez la branche stash normalement (beaucoup de changements depuis stash)

Si vous avez effectué de nombreuses modifications dans votre ORIGINALBRANCH, il est préférable de traiter STASHBRANCH comme n'importe quelle branche locale. Livrez vos changements dans STASHBRANCH, rebasez-les sur ORIGINALBRANCH, puis basculez sur ORIGINALBRANCH et rebasez/fusionnez les changements de STASHBRANCH dessus. S'il y a des conflits, traitez-les normalement (l'un des avantages de cette approche est que vous pouvez voir et résoudre les conflits).

Option 2 - Réinitialiser la branche d'origine pour qu'elle corresponde à la cachette (changements limités depuis la cachette)

Si vous venez d'empiler tout en gardant certains changements empilés, puis que vous avez commis, et que tout ce que vous voulez faire est de récupérer les changements supplémentaires qui n'étaient pas empilés lorsque vous avez empilé, vous pouvez faire ce qui suit. Cela retournera à votre branche originale et à votre index sans changer votre copie de travail. Le résultat final sera vos changements supplémentaires dans votre copie de travail.

git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset

Contexte

Les cachettes sont des commits comme des branches/étiquettes (pas des correctifs).

PS : Il est tentant de considérer un stash comme un patch (tout comme il est tentant de considérer un commit comme un patch), mais un stash est en fait un commit par rapport au HEAD lorsqu'il a été créé. Lorsque vous appliquez/pop, vous faites quelque chose de similaire à une cueillette dans votre branche actuelle. Gardez à l'esprit que les branches et les étiquettes ne sont en fait que des références aux livraisons, de sorte qu'à bien des égards, les stashs, les branches et les étiquettes ne sont que des façons différentes de pointer vers une livraison (et son historique).

Parfois nécessaire même si vous n'avez pas modifié le répertoire de travail

PPS, vous aurez peut-être besoin de cette technique après avoir utilisé stash avec --patch et/ou --include-untracked. Même sans changer les répertoires de travail, ces options peuvent parfois créer un stash que vous ne pouvez pas simplement appliquer à nouveau. Je dois admettre que je ne comprends pas très bien pourquoi. Voir http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html pour une discussion.

41voto

qwertzguy Points 1021

La solution : Vous devez supprimer le fichier en question, puis réessayer de faire un pop/applicatif et cela devrait passer. Ne supprimez pas d'autres fichiers, mais uniquement ceux mentionnés dans l'erreur.

Le problème : Git craint parfois. Lorsque l'on exécute git stash -u il inclut les fichiers non suivis (cool !) mais il n'est pas supprimer ces fichiers non suivis et n'est pas savoir comment appliquer les fichiers non suivis cachés sur les restes (pas cool !), ce qui rend vraiment la tâche difficile. -u est plutôt inutile.

30voto

ciphersimian Points 319

Pour appliquer les différences de code dans la réserve sous la forme d'un correctif, utilisez la commande suivante :

git stash show --patch | patch -p1

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