Comment extraire un seul fichier (ou modifier un fichier) à partir d’une

Je voudrais savoir s’il est possible d’extraire un seul fichier ou diff d’un fichier à partir d’un fichier git stash sans supprimer les modifications du cache.

Quelqu’un pourrait-il être en mesure de fournir des suggestions / idées à ce sujet?

Dans la page de manuel git stash, vous pouvez lire cela (dans la section “Discussion”, juste après la description “Options”):

Un stash est représenté par un commit dont l’arborescence enregistre l’état du répertoire de travail et dont le premier parent est le commit au HEAD lors de la création du stash.

Ainsi, vous pouvez traiter les cachettes (par exemple, la stash@{0} est la cachette la plus haute / la plus haute) en tant que validation de fusion, et utilisez:

 $ git diff stash@{0}^1 stash@{0} --  

Explication: stash@{0}^1 raccourci signifie le premier parent du stash donné, qui, comme indiqué dans l’explication ci-dessus, est un commit pour lequel les modifications ont été masquées. Nous utilisons cette forme de “git diff” (avec deux commits) car stash@{0} / refs/stash est un commit de fusion, et nous devons dire à git quel parent nous voulons modifier. Plus cryptique:

 $ git diff stash@{0}^! --  

devrait également fonctionner (voir la page de manuel de git rev-parse pour l’explication de la syntaxe de rev^! dans la section “Spécification des plages”).

De même, vous pouvez utiliser git checkout pour vérifier un seul fichier à partir du cache:

 $ git checkout stash@{0} --  

ou pour l’enregistrer sous un autre nom de fichier:

 $ git show stash@{0}: >  

ou

 $ git show stash@{0}:./ >  

( notez que ici est le chemin complet d’un fichier par rapport au répertoire supérieur d’un projet (pensez: par rapport à stash@{0} )).


Vous devrez peut-être protéger stash@{0} de l’extension du shell, c’est-à-dire utiliser "stash@{0}" ou 'stash@{0}' .

Si vous utilisez git stash apply plutôt que git stash pop , il appliquera le stash à votre arbre de travail tout en conservant le stash.

Ceci fait, vous pouvez add / commit le fichier souhaité, puis réinitialiser les modifications restantes.

Réponse courte

Pour voir l’intégralité du fichier: git show stash@{0}:

Pour voir le diff: git diff stash@{0}^1 stash@{0} --

Vous pouvez obtenir le diff pour un cache avec ” git show stash@{0} ” (ou quel que soit le nombre de stash, voir “git stash list”). Il est facile d’extraire la section du diff pour un seul fichier.

Il existe un moyen simple d’obtenir des modifications depuis n’importe quelle twig, y compris les caches:

 $ git checkout --patch stash@{0} path/to/file 

Vous pouvez omettre la spécification de fichier si vous souhaitez corriger plusieurs parties. Ou omettez patch (mais pas le chemin) pour obtenir toutes les modifications sur un seul fichier. Remplacez 0 par le numéro de git stash list de git stash list , si vous en avez plusieurs. Notez que ceci est comme diff et propose d’appliquer toutes les différences entre les twigs. Pour obtenir des modifications à partir d’un seul commit / stash, consultez git cherry-pick --no-commit .

Le concept le plus simple à comprendre, même s’il n’est peut-être pas le meilleur, est que vous avez modifié trois fichiers et que vous souhaitez en conserver un seul.

Si vous ne le faites pas pour les cacher tous, git stash apply pour les ramener à nouveau, puis git checkout fc sur le fichier en question pour le réinitialiser.

Si vous voulez décompresser ce fichier, faites un git reset --hard et exécutez à nouveau git stash apply , en profitant du fait que git stash apply ne supprime pas le diff de la stack de stash.

 $ git checkout stash@{0} --  

Remarques:

  1. Assurez-vous de mettre un espace après le “-“ et le paramètre de nom de fichier

  2. Remplacez zéro (0) par votre numéro de réserve spécifique. Pour obtenir la liste de stockage, utilisez:

     git stash list 

Basé sur la réponse de Jakub Narębski – version plus courte

Si les fichiers cachés doivent fusionner avec la version actuelle, utilisez les méthodes précédentes en utilisant diff. Sinon, vous pouvez utiliser git pop pour les décoller, git add fileWantToKeep pour le staging de votre fichier et faire un git stash save --keep-index , pour tout ranger sauf ce qui est sur scène. Rappelez-vous que la différence de cette façon avec les précédentes est qu’elle “fait apparaître” le fichier de la réserve. Les réponses précédentes le gardent git checkout stash@{0} -- pour qu’il réponde à vos besoins.