tag - tipos de etiquetas en git
¿Cómo puedo cambiar el nombre de un git stash? (7)
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 :)
EDITAR 22/02/2016
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>]
"
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?
Aquí hay una versión modificada
del alias
de
Julien
que le permite lidiar adecuadamente con el prefijo
On <branch>
generalmente antepuesto a los nombres de alijo:
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 descubrir qué se debe hacer con el nombre de la rama.
Las herramientas
git
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 de la reserva. Tenga en cuenta que esto es diferente del mensaje de confirmación del alijo, que este comando no modifica. El tema de reflog es lo que aparece en lagit 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 usegit stash-rename
para eliminar información confidencial! -
git stash drop <stash>
para descartar 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 losgit stash list
después de que la operación haya finalizado. 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.
Es muy sencillo. 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. :)
La forma más simple: abre tu alijo con git stash pop y guárdalo de nuevo con git stash guarda tu nombre
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 comando
git reflog update
que actualice el mensaje asociado con una entrada específica de reflog. Para hacer esto, una nueva funciónupdate_reflog_ent()
(en reflog.c ) cambiaría el mensaje asociado con la entrada específica de reflog para actualizar. Una funciónupdate_reflog()
usaríafor_each_reflog_ent()
conupdate_reflog_ent
para realmente hacer el cambio.Un comando
git stash rename
solo necesitaría llamar a lagit reflog update
con la referencia apropiada y el nuevo mensaje.
O podría, por supuesto, reventar 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 hacer
git commit --amend
necesitas estar en el TIP de una rama.
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:
- Cree una nueva rama "scratch" (aún no existente) del "alijo en cuestión" y cámbiela
- Retira el viejo alijo. Esto es seguro, ya que todavía tenemos esto en la rama.
-
Utilice
git commit --amend
para reemplazar el mensaje de confirmación, esto cambia el SHA del "alijo en cuestión" - Almacene el alijo, según la respuesta de qzb
- Cambiar de nuevo (lo que supone que vino de "maestro") y limpiar
Inconvenientes:
-
Esto cambia las ramas temporalmente. Por lo tanto, esta receta solo se puede aplicar cuando el
git status --porcelain
está limpia (léase: nogit status --porcelain
nada) -
Renumera los escondites, por lo que el alijo modificado se convierte en
stash@{0}
-
Debe ingresar
$MESSAGE
dos veces o usar 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.
Ejemplo
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 tu 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,
refs/stash
ha cambiado un SHA.
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 de alijo que desea renombrar:
$ 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.