web-dev-qa-db-fra.com

Git stash est-il spécifique à une branche ou à l'ensemble du référentiel?

Je suis allé dans une succursale et j'ai fait du travail. Je voulais aller dans une autre branche mais je ne voulais pas m'engager alors j'ai fait git stash. Ensuite, j'ai fait git checkout <otherbranch>. J'y ai fait du travail et, comme dans la première branche, j'ai voulu en sortir avant de commettre le travail. J'ai donc fait git stash ici aussi. Je suis revenu à la première branche et j'ai essayé de la déchausser (git stash pop) pensant qu'il obtiendrait la cachette de cette branche spécifique. J'ai été surpris de voir qu'il a caché la cachette de <otherbranch> (dernier caché). J'avais l'impression que le stash est spécifique à une branche, mais ce comportement indique qu'il n'y a qu'un seul stash pour l'ensemble du référentiel local.

Est git stash spécifique à la branche ou pour l'ensemble du référentiel? S'il s'agit de l'ensemble du référentiel, puis-je lui passer des options pour le rendre spécifique à la branche?

65
amphibient

Pour voir la pile de dissimulations actuelle:

git stash list

Pour choisir une cachette spécifique de la pile, reportez-vous à elle par le stash@{number} illustré par ce qui précède.

Si vous souhaitez que le comportement soit par branche, vous pouvez simplement effectuer une validation (ou plusieurs validations) sur la branche. Vous pouvez toujours "annuler" les validations plus tard (par exemple, avec git reset, Soit --soft ou --mixed; voir la documentation git reset ; ou avec git rebase -i pour ne conserver que les éventuels "vrais" commit (s) tout en supprimant les temporaires).

(Pour vraiment émuler git stash vous avez besoin d'au moins deux validations, une pour l'état d'index et une pour l'état d'arbre de travail. Si vous ne prévoyez pas d'enregistrer et de restaurer l'état de l'index, vous pouvez simplement git add -A l'ensemble de l'état de l'arbre de travail et le mettre dans la validation temporaire. Alternativement, git stash est un script Shell, vous pouvez donc le copier et le modifier assez facilement pour le faire fonctionner par branche par défaut, en utilisant, par exemple, refs/pb-stash/branch comme son espace de noms de travail, plutôt que l'unique global refs/stash pour l'ensemble du référentiel. Vous seriez toujours en mesure d'apporter une cachette d'une branche à une autre en la nommant explicitement.)

28
torek

Non et non. Git stash est par référentiel.

Ici est une belle page sur la façon de l'utiliser.

40
abasterfield

git stash n'est pas par branche.

  • Au lieu de git stash (qui peut être perdu facilement lorsque vous avez beaucoup de cachettes et de branches)
  • je suggère de faire un git commit pour enregistrer le code inachevé dans votre succursale et lorsque vous êtes prêt à terminer le code, faites un git reset ${COMMIT_HASH_VALUE} pour récupérer le code inachevé
  • git commit et git reset lorsqu'il est utilisé ensemble correctement peut simuler un git stash pour une branche spécifique

Voici un scénario réel courant qui illustre la valeur et l'utilisation des commandes commit et reset:

  • vous travaillez sur la branche de fonctionnalité X et votre code ne compile même pas ou ne passe pas les tests
  • il y a un bogue qui a une priorité plus élevée que la nouvelle fonctionnalité actuelle et vous devez donc commencer à travailler immédiatement sur la correction de bogue
  • plutôt que de faire une cachette git (et la cachette se perd dans le mélange parce que vous avez beaucoup de cachettes et de nombreuses branches)
  • vous pouvez faire un git commit sur la branche de fonction X
    • notez le COMMIT_HASH_VALUE pour plus tard
  • extraire une nouvelle branche Y pour le correctif
  • terminer le correctif sur la branche Y (faire une demande de fusion pour obtenir le correctif dans la ligne de base et supprimer la branche du correctif)
  • puis récupérez à nouveau la branche de fonctionnalité X
  • pour faire apparaître votre travail inachevé qui n'a pas compilé ou réussi les tests -> faites simplement un git reset ${COMMIT_HASH_VALUE}

(Pour info, la valeur par défaut pour git reset est --mixed)

10
Trevor Boyd Smith