¿Cómo nombro y recupero un alijo de Git por nombre?

10 minutos de lectura

avatar de usuario
Suán

¿Cómo puedo guardar/aplicar un alijo con un nombre? No quiero tener que buscar su número de índice en git stash list. Lo intenté git stash save "my_stash_name"pero eso solo cambia la descripción del alijo, y el correspondiente git apply "my_stash_name" no funciona

  • git stash push -m stashname es el sintaxis actual. git stash save stashname ha quedado en desuso.

    – SherylHohman

    25 de abril de 2018 a las 18:08


  • git stash push -m stashname no funciona en 2.8.0.windows.1.

    – Jac

    10 de junio de 2018 a las 10:29

  • Git para Windows 2.26.0 se lanzó hace unos días. Tal vez ahora está arreglado. github.com/git-for-windows/git/releases/tag/v2.26.0.windows.1

    – tom_mai78101

    6 de abril de 2020 a las 13:18

  • En realidad, creo que si su lista de reserva tiene más de tres elementos, debería repensar su flujo de trabajo.

    – U. Windl

    8 de abril de 2021 a las 6:40

  • Comando git personalizado simple (enlace a la esencia). Uso: git bottle name y luego mas tarde git apply name.patchvea mi respuesta si desea una explicación más completa y ejemplos de uso.

    – GrayedFox

    31 de agosto de 2021 a las 12:17


avatar de usuario
Sri Murthy Upadhyayula

A ahorrar un alijo con un mensaje:

git stash push -m "my_stash_name"

A lista escondites:

git stash list

Todos los escondites se almacenan en una pila.


A aplicar y eliminar la nalijo:

git stash pop [email protected]{n}

A aplicar y eliminar un alijo por nombre:

git stash pop stash^{\my_stash_name}

A aplicar la nalijo:

git stash apply [email protected]{n}

A aplicar un alijo por nombre:

git stash apply stash^{\my_stash_name}

  • OP está tratando explícitamente de evitar los nombres de alijo torpemente llamados @ {n} para el nombre personalizado. git stash apply <custom-name>

    – estofadocuadrado

    13 de enero de 2017 a las 21:13


  • git stash push -m my_stash es el sintaxis actual. git stash save my_stash ha quedado en desuso.

    – SherylHohman

    25 de abril de 2018 a las 18:11


  • esto es confuso. Solo @AdamB respondió la pregunta.

    – kiedysktos

    24 de octubre de 2019 a las 13:12

  • si está utilizando Windows Power-Shell, la aplicación oculta podría arrojar un error. Así que mantenlo entre comillas. git stash apply "[email protected]{n}"

    – Naveen

    21 de agosto de 2020 a las 1:58


  • Creé un alijo usando git stash push -m my_stash luego lo hizo git stash apply my_stash y dio error. git stash apply stash^{/my_stash} hizo el trabajo Obtuve esta de otra respuesta de @Cameron McKenzie.

    – Abinash Dash

    23 de septiembre de 2021 a las 8:49


avatar de usuario
EssaidiM

git stash save es obsoleto a partir de 2.15.x/2.16, en su lugar puede usar git stash push -m "message"

Puedes usarlo así:

git stash push -m "message"

donde “mensaje” es tu nota para ese alijo.

Para recuperar el alijo puedes usar: git stash list. Esto generará una lista como esta, por ejemplo:

[email protected]{0}: On develop: perf-spike
[email protected]{1}: On develop: node v10

Entonces simplemente usas apply dándole el [email protected]{index}:

git stash apply 1

