¿Puede" git pull " almacenar y pop automáticamente los cambios pendientes?


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 bailar para mí?

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

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

Author: halfer, 2015-05-13

5 answers

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

El único git config el escenario que sería de interés es:

rebase.autoStash

Cuando se establece en true, 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 trabajo sucio.

Sin embargo, use con cuidado: la aplicación de alijo final después de un rebase exitoso podría resultar en conflictos no triviales. Predeterminado a false.

Combínalo con: {[48]]}

pull.rebase

Cuando true, rebase las 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 un simple git pull para trabajar incluso en un árbol sucio.
No se necesita alias en ese caso.


See commit 53c76dc (04 Jul 2015) by Kevin Daudt (Ikke).
(Merged by Junio C Hamano -- gitster -- in commit e69b408 , 17 Aug 2015)

pull: permitir árbol sucio cuando rebase.autostash habilitado

Rebase aprendió a guardar cambios cuando se encuentra con un árbol de trabajo sucio, pero git pull --rebase no.

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


Nota: si desea extraer sin autostash (aunque rebase.autoStash true está configurado), tiene desde git 2.9 (Junio 2016):

 pull --rebase --no-autostash

Véase commit 450dd1d, commit 1662297, commit 44a59ff, commit 5c82bcd, commit 6ddc97c, commit eff960b, commit efa195d (02 Apr 2016), and commit f66398e, commit c48d73b (21 Mar 2016) by Mehul Jain (mehul2029).
(Merged by Junio C Hamano -- gitster -- in commit 7c137bb, 13 Apr 2016)

Commit f66398e incluye en particular:

pull --rebase: añadir --[no-]autostash bandera

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

Enseña "git pull --rebase " la bandera de la línea de comandos --[no-]autostash que anula el valor actual de rebase.autoStash, si se establece. Como "git rebase" entiende la opción --[no-]autostash, es solo cuestión de pasar la opción subyacente "git rebase" cuando "git pull --rebase" es called.


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

See commit f15e7cf (01 Jun 2017) by Tyler Brazier (tylerbrazier).
(Merged by Junio C Hamano -- gitster -- in commit 35898ea , 05 Jun 2017)

pull: ff --rebase --autostash works in dirty repo

Cuando git pull --rebase --autostash en un repositorio sucio resultó en un avance rápido, nada estaba siendo autostashed y el tirón falló.
Esto se debió a un atajo para evitar ejecutar rebase cuando podemos avanzar rápido, pero autostash se ignora en esa ruta de código.


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

Así que todo el mundo está escribiendo sobre autostash cuando haces rebase (o pull --rebase).

Pero nadie está tomando sobre autostashing cuando usted hace tirón normal con fusiona.
¿Así que no hay un interruptor automático para eso? O me estoy perdiendo algo? Prefiero hacer git pull --rebase pero OP preguntó sobre " estándar " git pull

Respuesta:

El hilo original discutiendo 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 a la "molestia" que desencadenó este tema, por definición, el cambio local se superpone con la fusión, y este "pop de alijo" interno tocará las rutas la fusión tocó y es probable que no resulte en "Dropped", pero deja otros conflictos por resolver.

Sospecho que pull.autostash la configuración no es una buena adición porque fomenta un flujo de trabajo malo y doloroso.
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", como " rebase" insiste en que comience desde un árbol de trabajo limpio, por lo que "descargar y entonces detente " la molestia se siente más grande. Tengo la sospecha de que aflojar eso puede ser una solución más productiva al problema real.

Por lo tanto, con respecto a una fusión clásica, es mejor:{[48]]}

Animar al usuario a pensar en la naturaleza de WIP he tiene en el árbol de trabajo antes de correr "git pull".
¿Es una bestia demasiado compleja que puede interferir con lo que otros están haciendo, o ¿es un cambio trivial que pueda esconderse y devolverlo?

Si el primero, será mucho mejor hacer " checkout -b", mantener trabajando hasta que el cambio local se pone en algo mejor forma y "commit", antes de entrar en la rama original.

Si esto último, es mejor que lo haga: {[48]]}

  • "git pull",
  • después de encontrar conflictos, ejecute
    • git stash,
    • git merge FETCH_HEAD y
    • git stash pop
 120
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-08 16:09:35

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

git pull --rebase --autostash
 18
Author: Vitaliy Ulantikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-19 19:35:48

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

git fetch
git rebase --autostash FETCH_HEAD

O póngalo como un alias:

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

Entonces haz:

git pullr

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

 14
Author: user397114,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-22 22:56:28

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 en lugar de merge, por lo que los ajustes/opciones como --ff-only no se aplicarán.

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

 5
Author: blueyed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-03 18:18:55

Como ya mencionaste esta es la manera de hacerlo. Puede usarlo en alias para guardarlo escribiendo y usar un acceso directo 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 usted, pero en una sola línea (&&) y si se establece como 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
 1
Author: CodeWizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 08:40:32