tipos tag repositorio qué que oneline log hace existen etiquetas eliminar crear git git-stash

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 la 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 use git 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 los git 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:

  1. 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ón update_reflog_ent() (en reflog.c ) cambiaría el mensaje asociado con la entrada específica de reflog para actualizar. Una función update_reflog() usaría for_each_reflog_ent() con update_reflog_ent para realmente hacer el cambio.

  2. Un comando git stash rename solo necesitaría llamar a la git 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: no git 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.