¿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.
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 cuandorebase.autostash
habilitadoRebase 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
banderaSi 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 derebase.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 repoCuando
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 (opull --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 hacergit 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
ygit stash pop
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
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.
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.
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
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