Forcer git stash à écraser les fichiers ajoutés


223

J'ai quelques fichiers qui n'ont pas été suivis dans git. J'ai apporté quelques modifications et j'ai voulu les valider, mais j'ai réalisé que j'avais oublié de vérifier d'abord les fichiers non modifiés. J'ai donc caché les fichiers, puis ajouté les versions non modifiées.

Ensuite, lorsque j'applique la cachette au référentiel, j'obtiens des conflits en raison des fichiers déjà ajoutés.

Comment puis-je appliquer le stash et forcer les versions du stash à être utilisées de préférence aux originaux dans le référentiel?

Merci


7
Solution laide jusqu'à ce que quelqu'un en trouve une meilleure: supprimez les nouveaux fichiers en utilisant git rmavant de le faire git stash apply.
tom

Cela ne perdra-t-il pas l'histoire? La raison de l'ajout des versions non modifiées était de conserver l'historique.
Stefan

1
Non, il ne perdra pas l'histoire. Si vous supprimez un fichier, l'ajoutez à nouveau avec une petite modification, puis validez, gitle traitera comme une petite modification.
tom

Réponses:


365

Utilisez git checkoutau lieu de git stash apply:

$ git checkout stash -- .
$ git commit

Cela restaurera tous les fichiers du répertoire actuel dans leur version cachée.


S'il y a des changements dans d'autres fichiers du répertoire de travail qui doivent être conservés, voici une alternative moins lourde:

$ git merge --squash --strategy-option=theirs stash

S'il y a des changements dans l'index, ou si la fusion touchera des fichiers avec des changements locaux, git refusera de fusionner. Les fichiers individuels peuvent être extraits de la cachette à l'aide de

$ git checkout stash -- <paths...>

ou interactivement avec

$ git checkout -p stash

Aucun de ceux-ci n'a fonctionné dans mon cas d'utilisation. Les résultats et ma solution sont ici stackoverflow.com/a/26685296/496046 - cela devrait aussi résoudre votre situation, @AlexanderBird
tremby

2
git checkout stash -- .Cette commande n'a littéralement rien fait lorsque je l'ai exécutée.
Rotsiser Mho

3
@RotsiserMho Git n'est pas très bon pour fournir des messages de confirmation. Êtes-vous sûr que cela n'a rien fait? Ça a bien marché pour moi.
Sinjai

5
J'ai dû exécuter git checkout stash -- .dans le dossier parent le plus élevé qui contenait mes modifications, sinon il n'a appliqué que les modifications au dossier à partir duquel j'ai exécuté la commande.
Leo

1
@Leo: C'est vrai, c'est parce que .spécifie le répertoire courant (vous pouvez le remplacer par un chemin différent au lieu de changer de répertoire). J'ai mis à jour ma réponse pour que ce soit plus clair.
Tom

13

git stash show -p | git apply

puis git stash dropsi vous souhaitez supprimer les éléments cachés.


2
Note: vous devriez être à la racine du référentiel pour que cela fonctionne correctement, sinon vous obtiendrez ce .
Ruslan

@PengheGeng Comme vous pouvez le voir, j'ai répondu environ un an avant NetEmmanuel
Hasan TBT

@Ruslan Je reçois ça alors que je suis à la racine de mon repo 🤔
Leo

6

Pour forcer l' git stash popexécution de cette commande

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Version longue:

Vous obtenez cette erreur en raison des modifications non validées que vous souhaitez remplacer. Annulez ces modifications avec git checkout HEAD. Vous pouvez annuler les modifications apportées à un fichier spécifique avec git checkout HEAD path/to/file. Après avoir supprimé la cause du conflit, vous pouvez postuler comme d'habitude.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.