96 votes

Git stash vs. git branch

Dans une question précédente sur Git, Daniel Benamy parlait d'un flux de travail Git :

Je travaillais sur master et j'ai commis quelques choses puis j'ai décidé que je voulais mettre ce travail en attente. J'ai sauvegardé quelques commits puis j'ai créé une branche à partir d'avant le commencement de mon travail bidon.

Il voulait restaurer son état de travail à un point antérieur dans le temps sans perdre ses changements actuels. Toutes les réponses tournaient autour, de différentes manières, de quelque chose comme

git branch -m master travail_bidon
git branch -m master_précédent master

Comment cela se compare-t-il à git stash? Je suis un peu confus en essayant de voir quel est le cas d'utilisation différent ici lorsque cela semble que tout ce que git stash fait est déjà traité par le branching...


@Jordi Bunster: Merci, cela éclaire les choses. Je suppose que je considérerais "stash" un peu comme une branche légère et sans nom. Donc tout ce que stash peut faire, branch peut aussi mais avec plus de mots. Bien!

111voto

Jordi Bunster Points 3840

Le 'stash' prend les modifications non validées, "sales", de votre copie de travail, et les met de côté, vous laissant avec une copie de travail propre.

En réalité, il ne crée pas de branche du tout. Vous pouvez ensuite appliquer le stash sur n'importe quelle autre branche. Ou, à partir de Git 1.6, vous pouvez faire :

git stash branch  []

pour appliquer le stash sur une nouvelle branche, le tout en une seule commande.

Ainsi, le stash fonctionne parfaitement si vous n'avez pas encore validé sur la mauvaise branche.

Si vous avez déjà validé, alors le workflow que vous décrivez dans votre question est une meilleure alternative. Et au fait, vous avez raison : Git est très flexible, et avec cette flexibilité vient une fonctionnalité qui se chevauche.

1 votes

Une chose qui me dérange ... pouvez-vous écrire à quoi ressemble réellement une []! Ils l'ont mis dans cette notation dans les docs, mais il n'est pas évident de savoir si cela devrait être 1 ou @{1} ou quoi.

1 votes

Si vous voulez vous référer à une stash spécifique "N", utilisez stash@{N}

10 votes

Voir git stash list pour les noms de vos stash.

49voto

Ariejan Points 6567

Lorsque vous restaurez votre stash, vos modifications sont réappliquées et vous continuez à travailler sur votre code.

Pour mettre en stash vos modifications actuelles

$ git stash save 
Sauvegardé "WIP on master: e71813e..."

Vous pouvez également avoir plusieurs stashes. La stash fonctionne comme une pile. Chaque fois que vous sauvegardez une nouvelle stash, elle est placée en haut de la pile.

$ git stash list
stash@{0} : WIP on master: e71813e..."

Remarquez la partie stash@{0}? C'est l'identifiant de votre stash. Vous en aurez besoin pour la restaurer ultérieurement. Faisons-le maintenant. L'identifiant de la stash change à chaque nouvelle stash que vous faites. stash@{0} fait référence à la dernière stash que vous avez faite.

Pour appliquer une stash

$ git stash apply stash@{0}

Vous pouvez remarquer que la stash est toujours là après l'avoir appliquée. Vous pouvez la supprimer si vous n'en avez plus besoin.

$ git stash drop stash@{0}

Ou, parce que la stash agit comme une pile, vous pouvez retirer la dernière stash que vous avez sauvegardée :

$ git stash pop

Si vous voulez supprimer toutes vos stashes, exécutez la commande 'clear' :

$ git stash clear

Il se peut très bien que vous n'utilisiez pas souvent les stashes. Si vous voulez simplement mettre rapidement en stash vos modifications pour les restaurer plus tard, vous pouvez vous passer de l'identifiant de la stash.

$ git stash
...
$ git stash pop

N'hésitez pas à expérimenter avec la stash avant de l'utiliser sur un travail vraiment important.

J'ai également une version plus approfondie de ceci publiée sur mon blog.

0 votes

Beaucoup plus utile ressource que la réponse soi-disant 'meilleure'... (bien que la meilleure réponse l'ait rendu beaucoup plus clair, il y avait des confusions concernant l'utilisation complète)

11voto

webmat Points 13359

Je suis toujours méfiant vis-à-vis du git stash. Si vous stashez plusieurs fois, les choses ont tendance à devenir compliquées. git stash list affichera une liste numérotée des stashes 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 stashes sauf avec un brutal git stash clear (qui les supprime tous). Donc, à moins que vous ne donniez toujours des messages super-descriptifs pour vos stashes (ce qui va à l'encontre de la philosophie du stash), vous vous retrouvez avec un ensemble incompréhensible de stashes.

La seule manière que je connaisse pour savoir lequel est lequel est d'utiliser gitk --all et repérer les stashes. 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 la version 1.6 ajoute git stash pop, ce qui, je suppose, appliquerait le stash sélectionné et le retirerait de la liste. Ce qui semble être beaucoup plus propre.

Pour l'instant, j'essaie toujours de faire une branche sauf si je suis absolument certain que je vais revenir à ce stash dans la même journée, même dans l'heure.

3 votes

Est-ce que vous créez des branches sans leur donner de noms utiles? Si ce n'est pas le cas, alors je ne vois pas pourquoi vous ne feriez pas la même chose avec stash. Si vous voulez vraiment savoir ce qu'ils contiennent, vous pouvez simplement utiliser git-stash show pour afficher les fichiers modifiés, ou git-stash apply et git-diff pour voir les différences réelles. Garder les stashes élagués est tout simplement la même chose que de garder vos branches sous contrôle.

18 votes

En fait, vous pouvez supprimer une seule réserve en utilisant git stash drop []

1 votes

Vrai, git a eu git stash drop depuis longtemps maintenant. C'est beaucoup moins pénible à utiliser maintenant. Je l'utilise tous les jours, et même sur de longues périodes, maintenant.

3voto

Dan Aloni Points 2198

Si vous cherchez un flux de travail qui pourrait être plus adapté que git stash, vous voudrez peut-être regarder git-bottle. C'est un utilitaire dans le but d'enregistrer et de restaurer les différents états de travail git comme des commits git normaux, permettant ainsi de prendre une capture instantanée de l'état actuel et pertinent de votre arborescence de travail et tous les différents états de fichiers affichés sous git status.

Différences clés par rapport à git stash:

  • git stash sauvegarde l'état git sale de manière étroite (fichiers modifiés et fichiers ajoutés dans l'index), tandis que git-bottle est conçu pour sauvegarder tout ce qui est différent de HEAD, et différencie de manière conservatrice entre les chemins modifiés, modifiés et non ajoutés, non ajoutés, les chemins non fusionnés et les états complets de rebasage/fusion (seuls les chemins sous .gitignore ne sont pas sauvegardés).
  • git stash sauvegarde dans des objets stash qu'il faut suivre séparément. Si j'ai mis en stash quelque chose il y a 2 semaines, je pourrais ne pas m'en souvenir, tandis que git-bottle sauvegarde comme commits provisoires à la branche actuelle. L'action inverse est git-unbottle qui est l'équivalent du pop de git stash. Il est possible de pousser et de partager ces commits entre les dépôts. Cela peut être utile pour les constructions à distance, lorsque vous avez un autre dépôt sur un serveur distant juste pour la construction, ou pour collaborer avec d'autres personnes sur la résolution des conflits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X