web-dev-qa-db-fra.com

Comment puis-je renommer une réserve git?

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?

168
mikemaccana

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é.

215
qzb

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 :)

EDIT 2016/02/22

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>] "

59
Julien Carsique

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:

  1. 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 fonction update_reflog_ent() _ (in reflog.c ) modifierait le message associé à l'entrée de reflog spécifique à mettre à jour. . Une fonction update_reflog() utiliserait for_each_reflog_ent() avec update_reflog_ent Pour effectuer le changement.

  2. Une commande git stash rename N'aurait alors besoin que d'appeler git 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]

3
A1ternat1ve

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é:

  • Créez une nouvelle branche "scratch" (pas encore existante) à partir de la "réserve en question" et passez à celle-ci.
  • Enlevez la vieille cachette. Ceci est sûr, car nous avons toujours cela sur la branche.
  • Utilisez git commit --amend Pour remplacer le message de validation, cela change le SHA du "stash en question"
  • Stockez la réserve, sur la base du réponse de qzb
  • Revenez en arrière (ce qui suppose que vous veniez de "maître") et nettoyez

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.

Exemple

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.

3
Tino

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.
1
Radon Rosborough

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. :)

1
Sandra

Manière la plus simple: ouvrez votre cachette avec git stash pop puis enregistrez-la à nouveau avec git stash enregistrez votre nom

0
yoel neuman