Question Comment nommer et récupérer une cachette par son nom dans git?


J'avais toujours l'impression que vous pouviez donner un nom en faisant git stash save stashname, que vous pourriez appliquer plus tard en faisant git stash apply stashname. Mais il semble que dans ce cas, tout ce qui se passe est que stashname sera utilisé comme description de cachette.

N'y a-t-il aucun moyen de nommer une cachette? Si non, que recommanderiez-vous pour obtenir une fonctionnalité équivalente? Essentiellement, j'ai une petite réserve que je voudrais périodiquement appliquer, mais je ne veux pas toujours avoir à chasser dans git stash list quel est son numéro de cachette actuel.


927
2018-06-29 21:33


origine


Réponses:


Vous pouvez réellement trouver la cachette par nom en utilisant la syntaxe d'expression régulière de git pour les objets d'adressage:

stash^{/<regex>}
:/<regex>

Par exemple, lorsque vous enregistrez votre cachette avec un nom de sauvegarde:

git stash save "guacamole sauce WIP"

... vous pouvez utiliser une expression régulière pour résoudre ce problème:

git stash apply stash^{/guacamo}

Cela appliquera la plus petite mémoire qui correspond à l'expression régulière guacamo. De cette façon, vous n'avez pas besoin de connaître le numéro de la pile dans la pile, il vous suffit de connaître son nom. Il n'y a pas de syntaxe terser pour cela, mais vous pouvez créer un alias dans votre .gitconfig fichier:

[alias]
sshow = "!f() { git stash show stash^{/$*} -p; }; f"
sapply = "!f() { git stash apply stash^{/$*}; }; f"

Vous pouvez ensuite utiliser git sapply <regex> appliquer cette cachette (sans laisser tomber).
 Vous pouvez ensuite utiliser git sshow <regex> montrer: fichiers modifiés, insertions et suppressions

MODIFIER: Props à cette réponse StackOverflow sur comment utiliser les arguments bash dans les alias git.

EDIT 2: Cette réponse contenait drop et list alias, mais je les ai depuis enlevés, depuis drop nécessite le stash@{n} syntaxe tout en list n'a pas filtré les cachettes du tout. Si quelqu'un sait comment résoudre un hachage SHA-1 à une mise en cache, alors je pourrais aussi implémenter les autres commandes.

EDIT 3: Par IsyiLa suggestion J'ai ajouté un drapeau de patch pour montrer ce que le contenu de la cachette est en montrant un.


1147
2017-07-27 13:17



C'est comme ça que vous le faites:

git stash save "my_stash"

où "my_stash" est le nom de cachette ...

Quelques choses utiles à savoir: Toutes les cachettes sont stockées dans une pile. Tapez :

git stash list

Cela énumérera toutes vos cachettes.

Pour appliquer une cachette et la retirer de la réserve, vous pouvez donner,

git stash pop stash@{n}

Pour appliquer une cachette et la conserver dans la cachette, tapez:

git stash apply stash@{n}

Où n dans l'index du changement caché.


321
2018-03-04 08:18



Vous pouvez transformer une cachette en une branche si vous pensez que c'est assez important:

git stash branch <branchname> [<stash>]

de la page de manuel:

Cela crée et extrait une nouvelle branche nommée <branche> à partir de la validation à laquelle la <stash> a été créée, applique les modifications enregistrées dans <stash> à la nouvelle arborescence et à l'index, puis supprime la <stash> si se termine avec succès. Quand aucune <stash> n'est donnée, applique la dernière.

Ceci est utile si la branche sur laquelle vous avez lancé git stash save a suffisamment changé pour que git stash apply échoue en raison de conflits. Puisque le cachet est appliqué sur le commit qui était HEAD au moment où git stash a été lancé, il restaure l'état initialement caché sans conflit.

Vous pouvez ensuite rebaser cette nouvelle branche dans un autre endroit qui est un descendant de l'endroit où vous étiez lorsque vous avez caché.


64
2018-06-29 22:34



Les cachettes ne sont pas censées être des choses permanentes comme vous le souhaitez. Vous seriez probablement mieux servi en utilisant des balises sur les validations. Construis la chose que tu veux cacher. Faire un engagement hors de celui-ci. Créez un tag pour ce commit. Puis retournez votre branche à HEAD^. Maintenant, quand vous voulez réappliquer cette cachette, vous pouvez utiliser git cherry-pick -n tagname (-n est --no-commit).


30
2018-06-29 21:39



git stash save est déconseillé maintenant, à la place, vous pouvez utiliser git stash push -m "message" 

Vous pouvez procude comme ceci:

git stash push -m "message" 

où "message" est votre nom de cachette ...


15
2018-03-29 15:08



Si vous recherchez simplement un moyen léger d'enregistrer tout ou partie de vos modifications de copie de travail actuelles, puis de les réappliquer plus tard à volonté, envisagez un fichier patch:

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

De temps en temps, je me demande si je devrais utiliser des cachettes pour cela et ensuite je vois des choses comme la folie ci-dessus et je suis content de ce que je fais :)


12
2017-11-10 16:06



Alias

sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"

Usage

git sapply "<regex>"

  • compatible avec Git pour Windows

Edit: Je me suis contenté de ma solution originale, mais je vois pourquoi la majorité préférerait la version d'Etan Reisner (ci-dessus). Donc, juste pour le compte rendu:

sapply = "!f() { git stash apply \"$(git stash list | grep -E \"$*\" | awk \"{ print $ 1; }\" | sed -n \"s/://;1p\")\"; }; f"

7
2017-11-26 22:51



Cette réponse doit beaucoup à Klemen Slavič. J'aurais juste commenté sur la réponse acceptée mais je n'ai pas encore assez de rep :(

Vous pouvez également ajouter un alias git pour trouver la référence stash et l'utiliser dans d'autres alias pour afficher, appliquer, supprimer, etc.

[alias]
    sgrep = "!f() { ref=$(git --no-pager stash list | grep "$1" | cut -d: -f1 | head -n1); echo ${ref:-<no_match>}; }; f"
    sshow = "!f() { git stash show $(git sgrep "$1") -p; }; f"
    sapply = "!f() { git stash apply $(git sgrep "$1"); }; f"
    sdrop = "!f() { git stash drop $(git sgrep "$1"); }; f"

Notez que la raison de la ref=$( ... ); echo ${ref:-<no_match>}; motif est donc une chaîne vide n'est pas retournée ce qui causerait sshow, sapply et sdrop pour cibler la dernière cachette au lieu d'échouer comme on s'y attendrait.


5
2018-01-11 01:30