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?
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.)
Non et non. Git stash est par référentiel.
Ici est une belle page sur la façon de l'utiliser.
git stash
n'est pas par branche.
git stash
(qui peut être perdu facilement lorsque vous avez beaucoup de cachettes et de branches)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écifiqueVoici un scénario réel courant qui illustre la valeur et l'utilisation des commandes commit
et reset
:
git commit
sur la branche de fonction X COMMIT_HASH_VALUE
pour plus tardgit reset ${COMMIT_HASH_VALUE}
(Pour info, la valeur par défaut pour git reset
est --mixed
)