Referencias
página man de git stash

  • docs mostrando push más bien que save sintaxis: empujar el alijo de git

    – SherylHohman

    25 de abril de 2018 a las 18:04

  • Esta es la verdadera respuesta. Desafortunadamente, hay un montón de respuestas antiguas encima.

    – más

    12 dic 2018 a las 19:37

  • Para más información sobre los más nuevos git stash push: stackoverflow.com/a/47231547/6309

    – VoC

    28 de enero de 2019 a las 15:03

  • FWIW: cuando se ejecutagit stash apply [email protected]{1} en Powershell obtendrá un error: unknown switch 'e' espalda. En su lugar, use git stash apply --index 1 o git stash apply '[email protected]{1}' o escapar } y { con un acento grave `.

    – Los Manos

    26 de mayo de 2020 a las 6:59


  • ¿Por qué git elige un estilo de nomenclatura incómodo como [email protected]{1}? Esto es realmente difícil de escribir en la línea de comandos. Si podemos escribir algo como git stash show -p @1 seria mucho mas facil…

    – cero x

    10 de agosto de 2020 a las 6:49

avatar de usuario
Pat Niemeyer

Si solo está buscando una forma liviana de guardar algunos o todos los cambios de su copia de trabajo actual y luego volver a aplicarlos a voluntad, considere un archivo de parche:

# save your working copy changes
git diff > some.patch

# re-apply it later
git apply some.patch

De vez en cuando me pregunto si debería usar alijos para esto y luego veo cosas como la locura anterior y estoy contento con lo que estoy haciendo 🙂

  • ¡Eso es todo! Gracias. También actualicé mi .gitignore para ignorar los archivos .patch y estoy listo para tener tantos parches como quiera.

    – LÍNEAS

    24 de junio de 2019 a las 14:27

  • Puedo ver la intención detrás de la pregunta, que es aplicar algunos cambios locales cada vez que saca una rama del maestro y no los confirma. Entonces, quizás la pregunta debería haber sido corregida y esta respuesta debería haber sido aceptada como la solución. Simple también.

    -Karthick Meenakshi Sundaram

    18 de febrero de 2020 a las 10:13


  • Buena alternativa al alijo

    – isapir

    20 de agosto de 2020 a las 18:06

  • Creo que podemos querer aumentar esta respuesta con una git apply --3way some.patch. Este es más parecido al tradicional. git stash apply Acercarse. De lo contrario, los conflictos pueden hacer que la aplicación del parche falle.

    –Vance Palacio

    13 de noviembre de 2020 a las 20:46


  • No creo que esto haga nuevos archivos.

    – james emanon

    18 de mayo de 2021 a las 5:33

avatar de usuario
adam dimitruk

Puedes convertir un alijo en una rama si crees que es lo suficientemente importante:

git stash branch <branchname> [<stash>]

de la página del manual:

Esto crea y verifica una nueva rama llamada <branchname> a partir de la confirmación en la que el <stash> fue creado originalmente, aplica los cambios registrados en <stash> al nuevo árbol de trabajo e índice, luego suelta el <stash> si eso se completa con éxito. Cuando no <stash> se da, se aplica la última.

Esto es útil si la rama en la que ejecutó git stash save ha cambiado lo suficiente como para que git stash apply falle debido a conflictos. Dado que el alijo se aplica sobre la confirmación que era HEAD en el momento en que se ejecutó el alijo de git, restaura el estado alterno original sin conflictos.

Más tarde, puede cambiar la base de esta nueva rama a algún otro lugar que sea un descendiente de donde estaba cuando se escondió.

avatar de usuario
iWheelComprar

Tengo estas dos funciones en mi .zshrc expediente:

function gitstash() {
    git stash push -m "zsh_stash_name_$1"
}

function gitstashapply() {
    git stash apply $(git stash list | grep "zsh_stash_name_$1" | cut -d: -f1)
}

Usándolos de esta manera:

gitstash nice
gitstashapply nice

  • ¿Qué es “zsh_stash_name_”?

    – Sam Hasler

    5 de diciembre de 2019 a las 11:07

  • @SamHasler solo una cadena única aleatoria. En caso de que quiera saber que el alijo se creó con el alijo normal de git o con estas funciones

    – iWheelBuy

    9 de enero de 2020 a las 11:11

  • Solución elegante para fanáticos de los alias.

    – bigbiggerpepe

    21 de marzo de 2020 a las 9:20

  • ¡Estos son geniales! FWIW, puede lanzarlos directamente en .gitconfig: stashput = "!f() { git stash push -m "stash_name_$1"; }; f". stashget = "!f() { git stash apply $(git stash list | grep 'stash_name_$1' | cut -d: -f1); }; f". Luego, en su configuración sh (por ejemplo, .bashrc o .bash_aliases). ## git stash by name. alias gsp="git stashput " alias gsg="git stashget ". ahora puedes usarlo en la CLI como: prompt# gsp localchanges. prompt# gsg localchanges.

    – dyodji

    16 de noviembre de 2020 a las 18:16


  • yo lo haría grep -m 1 "zsh_stash_name_$1" solo para que devuelva el primer resultado si se usó el mismo nombre varias veces: stackoverflow.com/a/5013198/4984618

    – pgarciacamou

    24 de marzo a las 0:22


avatar de usuario
Miguel

Entonces, no estoy seguro de por qué hay tanta consternación sobre este tema. puedo nombra un git stash con ambos un push y el desaprobado savey puedo usar una expresión regular para recuperarlo con un apply:

Git stash method para usar un nombre para aplicar

$ git stash push -m "john-hancock"

$ git stash apply stash^{/john-hancock}

Como se ha mencionado antes, la save El comando está en desuso, pero aún funciona, por lo que puede usarlo en sistemas más antiguos donde no puede actualizarlos con un push llamar. A diferencia del push comando, el -m el interruptor no es necesario con save.

// save is deprecated but still functional  
$ git stash save john-hancock

Esto es Git 2.2 y Windows 10.

Prueba visual

Aquí hay un hermoso GIF animado que demuestra el proceso.

GIF animado que muestra una solicitud de git stash con un nombre identificable.

Secuencia de eventos

El GIF corre rápido, pero si te fijas, el proceso es este:

  1. los ls el comando muestra 4 archivos en el directorio
  2. touch example.html agrega un quinto archivo
  3. git stash push -m "john-hancock" -a (Los -a incluye archivos sin seguimiento)
  4. los ls el comando muestra 4 archivos después del alijo, lo que significa que el alijo y el restablecimiento completo implícito funcionaron
  5. git stash apply stash^{/john-hancock} carreras
  6. los ls El comando enumera 5 archivos, mostrando el ejemplo.html el archivo fue devuelto, lo que significa que el git stash apply comando funcionó.

¿Esto tiene sentido?

Sin embargo, para ser sincero, no estoy seguro de cuál es el beneficio de este enfoque. Tiene valor dar un nombre al alijo, pero no la recuperación. Tal vez para escribir el guión archivar y desarchivar proceso sería útil, pero aún es mucho más fácil simplemente hacer estallar un alijo por nombre.

$ git stash pop 3
$ git stash apply 3

Eso me parece mucho más fácil que la expresión regular.

  • ¿Qué es “zsh_stash_name_”?

    – Sam Hasler

    5 de diciembre de 2019 a las 11:07

  • @SamHasler solo una cadena única aleatoria. En caso de que quiera saber que el alijo se creó con el alijo normal de git o con estas funciones

    – iWheelBuy

    9 de enero de 2020 a las 11:11

  • Solución elegante para fanáticos de los alias.

    – bigbiggerpepe

    21 de marzo de 2020 a las 9:20

  • ¡Estos son geniales! FWIW, puede lanzarlos directamente en .gitconfig: stashput = "!f() { git stash push -m "stash_name_$1"; }; f". stashget = "!f() { git stash apply $(git stash list | grep 'stash_name_$1' | cut -d: -f1); }; f". Luego, en su configuración sh (por ejemplo, .bashrc o .bash_aliases). ## git stash by name. alias gsp="git stashput " alias gsg="git stashget ". ahora puedes usarlo en la CLI como: prompt# gsp localchanges. prompt# gsg localchanges.

    – dyodji

    16 de noviembre de 2020 a las 18:16


  • yo lo haría grep -m 1 "zsh_stash_name_$1" solo para que devuelva el primer resultado si se usó el mismo nombre varias veces: stackoverflow.com/a/5013198/4984618

    – pgarciacamou

    24 de marzo a las 0:22


avatar de usuario
lirio ballard

Los alijos no están destinados a ser cosas permanentes como tú quieres. Probablemente sería mejor que usaras etiquetas en las confirmaciones. Construye lo que quieras esconder. Haz un compromiso con eso. Crea una etiqueta para esa confirmación. Luego retrocede tu rama a HEAD^. Ahora, cuando quieras volver a aplicar ese alijo, puedes usar git cherry-pick -n tagname (-n es --no-commit).

  • Definitivamente me gusta este enfoque, se siente un poco más limpio tener solo un named commit pasando el rato en algún lugar. La única molestia leve es que no se compromete en la selección de cereza y permanece en la diferencia, lo que significa que no deberá registrarse manualmente durante la próxima confirmación.

    – Aditya diputado

    15 de diciembre de 2016 a las 3:50

  • Este es el más cercano. Creo que voy a hacer algunos alias para esto. No me gusta usar la descripción como “nombre”.

    – estofadocuadrado

    13 de enero de 2017 a las 21:17

  • Es una pena que se agregue al índice y tengas que reiniciar, alguien debería parchear un --no-stage ¡opción! Relacionado: stackoverflow.com/questions/32333383/…

    – Ciro Santilli Путлер Капут 六四事

    19 de septiembre de 2018 a las 8:16

¿Ha sido útil esta solución?