J'ai une cachette avec un nom incorrect. Je voudrais corriger le nom afin qu'il soit précis.
Comment puis-je renommer une réserve?
Supposons que votre liste de réserve ressemble à ceci:
$ git stash list
stash@{0}: WIP on master: Add some very important feature
stash@{1}: WIP on master: Fix some silly bug
Tout d'abord, vous devez supprimer l'entrée de masquage que vous souhaitez renommer:
$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Maintenant, ajoutez-le à nouveau avec un nouveau message en utilisant sha of commit renvoyé après avoir déposé:
$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
Et c'est tout:
$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature
Cette solution nécessite Git 1.8.4 ou une version ultérieure, et oui, elle fonctionne également avec le répertoire de travail modifié.
Sauf si vous le faites manuellement ou apportez une amélioration à Git, vous pouvez utiliser un alias:
git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git diff-index --quiet HEAD; s=$?; [ $s != 0 ] && git stash save "tmp stash from stash-rename"; git stash apply $rev && shift && git stash save "$@" && [ $s != 0 ] && git stash pop stash@{1}; }; _'
Utilisation: "git stash-rename <stash> [save options] [<message>]
"
Avec [save options]
toute option de git stash save
: [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]
Exemple:
$ git stash list
stash@{0}: On master: Pep8 format
stash@{1}: On master: co other than master with local changes
stash@{2}: On master: tests with deployAtEnd
# Let's say I want to rename the stash@{2} adding an issue reference:
$ git stash-rename stash@{2} NXP-13971-deployAtEnd
$ git stash list
stash@{0}: On master: NXP-13971-deployAtEnd
stash@{1}: On master: Pep8 format
stash@{2}: On master: co other than master with local changes
Cela fonctionnera même si vous avez des modifications locales non mises en scène :)
Script simplifié, crédits à qzb , https://stackoverflow.com/a/35549615/51597
git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'
Utilisation: "git stash-rename <stash> [<message>]
"
Je ne pense pas qu'il soit possible de le faire. Il y a eu ne proposition de changement de nom de cachette mais cela n'a pas encore été mis en œuvre.
Mon idée générale est:
Implémentez une nouvelle commande
git reflog update
Qui met à jour le message associé à une entrée de reflog spécifique. Pour ce faire, une nouvelle fonctionupdate_reflog_ent()
_ (in reflog.c ) modifierait le message associé à l'entrée de reflog spécifique à mettre à jour. . Une fonctionupdate_reflog()
utiliseraitfor_each_reflog_ent()
avecupdate_reflog_ent
Pour effectuer le changement.Une commande
git stash rename
N'aurait alors besoin que d'appelergit reflog update
Avec la référence appropriée et un nouveau message.
Ou vous pouvez, bien sûr, faire apparaître la réserve et faire un git stash save [message]
Pour le bénéfice du lecteur, voici un extension à la réponse correcte et acceptée actuellement .
Si vous voulez non seulement corriger le message de dissimulation, mais également corriger le message de validation de la dissimulation, tel que
git stash list
et
git log --oneline -1 stash
les deux sont d'accord sur ce qui est montré, vous avez besoin d'un peu plus. Il y a peut-être une meilleure façon de le faire, mais j'espère que cette recette est facile à comprendre.
Pour pouvoir faire git commit --amend
, Vous devez être sur le TIP d'une branche. La solution est donc la suivante:
git checkout -b scratch stash@{1}
git stash drop stash@{1}
git commit --amend -m "$MESSAGE"
git stash store -m "$MESSAGE" HEAD
git checkout master
git branch -D scratch
A expliqué:
git commit --amend
Pour remplacer le message de validation, cela change le SHA du "stash en question"Désavantages:
Cela change de branche temporairement. Donc, cette recette ne peut être appliquée que lorsque git status --porcelain
Est propre (lire: ne rien afficher)
Il renumérote les cachettes, donc la cachette modifiée devient stash@{0}
Vous devez entrer le $MESSAGE
Deux fois ou utiliser une variable d'environnement (dans l'exemple: MESSAGE
)
Vous devez trouver un nom de branche inutilisé
Il y a moyen de le faire sans changer de branche, mais cela dépasse le cadre de cette réponse.
git init scratch
cd scratch
for a in A B C D; do date >$a; git add $a; git commit -m $a; done
for a in X Y; do echo $a > Z; git stash save --all; done
git log --oneline --graph --decorate --all; git stash list
Sortie
*-. e0e281b (refs/stash) WIP on master: 8bdcc32 D
|\ \
| | * 4d62f52 untracked files on master: 8bdcc32 D
| * 096f158 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: WIP on master: 8bdcc32 D
stash@{1}: WIP on master: 8bdcc32 D
Maintenant sans changer de commit (note: le SHA dans ce qui suit sera différent de votre côté)):
git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list
Sortie
*-. 2fbf900 (refs/stash) WIP on master: 8bdcc32 D
|\ \
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D
Comme vous pouvez le constater, stash@{0}
Apparaît toujours sous la forme 2fbf900 (refs/stash) WIP on master: 8bdcc32 D
dans git log
. Si vous regardez attentivement, vous verrez que plusieurs commits ont changé de SHA. Cela est dû à la façon dont les cachettes sont traitées (les parents sont inclus dans le SHA et les cachettes ont leur cachette en tant que parent).
Répare ça:
git checkout -b scratch stash
git stash drop
git commit --amend -m ...changed...
git stash store -m ...changed... HEAD
git checkout master
git branch -D scratch
git log --oneline --graph --decorate --all; git stash list
Sortie
*-. 4d55186 (refs/stash) ...changed...
|\ \
| | * 246dc5c untracked files on master: 8bdcc32 D
| * 80c5ea0 index on master: 8bdcc32 D
|/
* 8bdcc32 (HEAD, master) D
* c84c659 C
* 49bb2da B
* b1852c6 A
stash@{0}: ...changed...
stash@{1}: WIP on master: 8bdcc32 D
Comme vous pouvez également le constater, refs/stash
A également changé de SHA.
Voici une version modifiée de alias de Julien qui vous permet de gérer correctement le On <branch>
préfixe généralement préfixé pour cacher les noms:
git config --global alias.stash-rename '!_() { newmsg="$1" && stash=${2:-"stash@{0}"} && newbranch="$3" && sha=$(git rev-parse "$stash") && olddesc="$(git stash list --format=%gs -1 "$stash")" && newdesc="$(if [[ "$newbranch" = "." ]]; then echo "$newmsg"; else if [[ -n "$newbranch" ]]; then echo "On $newbranch: $newmsg"; else if [[ "$olddesc" =~ ":" ]]; then echo "$(echo "$olddesc" | cut -f1 -d":"): $newmsg"; else echo "$newmsg"; fi; fi; fi)" && git stash drop "$stash" > /dev/null || exit 1; git stash store -m "$newdesc" "$sha" && git stash list; }; _'
Syntaxe:
git stash-rename <new-name> [<stash> [<new-branch-name> | .]]
Exemple d'utilisation:
repo[master] % touch tmp && git add tmp && git stash save first
Saved working directory and index state On master: first
HEAD is now at bd62064 Initial commit
repo[master] % touch tmp && git add tmp && git stash save second
Saved working directory and index state On master: second
HEAD is now at bd62064 Initial commit
repo[master] % git stash list
stash@{0}: On master: second
stash@{1}: On master: first
repo[master] % git stash-rename renamed
stash@{0}: On master: renamed
stash@{1}: On master: first
repo[master] % git stash-rename also-renamed stash@{1}
stash@{0}: On master: also-renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-changed stash@{0} new-branch
stash@{0}: On new-branch: branch-changed
stash@{1}: On master: renamed
repo[master] % git stash-rename branch-name-persists
stash@{0}: On new-branch: branch-name-persists
stash@{1}: On master: renamed
repo[master] % git stash-rename no-branch stash@{0} .
stash@{0}: no-branch
stash@{1}: On master: renamed
repo[master] % git stash-rename renamed
stash@{0}: renamed
stash@{1}: On master: renamed
repo[master] % git stash-rename readd-branch stash@{0} develop
stash@{0}: On develop: readd-branch
stash@{1}: On master: renamed
La majeure partie de la commande sert à analyser les arguments et à déterminer ce qui doit être fait pour le nom de la branche. Les outils git
utilisés sont les suivants:
git rev-parse <stash>
pour trouver le SHA de la réserve.git stash list --format=%gs -1 <stash>
pour trouver le sujet du reflog de la réserve. Notez que ceci est différent du message de validation de la réserve, qui n'est pas modifié par cette commande. Le sujet de reflog est ce qui apparaît dans git stash list
, et vous pouvez changer le sujet de refochage sans changer les hachages des commits associés aux stash. Cependant, vous pouvez toujours trouver le message de validation d'origine, aussi n'utilisez pas git stash-rename
pour supprimer les informations sensibles!git stash drop <stash>
pour déposer l'ancienne référence dans la réserve (mais nous avons toujours le SHA, donc ce n'est pas perdu).git stash store -m <new-message> <sha>
pour enregistrer une nouvelle référence dans la réserve avec les mêmes informations de validation, mais un sujet de reflog différent .git stash list
pour lister les stash à la fin de l'opération. Notez que les nouveaux stash sont toujours poussés au début de la liste. Il serait nécessaire de repousser toutes les cachettes avant la cachette d’intérêt afin de rétablir sa position initiale.C'est très simple. Tout d'abord, défaites le dernier stock avec:
git stash pop
Ensuite, vous pouvez enregistrer la réserve avec un nom personnalisé de la manière suivante:
git stash save "your explanatory name"
J'espère que cela vous sera utile. :)
Manière la plus simple: ouvrez votre cachette avec git stash pop puis enregistrez-la à nouveau avec git stash enregistrez votre nom