Si je lance git stash -u
, Je peux cacher des fichiers non suivis. Cependant, les fichiers non suivis n'apparaissent pas du tout avec git stash show stash@{0}
. Existe-t-il un moyen d'afficher les fichiers cachés non suivis sans appliquer la cachette?
Les fichiers non suivis sont stockés dans le troisième parent d'une validation stash. (Ce n'est pas réellement documenté, mais c'est assez évident d'après Le commit qui a introduit la fonctionnalité -u, 787513 ... , et la façon dont le reste de la documentation pour git-stash
phrases choses ... ou tout simplement en faisant git log --graph stash@{0}
)
Vous pouvez afficher uniquement la partie "non suivie" de la cachette via:
git show stash@{0}^3
ou simplement l’arbre "non suivi" lui-même, via:
git show stash@{0}^3:
ou, un fichier "non suivi" particulier dans l'arborescence, via:
git show stash@{0}^3:<path/to/file>
Il n'y a malheureusement aucun bon moyen d'obtenir un résumé des différences entre tous les états par étapes + non par étapes + sans suivi par rapport à l'état "actuel". c'est à dire: git show stash@{0}
ne peut pas être fait pour inclure les fichiers non suivis. Cela est dû au fait que l'objet arborescent du commit de sauvegarde lui-même, appelé stash@{0}:
, n'inclut aucune modification par rapport au troisième parent "non organisé".
Cela est dû à la façon dont les stashes sont réappliqués: les fichiers suivis peuvent être facilement appliqués en tant que correctifs, tandis que les fichiers non suivis ne peuvent être appliqués, en théorie, qu'en tant que "fichiers entiers".
Vous pouvez répertorier toutes les validations de cache avec la commande suivante:
git rev-list -g stash
Étant donné que les stashes sont représentés comme une validation de fusion à 3 voies de HEAD, l'index et une validation "root" sans parent des fichiers non suivis, les stashes de fichiers non suivis peuvent être répertoriés en canalisant la sortie ci-dessus dans ce qui suit:
git rev-list -g stash | git rev-list --stdin --max-parents=0
Applications utiles de ce qui précède:
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
Bien sûr, supprimez le --stat
pour voir le contenu des fichiers.
git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Pour répertorier les fichiers non suivis dans la cachette:
git ls-tree -r stash@{0}^3 --name-only
Pour afficher une différence complète de tous les fichiers non suivis (avec contenu):
git show stash@{0}^3
Ces commandes lisent la dernière cachette (la plus récente). Pour les stashes antérieurs, incrémentez le nombre derrière le "stash @", par exemple stash@{2}
pour la seconde de la dernière cachette.
La raison pour laquelle cela fonctionne est que git stash
crée un commit de fusion pour chaque stash, qui peut être référencé comme stash@{0}
, stash@{1}
etc. Le premier parent de cette validation est le HEAD au moment du stash, le deuxième parent contient les modifications apportées aux fichiers suivis et le troisième (qui peut ne pas exister) les modifications aux fichiers non suivis.
Ceci est en partie expliqué dans la page de manuel sous "Discussion" .
Pour voir tous les fichiers dans la cachette (à la fois suivis et non suivis), j'ai ajouté cet alias à ma configuration:
showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
Il faut un seul argument dont la cachette que vous souhaitez afficher. Notez qu'il le présentera toujours dans deux listes consécutives.
Le if...fi
section change l'argument bash $ 1 à 0 si aucun n'a été passé.
Solution de contournement: le transfert de fichiers avant de les ranger fera git stash show -p
fonctionne comme prévu.
git add .
git stash save
Remarque: De cette façon, le pouvoir ajoute également des parties interactives, voici comment .
Attention: Assurez-vous que vous n'avez pas déjà créé de travail, sinon vous ne pourrez pas le distinguer.
Cela peut être utile.