J'ai toujours eu l'impression que vous pouviez donner un nom à une cachette en faisant git stash save stashname
, que vous pourriez ensuite appliquer en faisant git stash apply stashname
. Mais il semble que dans ce cas, tout ce qui se passe est celui stashname
qui sera utilisé comme description de la cachette.
N'y a-t-il aucun moyen de nommer une cachette? Sinon, que recommanderiez-vous pour obtenir des fonctionnalités équivalentes? Essentiellement, j'ai une petite cachette que j'aimerais périodiquement appliquer, mais je ne veux pas toujours avoir à chercher git stash list
quel est son numéro de cachette réel.
git stash push -m stashname
est la syntaxe actuelle .git stash save stashname
est obsolète.Réponses:
Voici comment procéder:
Où
"my_stash"
est le nom de la cachette.Quelques choses plus utiles à savoir: Toutes les cachettes sont stockées dans une pile. Type:
Cela répertoriera toutes vos réserves.
Pour appliquer une stash et la retirer de la pile de stash, tapez:
Pour appliquer une stash et la conserver dans la pile de stash, tapez:
Où
n
est l'indice du changement caché.la source
git stash apply <custom-name>
git stash push -m my_stash
est la syntaxe actuelle .git stash save my_stash
est obsolète.git stash save
est obsolète à partir de 2.15.x / 2.16, à la place, vous pouvez utilisergit stash push -m "message"
Vous pouvez l'utiliser comme ceci:
git stash push -m "message"
où "message" est votre note pour cette cachette.
Afin de récupérer la planque , vous pouvez utiliser:
git stash list
. Cela produira une liste comme celle-ci, par exemple:Ensuite, vous utilisez simplement
apply
en lui donnantstash@{index}
:Références page de manuel de git stash
la source
push
plutôt que lasave
syntaxe: git stash pushgit stash push
: stackoverflow.com/a/47231547/6309git stash apply stash@{1}
dans Powershell, vous obtiendrez unerror: unknown switch 'e'
dos. Utilisez plutôtgit stash apply --index 1
ougit stash apply 'stash@{1}'
ou escape}
et{
avec un backtick `.Vous pouvez transformer une cachette en branche si vous pensez qu'elle est suffisamment importante:
à partir de la page de manuel:
Cela crée et extrait 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>
la nouvelle arborescence de travail et l'index, puis supprime le<stash>
si cela se termine avec succès. Si non<stash>
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 du commit qui était HEAD au moment où git stash a été exécuté, il restaure l'état initialement stashé sans conflits.Vous pouvez ultérieurement rebaser cette nouvelle branche vers un autre endroit qui est un descendant de l'endroit où vous vous trouviez lorsque vous vous êtes caché.
la source
git stash apply
)git stash push -m 'name'
travaillé.Si vous cherchez 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 de correctif:
De temps en temps, je me demande si je devrais utiliser des cachettes pour cela, puis je vois des choses comme la folie ci-dessus et je me contente de ce que je fais :)
la source
Les cachettes ne sont pas censées être des choses permanentes comme vous le souhaitez. Vous seriez probablement mieux servi en utilisant des balises lors des validations. Construisez la chose que vous voulez cacher. Faites-en un commit. Créez une balise pour ce commit. Faites ensuite reculer votre succursale vers
HEAD^
. Maintenant, lorsque vous souhaitez réappliquer cette réserve, vous pouvez utilisergit cherry-pick -n tagname
(-n
est--no-commit
).la source
named commit
endroit quelque part. Le seul inconvénient léger est qu'il n'est pas engagé lors de la sélection et reste dans le diff, ce qui signifie qu'il ne devra pas être enregistré manuellement lors du prochain commit.--no-stage
option! Connexe: stackoverflow.com/questions/32333383/…utiliser
git stash push -m aNameForYourStash
pour l'enregistrer. Utilisez ensuitegit stash list
pour connaître l' index de la cachette que vous souhaitez appliquer. Ensuite, utilisezgit stash pop --index 0
pour éclater la cachette et l'appliquer.remarque: j'utilise git version 2.21.0.windows.1
la source
git stash {push,save}
J'ai ces deux fonctions dans mon
.zshrc
dossier:En les utilisant de cette façon:
la source
Et ça?
la source
git stash apply stash^{/<regex>}
ça ne marche pas (ça ne marche pas effectuez une recherche dans la liste cachée, voir les commentaires sous la réponse acceptée ).git stash list
qui me montre les cachettes avec leur numéro d'index associé, je vais ensuite 2.git stash apply 0
- où 0 est le numéro d'index que j'aurais recherché à partir de la première commandeAlias
sapply = "!f() { git stash apply \"$(git stash list | awk -F: --posix -vpat=\"$*\" \"$ 0 ~ pat {print $ 1; exit}\")\"; }; f"
Usage
git sapply "<regex>"
Edit: je suis resté sur ma solution d'origine, mais je vois pourquoi la majorité préférerait la version d'Etan Reisner (ci-dessus). Donc, pour mémoire:
la source
awk -F: '{print $1}'
éliminerait complètement le besoin de sed. Aussi pourquoi envelopper cela dans une fonction? Et l'utilisationawk -F: -vpat="$*" '$0 ~ pat {print $1}'
devrait également permettre de supprimer le grep. Bien que cela puisse nécessiter des devis légèrement différents pour le modèle.{print $1; exit}
pour quitter après la première ligne correspondante.Il est regrettable que
git stash apply stash^{/<regex>}
cela ne fonctionne pas (il ne recherche pas réellement la liste cachée, voir les commentaires sous la réponse acceptée ).Voici des remplaçants sans
git stash list
rendez-vous qui recherchent par expression régulière pour trouver le premier (le plus récent)stash@{<n>}
, puis le transmettent àgit stash <command>
:Notez que les codes de résultat appropriés sont renvoyés afin que vous puissiez utiliser ces commandes dans d'autres scripts. Cela peut être vérifié après l'exécution de commandes avec:
Faites juste attention aux exploits d'expansion variable car je n'étais pas sûr de la
--grep=$1
portion. Cela devrait peut-être l'être,--grep="$1"
mais je ne suis pas sûr que cela interfère avec les délimiteurs d'expressions régulières (je suis ouvert aux suggestions).la source
Cette réponse doit beaucoup à Klemen Slavič. J'aurais juste commenté la réponse acceptée mais je n'ai pas encore assez de représentants :(
Vous pouvez également ajouter un alias git pour trouver la référence cachée et l'utiliser dans d'autres alias pour afficher, appliquer, supprimer, etc.
Notez que la raison du
ref=$( ... ); echo ${ref:-<no_match>};
motif est qu'aucune chaîne vierge n'est renvoyée, ce qui entraînerait sshow, sapply et sdrop à cibler la dernière cachette au lieu d'échouer comme on pourrait s'y attendre.la source
Alias Cela pourrait être une syntaxe plus directe pour les systèmes de type Unix sans avoir besoin d'encapsuler dans une fonction. Ajoutez ce qui suit à ~ / .gitconfig sous [alias]
Utilisation: regex sapply
Exemple: git sshow MySecretStash
Le tiret à la fin indique prendre l'entrée de l'entrée standard.
la source
Utilisez un petit script bash pour rechercher le numéro de la cachette. Appelez ça "gitapply":
Usage:
... où foo est une sous-chaîne du nom de la cachette que vous souhaitez.
la source
Utilisez
git stash save NAME
pour enregistrer.Ensuite ... vous pouvez utiliser ce script pour choisir lequel appliquer (ou pop):
J'aime pouvoir voir les noms des cachettes et choisir. J'utilise également Zshell et je ne savais franchement pas comment utiliser certains des alias Bash ci-dessus;)
Remarque: Comme Kevin le dit, vous devriez plutôt utiliser des balises et des choix de cerise.
la source
git stash save
est déconseillé en faveur degit stash push
.C'est une façon d'y parvenir à l'aide de PowerShell:
Plus de détails ici
la source
dans ma coquille de poisson
utilisation
gsap name_of_stash
la source
Tard dans la soirée ici, mais si vous utilisez VSCode, un moyen rapide de le faire est d'ouvrir la palette de commandes (CTRL / CMD + SHIFT + P) et de taper "Pop Stash", vous pourrez récupérer votre stash par nom sans avoir besoin d'utiliser git CLI
la source
git stash apply
fonctionne également avec d'autres références questash@{0}
. Vous pouvez donc utiliser des balises ordinaires pour obtenir un nom persistant. Cela a également l'avantage que vous ne pouvez pas accidentellementgit stash drop
ougit stash pop
cela.Vous pouvez donc définir un alias
pstash
(alias "stash persistant") comme ceci:Vous pouvez maintenant créer une cachette balisée:
et
show
etapply
encore , comme d' habitude:la source
Je ne pense pas qu'il y ait un moyen de faire sauter une cachette par son nom.
J'ai créé une fonction bash qui le fait.
Exemple d'utilisation:
J'espère que ça aide!
la source
Pour tout autre que la création de stash, je proposerais une autre solution en introduisant fzf comme dépendance. Je recommande de prendre 5 minutes de votre temps et de vous y familiariser, car c'est un excellent booster de productivité.
Quoi qu'il en soit, un extrait connexe de leur page d'exemples proposant une recherche cachée. Il est très facile de changer le scriptlet pour ajouter des fonctionnalités supplémentaires (comme l'application stash ou la suppression):
la source
Donc, je ne sais pas pourquoi il y a tant de consternation sur ce sujet. Je peux nommer une cachette git avec à la fois une poussée et la sauvegarde obsolète, et je peux utiliser une expression régulière pour la retirer avec une application:
Méthode Git Stash pour utiliser un nom à appliquer
Comme cela a été mentionné précédemment, la commande save est déconseillée, mais elle fonctionne toujours, vous pouvez donc l'utiliser sur des systèmes plus anciens où vous ne pouvez pas les mettre à jour avec un appel push. Contrairement à la commande push, le commutateur -m n'est pas requis avec save.
Il s'agit de Git 2.2 et de Windows 10.
Preuve visuelle
Voici un beau GIF animé illustrant le processus.
Séquence d'événements
Le GIF s'exécute rapidement, mais si vous regardez, le processus est le suivant:
Est-ce même logique?
Pour être franc, je ne sais pas vraiment quel est l'avantage de cette approche. Il est utile de donner un nom à la cachette, mais pas la récupération. Peut-être pour le script du shelve et unshelve processus , il serait utile, mais il est encore plus facile de pop juste une planque par son nom.
Cela me semble beaucoup plus facile que l'expression régulière.
la source