untracked stash name files git git-pull git-stash

name - git stash stack overflow



¿Puede "git pull" esconder y reventar automáticamente los cambios pendientes? (5)

Sé cómo resolver esto:

user@host$ git pull Updating 9386059..6e3ffde error: Your local changes to the following files would be overwritten by merge: foo.bar Please, commit your changes or stash them before you can merge. Aborting

¿Pero no hay una manera de dejar que git pull haga el stash y pop baile pop por mí?

Si este comando tiene un nombre diferente, está bien.

Crear un alias de shell para git stash; git pull; git stash pop git stash; git pull; git stash pop git stash; git pull; git stash pop es una solución, pero busco una mejor solución.


Como se indicó en el comentario anterior, establecer los dos valores de configuración actualmente no funciona con git pull , ya que la configuración de autostash solo se aplica a las nuevas versiones. Estos comandos git hacen lo que quieres:

git fetch git rebase --autostash FETCH_HEAD

O configúrelo como un alias:

git config alias.pullr ''!git fetch; git rebase --autostash FETCH_HEAD''

Entonces hazlo:

git pullr

Por supuesto, este alias se puede renombrar como se desee.


Como ya mencionaste, esta es la forma de hacerlo. Puede usarlo en un alias para guardar su escritura y usar un atajo o puede usarlo en una sola línea (también puede ser un alias)

git stash && git pull --rebase && git stash pop

Hará lo mismo que hizo pero en una sola línea (&&) y si establece el alias, será incluso más corto.

Las siguientes líneas mostrarán los cambios entrantes / salientes antes de tirar / empujar

git log ^master origin/master git log master ^origin/master


Con Git 2.6+ puedes usar lo siguiente:

alias gup=''git -c rebase.autoStash=true pull --rebase''

Esto --rebase hace que git-pull use rebase lugar de merge , por lo que configuraciones / opciones como --ff-only no se aplicarán.

Estoy usando un alias para extraer con --ff-only de forma predeterminada ( git pull --ff-only ), y luego puedo usar gup (desde arriba) en caso de que no sea posible una fusión de avance rápido o haya cambios escondidos.


Para ahorrar unos segundos a los exploradores que se aproximan, aquí hay un resumen (gracias a @VonC):

git pull --rebase --autostash


Para Git 2.6+ (lanzado el 28 de septiembre de 2015)

La única git config que sería de interés es:

rebase.autoStash

Cuando se establece en verdadero, cree automáticamente un alijo temporal antes de que comience la operación y aplíquelo después de que finalice la operación.
Esto significa que puede ejecutar rebase en un árbol de trabajo sucio.

Sin embargo, use con cuidado: la aplicación de almacenamiento final después de un cambio de versión exitoso puede dar lugar a conflictos no triviales. Por defecto es falso.

combina eso con:

pull.rebase

Cuando sea verdadero, vuelva a crear ramas en la parte superior de la rama obtenida, en lugar de fusionar la rama predeterminada del control remoto predeterminado cuando se ejecuta "git pull".

git config pull.rebase true git config rebase.autoStash true

Eso sería suficiente para que un simple git pull funcione incluso en un árbol sucio.
No se necesita alias en ese caso.

Ver commit 53c76dc (04 de julio de 2015) por Kevin Daudt ( Ikke ) .
(Fusionada por Junio ​​C Hamano - gitster - en commit e69b408 , 17 de agosto de 2015)

pull : permitir árbol sucio cuando rebase.autostash habilitado

rebase aprendió a esconder los cambios cuando encuentra un árbol de trabajo sucio, pero git pull --rebase no.

Solo verifique si el árbol de trabajo está sucio cuando rebase.autostash no está habilitado.

Nota: si desea extraer sin autostash (a pesar de que rebase.autoStash true está configurado), tiene desde git 2.9 (junio de 2016):

pull --rebase --no-autostash

Ver commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 abr 2016) y commit f66398e , commit c48d73b (21 de marzo de 2016) por Mehul Jain ( mehul2029 ) .
(Fusionada por Junio ​​C Hamano - gitster - en commit 7c137bb , 13 abr 2016)

Commit f66398e en particular incluye:

pull --rebase : add --[no-]autostash

Si se establece la variable de configuración rebase.autoStash , no hay forma de git pull --rebase para " git pull --rebase " desde la línea de comandos.

Enseñe " git pull --rebase " la bandera de línea de comando --[no-]autostash que anula el valor actual de rebase.autoStash , si está configurado. Como " git rebase " comprende la opción --[no-]autostash , es solo cuestión de pasar la opción a " git rebase " git rebase cuando se llama " git pull --rebase ".

Advertencia: antes de Git 2.14 (Q3 2017), " git pull --rebase --autostash " no se git pull --rebase --autostash automáticamente cuando el historial local avanza rápidamente hacia arriba.

Ver commit f15e7cf (01 jun 2017) por Tyler Brazier ( tylerbrazier ) .
(Fusionada por Junio ​​C Hamano - gitster - en commit 35898ea , 05 jun 2017)

pull : ff --rebase --autostash funciona en repositorio sucio

Cuando git pull --rebase --autostash en un repositorio sucio dio como resultado un avance rápido, no se estaba cargando automáticamente nada y la extracción falló.
Esto se debió a un atajo para evitar ejecutar rebase cuando podemos avanzar rápidamente, pero se ignora autostash en esa ruta de código.

Actualización: Mariusz Pawelski pregunta en los comentarios una pregunta interesante:

Por lo tanto, todo el mundo escribe sobre autostash cuando rebase (o pull --rebase ).

Pero nadie está tomando autoestima cuando haces un tirón normal con fusiones .
Entonces, ¿no hay un interruptor automático para eso? ¿O me falta algo? Prefiero hacer git pull --rebase pero OP me preguntó sobre git pull " estándar "

Responder:

El hilo original que discute esta característica de autostash, se implementó originalmente tanto para git pull (merge) como para git pull --rebase .

Pero ... Junio ​​C Hamano (mantenedor de Git) señaló que:

Si el pull-merge fuera algo que induciría la "molestia" que desencadenó este tema, por definición, el cambio local se superpone con la fusión, y este "stash pop" interno tocará las rutas que tocó la fusión y es probable que no resulte en "Descartados" pero deja más conflictos por resolver.

Sospecho que la configuración pull.autostash no es una buena adición porque alienta un flujo de trabajo malo e inductor de dolor.
En casos simples, puede no doler, pero cuando los cambios locales son complejos, dolería activamente que no tenerlo, y la configuración roba el incentivo para elegir.

La ecuación es algo diferente para "pull-rebase", ya que "rebase" insiste en comenzar desde un árbol de trabajo limpio, por lo que la molestia "descargar y luego detener" se siente más grande. Tengo la sospecha de que aflojar eso puede ser una solución más productiva para el problema real.

Entonces, con respecto a un clásico pull-merge, es mejor:

aliente al usuario a pensar en la naturaleza de WIP que tiene en el árbol de trabajo antes de ejecutar " git pull " .
¿Es una bestia demasiado compleja que puede interferir con lo que otros están haciendo, o es un cambio trivial que él puede esconder y devolver?

Si es lo primero, estará mucho mejor haciendo " checkout -b ", siga trabajando hasta que el cambio local tome una mejor forma y se "comprometa", antes de ingresar a la rama original.

Si es lo último, es mejor que haga:

  • " git pull ",
  • después de encontrar conflictos, corre
    • git stash ,
    • git merge FETCH_HEAD y
    • git stash pop