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 cuandorebase.autostash
habilitadorebase 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 degit 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 derebase.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 sucioCuando
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 (opull --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 hacergit 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
ygit stash pop