Tengo un alijo con un nombre incorrecto. Me gustaría arreglar el nombre para que sea exacto.
¿Cómo puedo cambiar el nombre de un alijo?
Tengo un alijo con un nombre incorrecto. Me gustaría arreglar el nombre para que sea exacto.
¿Cómo puedo cambiar el nombre de un alijo?
Respuestas:
Supongamos que su lista de escondite se ve así:
$ git stash list
stash@{0}: WIP on master: Add some very important feature
stash@{1}: WIP on master: Fix some silly bug
Primero, debe eliminar la entrada oculta a la que desea cambiarle el nombre:
$ git stash drop stash@{1}
Dropped stash@{1} (af8fdeee49a03d1b4609f294635e7f0d622e03db)
Ahora solo agrégalo nuevamente con un nuevo mensaje usando sha of commit devuelto después de soltar:
$ git stash store -m "Very descriptive message" af8fdeee49a03d1b4609f294635e7f0d622e03db
Y eso es:
$ git stash list
stash@{0}: Very descriptive message
stash@{1}: WIP on master: Add some very important feature
Esta solución requiere git 1.8.4 o posterior, y sí, también funciona con un directorio de trabajo sucio.
git show stash@{0}
Todavía muestra la información anterior después. ¿Cómo arreglar eso? (Tenga en cuenta que el alijo luego obtiene un SHA diferente.)
git show
y comenzar con git stash store
. Luego con git stash list
usted verá el viejo y el nuevo alijo. Finalmente puedes limpiar el viejo alijo con git stash drop
.
git gc
se ejecuta. Después de stash drop
que pueda encontrar fácilmente esta confirmación normalmente inaccesible mediante el git fsck | grep commit
comando.
A menos que lo haga manualmente o contribuya con una mejora a Git, puede usar 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}; }; _'
Uso: " git stash-rename <stash> [save options] [<message>]
"
Con [save options]
cualquier opción de git stash save
:[-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all]
Ejemplo:
$ 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
Eso funcionará incluso si tiene cambios locales no organizados :)
Script simplificado, créditos a qzb , https://stackoverflow.com/a/35549615/515973
git config --global alias.stash-rename '!_() { rev=$(git rev-parse $1) && git stash drop $1 || exit 1 ; git stash store -m "$2" $rev; }; _'
Uso: " git stash-rename <stash> [<message>]
"
git stash-rename 'tests with deployAtEnd' 'NXP-13971-deployAtEnd'
stash@{0}
referencia completa . gist.github.com/jdforsythe/f248bf6c72fc020225cc3e315a32e922 git config --global alias.stash-rename '!_() { if [ -z \"$1\" ] || [ -z \"$2\" ]; then echo \"git stash-rename 0 NewName\" && echo \"\" && git stash list && exit 1; else stash=\"stash@{$1}\"; rev=$(git rev-parse \"${stash}\"); git stash drop \"${stash}\" || exit 1; git stash store -m \"$2\" \"$rev\" || exit 1; git stash list; fi }; _'
Es muy simple. Primero, deshaga el último alijo con:
git stash pop
Después de esto, puede guardar el alijo con un nombre personalizado de esta manera:
git stash save "your explanatory name"
Espero que te sea útil. :)
No creo que sea posible hacerlo. Ha habido una propuesta para cambiar el nombre de alijo, pero aún no se ha implementado.
Mi idea general es:
Implemente un nuevo
git reflog update
comando que actualice el mensaje asociado con una entrada específica de reflog. Para hacer esto, una nuevaupdate_reflog_ent()
función (en reflog.c ) cambiaría el mensaje asociado con la entrada específica de reflog para actualizar. Unaupdate_reflog()
función usaríafor_each_reflog_ent()
conupdate_reflog_ent
hacer realidad el cambio.Un
git stash rename
comando solo necesitaría llamargit reflog update
con la referencia apropiada y el nuevo mensaje.
O podrías, por supuesto, abrir el alijo y hacer un git stash save [message]
Para beneficio del lector, aquí hay una extensión de la respuesta correcta y actualmente aceptada .
Si no solo desea corregir el mensaje oculto y también desea corregir el mensaje de confirmación del ocultamiento, de modo que
git stash list
y
git log --oneline -1 stash
ambos están de acuerdo con lo que se muestra, necesitas un poco más. Puede haber una mejor manera de hacerlo, pero esta receta aquí es fácil de entender, espero.
Para poder hacerlo git commit --amend
, debe estar en la CONSEJO de una sucursal. Por lo tanto, la solución es:
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
Explicado:
git commit --amend
para reemplazar el mensaje de confirmación, esto cambia el SHA del "alijo en cuestión"Inconvenientes:
Esto cambia las ramas temporalmente. Por lo tanto, esta receta solo se puede aplicar cuando git status --porcelain
está limpia (léase: no genera nada)
Renumera los escondites, por lo que el alijo cambiado se convierte stash@{0}
Es necesario introducir el $MESSAGE
doble o utilizar alguna variable de entorno (en el ejemplo: MESSAGE
)
Necesita encontrar un nombre de sucursal no utilizado
Hay formas de hacerlo sin cambiar de rama, pero esto está más allá del alcance de esta respuesta.
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
Salida
*-. 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
Ahora sin cambiar commit (nota: el SHA a continuación será diferente a su lado):
git stash drop stash@{1}
git stash store -m ...changed... 2fbf9007dfdfb95ae269a19e13b8b9ca3e24181c
git log --oneline --graph --decorate --all; git stash list
Salida
*-. 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
Como puede ver, stash@{0}
todavía se muestra como 2fbf900 (refs/stash) WIP on master: 8bdcc32 D
en git log
. Si observa detenidamente, verá que varias confirmaciones han cambiado SHA. Esto se debe a cómo se manejan las reservas (los padres están incluidos en el SHA y las reservas tienen sus reservas como padre).
Arregla eso:
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
Salida
*-. 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
Como también puede ver, también refs/stash
ha cambiado un SHA.
Aquí hay una versión modificada del alias de Julien que le permite lidiar adecuadamente con el On <branch>
prefijo usualmente antepuesto a los nombres escondidos:
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; }; _'
Sintaxis:
git stash-rename <new-name> [<stash> [<new-branch-name> | .]]
Ejemplo de uso:
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 mayor parte del comando es para analizar los argumentos y averiguar qué se debe hacer con el nombre de la rama. Las git
herramientas utilizadas son las siguientes:
git rev-parse <stash>
para encontrar el SHA del alijo.git stash list --format=%gs -1 <stash>
para encontrar el tema de reflog del alijo. Tenga en cuenta que esto es diferente del mensaje de confirmación del alijo, que este comando no cambia. El tema de reflog es lo que aparece en git stash list
, y puede cambiar el tema de reflog sin cambiar los hashes de los commits asociados con los stashes. Sin embargo, siempre puede encontrar el mensaje de confirmación original, ¡así que no lo use git stash-rename
para eliminar información confidencial!git stash drop <stash>
para eliminar la referencia anterior al alijo (pero todavía tenemos el SHA, por lo que no se pierde).git stash store -m <new-message> <sha>
para guardar una nueva referencia al alijo con la misma información de confirmación pero un tema de registro diferente .git stash list
para enumerar las reservas después de que finalice la operación. Tenga en cuenta que las nuevas reservas siempre se envían al principio de la lista. Sería necesario volver a empujar todos los escondites antes del alijo de interés para restaurar su posición original.La forma más simple: abre tu alijo con git stash pop y guárdalo de nuevo con git stash guarda tu nombre