J'ai des modifications à apporter à un fichier, ainsi qu'à un nouveau fichier, et j'aimerais utiliser git stash pour les ranger pendant que je passe à une autre tâche. Mais git stash par lui-même ne cache que les modifications apportées au fichier existant; le nouveau fichier reste dans mon arbre de travail, encombrant mon travail futur. Comment puis-je cacher ce fichier non suivi?
Pour cacher votre répertoire de travail, y compris les fichiers non suivis (en particulier ceux qui se trouvent dans le fichier .gitignore), vous voudrez probablement utiliser cette cmd:
git stash --include-untracked
Mise à jour du 17 mai 2018:
Les nouvelles versions de git ont maintenant git stash --all
qui cache tous les fichiers, y compris les fichiers non suivis et ignorés.git stash --include-untracked
ne touche plus les fichiers ignorés (testé sur git 2.16.2).
Réponse originale ci-dessous:
À partir de la version 1.7.7, vous pouvez utiliser git stash --include-untracked
ou git stash save -u
pour stocker des fichiers non suivis sans les stocker.
Ajoutez (git add
) le fichier et commencez à le suivre. Puis cachez. Étant donné que tout le contenu du fichier est nouveau, il sera caché et vous pourrez le manipuler si nécessaire.
A partir de la version 1.7.7, git stash
accepte l'option --include-untracked
(ou -u
). Pour inclure des fichiers non suivis dans votre réserve, utilisez l'une des commandes suivantes:
git stash --include-untracked
git stash -u
Ajoutez le fichier à l'index:
git add path/to/untracked-file
git stash
L'intégralité du contenu de l'index, ainsi que les modifications non mises en place apportées aux fichiers existants, le seront toutes dans la réserve.
Dans git bash, le stockage de fichiers non suivis est réalisé en utilisant la commande
git stash --include-untracked
ou
git stash -u
http://git-scm.com/docs/git-stash
git stash supprime tous les fichiers non suivis ou non validés de votre espace de travail. Et vous pouvez restaurer git stash en utilisant les commandes suivantes
git stash pop
Cela replacera le fichier dans votre espace de travail local.
Mon expérience
J'ai dû modifier mon fichier gitIgnore pour éviter le déplacement des fichiers .classpath et .project dans le référentiel distant. Je ne suis pas autorisé à déplacer ce .gitIgnore modifié dans le dépôt distant à partir de maintenant.
Les fichiers .classpath et .project sont importants pour Eclipse - qui est mon éditeur Java.
J'ai tout d'abord ajouté sélectivement mon reste des fichiers et validé pour la mise en scène. Cependant, le Push final ne peut être effectué que si les fichiers .gitIgnore modifiés et les fichiers non suivis sont viz. .project et .classpath ne sont pas cachés.
J'ai utilisé
git stash
pour stocker le fichier .gitIgnore modifié.
Pour stocker les fichiers .classpath et .project, j’ai utilisé
git stash --include-untracked
et il a supprimé les fichiers de mon espace de travail. L'absence de ces fichiers diminue ma capacité à travailler sur mon lieu de travail dans Eclipse. J'ai poursuivi la procédure pour envoyer les fichiers validés à distance. Une fois que cela a été fait avec succès, j'ai utilisé
git stash pop
Cela a collé les mêmes fichiers dans mon espace de travail. Cela m'a rendu ma capacité à travailler sur le même projet dans Eclipse. J'espère que cela élimine les idées fausses.
Comme il a été dit ailleurs, la réponse est git add
le fichier. par exemple.:
git add path/to/untracked-file
git stash
Cependant, la question se pose également dans une autre réponse: que se passe-t-il si vous ne voulez pas vraiment ajouter le fichier? Eh bien, autant que je sache, vous devez le faire. Et ce qui suit PAS fonctionne:
git add -N path/to/untracked/file # note: -N is short for --intent-to-add
git stash
cela échouera comme suit:
path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Alors que peux-tu faire? Eh bien, vous devez vraiment ajouter le fichier cependant , vous pouvez effectivement le dés-ajouter plus tard, avec git rm --cached
:
git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file
Et vous pouvez ensuite continuer à travailler dans le même état que vous aviez avant le git add
(à savoir avec un fichier non suivi appelé path/to/untracked-file
; plus toute autre modification que vous auriez pu avoir pour suivre les fichiers).
Une autre possibilité pour un flux de travail à ce sujet serait quelque chose comme:
git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack
[Remarque: comme mentionné dans un commentaire de @mancocapac, vous souhaiterez peut-être ajouter --exclude-standard
à la commande git ls-files
(donc, git ls-files -o --exclude-standard
).]
... qui pourrait aussi être facilement scripté - même les alias feraient (présenté dans la syntaxe zsh; ajustez au besoin) [aussi, j'ai raccourci le nom du fichier pour que tout soit affiché à l'écran sans défilement dans cette réponse; sentez-vous libre de substituer un autre nom de fichier de votre choix]:
alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'
Notez que ce dernier peut être préférable en tant que script ou fonction Shell, pour permettre aux paramètres d'être fournis à git stash
, au cas où vous ne voudriez pas pop
mais apply
, et/ou voulez être en mesure de spécifier une réserve spécifique, plutôt que de prendre le premier. Peut-être ceci (au lieu du deuxième alias, ci-dessus) [espaces blancs dépouillés pour s'adapter sans défilement; rajouter pour une lisibilité accrue]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
Remarque : Dans ce formulaire, vous devez fournir un argument d'action ainsi que l'identifiant si vous voulez fournir un identifiant de cache, par exemple unstashall apply stash@{1}
ou unstashall pop stash@{1}
Lequel vous mettriez bien sûr dans votre .zshrc
ou équivalent pour faire exister à long terme.
Espérons que cette réponse est utile à quelqu'un, en mettant tout ensemble dans une seule réponse.
Sur la version 2.8.1 de git: la suite fonctionne pour moi.
Pour enregistrer des fichiers modifiés et non suivis en cachette sans nom
git stash save -u
Pour sauvegarder en cachette des fichiers modifiés et non suivis avec un nom
git stash save -u <name_of_stash>
Vous pouvez utiliser l'un ou l'autre et appliquer plus tard comme suit.
git stash pop
git stash apply stash@{0}
J'ai pu cacher juste les fichiers non suivis en faisant:
git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}
Le dernier fait apparaître la réserve des fichiers suivis, ne laissant ainsi que les fichiers non suivis stockés.
Si vous voulez cacher des fichiers non suivis, mais conserver des fichiers indexés (ceux que vous êtes sur le point de valider, par exemple), ajoutez simplement l'option -k
(conserver l'index) à la -u
git stash -u -k
Vous pouvez simplement le faire avec la commande ci-dessous
git stash save --include-untracked
ou
git stash save -u
Pour en savoir plus sur git stash visitez ce post (cliquez ici)
supposons que le fichier nouveau et non suivi s'appelle: "views.json". si vous voulez changer de branche en stockant l'état de votre application, je tape généralement:
git add views.json
Ensuite:
git stash
Et ce serait caché. Ensuite, je peux changer de branche avec
git checkout other-Nice-branch
Il y a plusieurs réponses correctes ici, mais je voulais souligner que pour les nouveaux répertoires entiers, 'git add path'
sera PAS travail. Donc si vous avez un tas de nouveaux fichiers dans untracked-path et faites ceci:
git add untracked-path
git stash "temp stash"
cela va cacher avec le message suivant:
Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty
et si untracked-path est le seul chemin que vous stockez, la réserve "temp stash" sera une réserve vide. La bonne façon est d’ajouter le chemin complet, pas seulement le nom du répertoire (c’est-à-dire terminer le chemin avec un '/'):
git add untracked-path/
git stash "temp stash"
J'ai pensé que cela pourrait être résolu en indiquant à git que le fichier existe, plutôt que de valider tout son contenu dans la zone de transfert, puis d'appeler git stash
. Araqnid décrit comment faire le premier.
git add --intent-to-add path/to/untracked-file
ou
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file
Cependant, ce dernier ne fonctionne pas:
$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state