Dans une question précédente sur Git , Daniel Benamy parlait d'un workflow dans Git:
Je travaillais sur master et j'ai commis des trucs, puis j'ai décidé de mettre ce travail en attente. J'ai sauvegardé quelques commits, puis je me suis ramifié avant de commencer mon travail de merde.
Il voulait restaurer son état de fonctionnement à un point antérieur dans le temps sans perdre ses modifications actuelles. Toutes les réponses tournaient autour, de différentes manières, quelque chose comme
git branch -m master crap_work
git branch -m previous_master master
Comment cela se compare- git stash
t-il? Je suis un peu confus en essayant de voir quels sont les différents cas d'utilisation ici quand il semble que tout git stash
est déjà géré par branchement ...
@ Jordi Bunster : Merci, cela clarifie les choses. Je suppose que je considérerais en quelque sorte le "stashing" comme une branche légère et sans nom. Donc, tout ce que le stash peut faire, la branche le peut aussi mais avec plus de mots. Agréable!
git stash list
les noms de vos cachettes.git stash show -u
pour afficher une différence de la réserve par rapport à la copie de travail.Lorsque vous restaurez votre réserve, vos modifications sont réappliquées et vous continuez à travailler sur votre code.
Pour cacher vos modifications actuelles
Vous pouvez également avoir plusieurs réserves. La réserve fonctionne comme une pile. Chaque fois que vous enregistrez une nouvelle réserve, elle est placée au-dessus de la pile.
Notez la
stash@{0}
partie? C'est votre identifiant de cachette. Vous en aurez besoin pour le restaurer plus tard. Faisons ça maintenant. L'ID de la réserve change à chaque fois que vous créez une réserve. stash @ {0} fait référence à la dernière cache que vous avez créée.Pour appliquer une réserve
Vous remarquerez peut-être que la réserve est toujours là après l'avoir appliquée. Vous pouvez le laisser tomber si vous n'en avez plus besoin.
Ou, parce que la réserve agit comme une pile, vous pouvez sortir la dernière réserve que vous avez enregistrée:
Si vous voulez effacer toutes vos cachettes, exécutez la commande 'clear':
Il se peut très bien que vous n'utilisiez pas souvent de cachettes. Si vous souhaitez simplement stocker rapidement vos modifications pour les restaurer ultérieurement, vous pouvez omettre l'ID de cache.
N'hésitez pas à expérimenter la réserve avant de l'utiliser sur des travaux vraiment importants.
J'ai également une version plus détaillée de ceci publiée sur mon blog .
la source
Je me méfie toujours de git stash. Si vous vous cachez plusieurs fois, les choses ont tendance à se compliquer. git stash list affichera une liste numérotée des stashs que vous avez créés, avec des messages si vous les avez fournis ... Mais le problème réside dans le fait que vous ne pouvez pas nettoyer les stashs sauf avec un brutal git stash clear (qui les supprime tous) . Donc, à moins que vous ne soyez toujours anal en donnant des messages super-descriptifs pour vos cachettes (un peu va à l'encontre de la philosophie de stash), vous vous retrouvez avec un tas de cachettes incompréhensibles.
Le seul moyen que je connaisse pour déterminer lequel est d'utiliser gitk --all et repérer les cachettes. Au moins, cela vous permet de voir sur quel commit le stash a été créé, ainsi que la différence de tout ce qui est inclus dans ce stash.
Notez que j'utilise git 1.5.4.3, et je pense que 1.6 ajoute git stash pop, qui, je suppose, appliquerait le stash sélectionné et supprimerait de la liste. Ce qui semble beaucoup plus propre.
Pour l'instant, j'essaie toujours de me brancher à moins que je ne sois absolument sûr que je vais revenir à cette cachette le même jour, même dans l'heure.
la source
git stash drop [<stash>]
Si vous recherchez un flux de travail qui peut être plus approprié que git stash, vous voudrez peut-être regarder git-bottle . C'est un utilitaire dans le but de sauvegarder et de restaurer les différents états de travail de git en tant que commits normaux de git, en instantané de manière efficace l'état actuel et pertinent de votre arbre de travail et tout différents états de fichier affichés sous git status.
Principales différences avec
git stash
:git stash
enregistre étroitement l'état git sale (fichiers modifiés et fichiers ajoutés dans l'index), alors qu'ilgit-bottle
est conçu pour enregistrer tout ce qui est différent deHEAD
, et il différencie de manière conservatrice entre les chemins modifiés, modifiés et non ajoutés, non ajoutés, non fusionnés, et les états de rebase / fusion complets (seuls les chemins sous.gitignore
ne sont pas enregistrés).git stash
enregistre les objets dont vous avez besoin pour garder une trace séparément. Si j'ai caché quelque chose il y a 2 semaines, je ne m'en souviendrai peut-être pas, alors que lesgit-bottle
sauvegardes en tant que commits provisoires dans la branche actuelle . L'action inversegit-unbottle
est l'équivalent de lagit stash
pop. Il est possible de pousser et de partager ces commits entre les référentiels. Cela peut être utile pour les versions distantes, où vous avez un autre référentiel dans un serveur distant uniquement pour la construction, ou pour collaborer avec d'autres personnes sur la résolution de conflits.la source