Git stash est-il spécifique à une branche ou à l'ensemble du dépôt?

je suis entré dans une succursale et j'ai fait du travail. Je voulais aller dans une autre direction, mais ne veulent pas s'engager alors je l'ai fait git stash. Ensuite, j'ai fait git checkout <otherbranch>. J'ai travaillé là-bas et, comme dans la première branche, j'ai voulu en changer avant de m'engager dans le travail. J'ai donc fait git stash là aussi. Je suis retourné à la première branche et j'ai essayé de la détacher (git stash pop) en pensant qu'il obtiendrait le coffre de cette branche spécifique. J'ai été surpris qu'il unstashed la cachette de <otherbranch> (dernière planquer.) J'étais sous l'impression que stash est direction, mais ce comportement indique qu'il existe une seule cachette pour l'ensemble du référentiel local.

git stash branche spécifique ou pour l'ensemble du référentiel? Si c'est pour l'ensemble du référentiel, puis-je passer des options pour le rendre branche spécifique?

42
demandé sur Alexis King 2013-12-11 21:48:40

3 réponses

voir la cachette de la pile:

git stash list

pour choisir une cachette spécifique à partir de la pile, référez-vous à elle par le stash@{number} montré par ce qui précède.

Si vous voulez le comportement par branche, vous pouvez simplement faire un commit (ou plusieurs commits) sur la branche. Vous pouvez toujours "défaire" le commit(s) ultérieure (par exemple,git reset--soft ou --mixed; voir git reset de la documentation;git rebase -i pour ne conserver que les éventuels "réels" commit (s) alors que rejet des temporalités).

(vraiment émuler git stash vous avez besoin d'au moins deux propagations, une pour l'état index et une pour l'état work-tree. Si vous n'avez pas l'intention de sauvegarder et de restaurer l'état de l'index, vous pouvez tout simplement git add -A tout l'état de l'arbre de travail et mettez cela dans la Commission temporaire. Alternativement,git stash est un script shell donc vous pouvez le copier et le modifier assez facilement pour le faire fonctionner par défaut par branche, en utilisant, par exemple,refs/pb-stash/branch comme son nom l'espace, plutôt que de le mondial unique refs/stash pour la totalité de la pension. Vous pourriez quand même apporter une cachette d'une branche à l'autre en la nommant explicitement.)

19
répondu torek 2013-12-11 18:06:19

non et Non. git stash est par dépôt.

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

27
répondu abasterfield 2013-12-11 17:55:40

git stash n'est pas par branche.

  • au Lieu de git stash (qui peut être perdu facilement quand vous avez beaucoup de cachettes et de branches)
  • je suggère de faire un git commit pour sauver le code inachevé dans votre branche et quand vous êtes prêt à finir le code faire un git reset ${COMMIT_HASH_VALUE} pour obtenir de l'inachevé code
  • git commit et git reset lorsqu'il est utilisé ensemble correctement peut simuler un git stash pour un branche

voici un scénario courant de la vie réelle qui démontre la valeur et l'usage du commit et reset commandes:

  • vous travaillez sur la branche X et votre code ne compile ni ne passe les tests
  • il y a un bug qui est plus prioritaire que la nouvelle fonctionnalité actuelle et vous devez donc commencer à travailler immédiatement sur la correction de bug
  • plutôt que de faire un git stash (et le coffre perdu dans le mélange parce que vous avez beaucoup de cachettes et beaucoup de branches)
  • vous pouvez faire un
  • écrire COMMIT_HASH_VALUE pour plus tard
  • commander une nouvelle branche Y pour le hot fix
  • terminer le point chaud sur la branche Y (faire une demande de fusion pour obtenir le point chaud dans la ligne de base et supprimer la branche du point chaud)
  • puis vérifiez à nouveau la branche de fonctionnalité X
  • pour faire éclater votre travail inachevé que n'a pas compilé ou réussi les tests -- > il suffit de faire un git reset ${COMMIT_HASH_VALUE}
  • (pour info la valeur par défaut de git reset--mixed)

    2
    répondu Trevor Boyd Smith 2018-07-13 14:06:52