les modifications de git stash s'appliquent-elles à une nouvelle branche?

349

Je travaillais sur la branche principale, j'ai apporté quelques modifications, puis les ai cachées. Maintenant, mon maître est à HEAD.

Mais maintenant, je veux récupérer ces modifications mais dans une nouvelle branche qui dérive de la version HEAD de la branche principale.

Comment puis-je faire cela ?

Yash Desai
la source
3
Je pense que vous cherchez ça? stackoverflow.com/questions/556923/…
zx1986

Réponses:

506

La procédure standard ne fonctionne-t-elle pas?

  • faire des changements
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

Plus court:

  • faire des changements
  • git stash
  • git checkout -b xxx
  • git stash pop
Andrejs Cainikovs
la source
8
@sfletche si vous voulez nommer votre stash, vous devez faire git stash save <name>, sinon, comme vous le dites, c'est la même chose que git stash.
SgtPooki
5
Après avoir utilisé cette approche, il semble que si vous revenez à la branche précédente, les modifications cachées sont revenues. Est-il possible d'avoir uniquement les modifications cachées sur la nouvelle branche?
Thomas Higginbotham
Validez simplement vos modifications dans la nouvelle branche.
ChrisR
2
@ThomasHigginbotham non le répertoire de travail est commun entre les branches et est copié de l'une à l'autre lorsque vous passez d'une branche à l'autre. Pour "réaliser" ce que vous voulez, je crée généralement des masques différents, en ajoutant une description utile avec la git stash save "description"commande mentionnée précédemment; puis je git clearla branche (pour la corbeille du répertoire de travail réel), puis git stash apply stash@{my_desired_stash}dans la branche souhaitée (après avoir basculé vers cela avec git checkout <branch>évidemment). Je sais que ce n'est pas une vraie solution, mais c'est le mieux que vous puissiez faire avec git .
Kamafeather
J'ai également finalisé cela avec git stash dropune fois que je m'étais engagé
oddmeter
221

Puisque vous avez déjà caché vos modifications, tout ce dont vous avez besoin est ce one-liner:

  • git stash branch <branchname> [<stash>]

Depuis les documents ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

Crée et vérifie une nouvelle branche nommée < branchname > à partir de la validation , à laquelle le < Stash > a été créé à l' origine, applique les modifications enregistrées dans < Stash > pour le nouvel arbre de travail et de l' index. Si cela réussit, et < stash > est une référence du formulaire stash @ {< revision >}, il supprime alors le < stash >. Lorsqu'aucun < stash > n'est donné, applique le dernier.

Cela est utile si la branche sur laquelle vous avez exécuté git stash save a suffisamment changé pour que git stash apply échoue en raison de conflits. Étant donné que le stash est appliqué au-dessus de la validation qui était HEAD au moment où git stash a été exécuté, il restaure l'état initialement stocké sans conflits.

Rodney Golpe
la source
3
Pour les masques simples, c'est la voie à suivre. La référence du nom de la cachette n'est pas requise car Git appliquera la dernière cachette, basculera vers une nouvelle branche et appliquera la commande cachette en 1.
sinisterOrange
@RodneyGolpe Cela semble également appliquer la cachette au «maître»? Ce que je veux faire, c'est de 'master', git stash, alors je m'attendais à ce que 'git stash branch [branchname] applique le stash à une nouvelle branche, laissant master sans les modifications?
David Doria
2
@DavidDoria Vous devez valider les modifications dans votre nouvelle branche avant de revenir au master.
Rodney Golpe
Maintenant, cela a également valu les modifications au maître ... Je suis vraiment perdu ... évidemment, je ne comprends toujours pas vraiment git. Après avoir réinitialisé doucement le maître puis retiré du référentiel distant, je suis là où je voulais être. Le maître est dans l'état avant les changements. La nouvelle branche détient les modifications.
Ekkstein
1

Si vous avez des modifications sur votre espace de travail et que vous souhaitez les ranger dans une nouvelle branche, utilisez cette commande:

git stash branch branchName

Cela fera:

  1. une nouvelle branche
  2. déplacer les modifications dans cette branche
  3. et supprimer la dernière cachette (comme: git stash pop)
Hamed Yarandi
la source