¿Puede "git pull" esconderse automáticamente y mostrar cambios pendientes?

Sé cómo resolver esto:

[email protected]$ 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 baile pop para mí?

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

Creando 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.

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

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

 rebase.autoStash 

Cuando se establece en verdadero, crea automáticamente un alijo temporal antes de que comience la operación, y lo aplica después de que finaliza la operación.
Esto significa que puede ejecutar rebase en un tree de trabajo sucio.

Sin embargo, úselo con cuidado: la aplicación definitiva de ocultación después de una rebase exitosa puede resultar en conflictos no triviales. El valor pnetworkingeterminado es falso.

combine eso con:

 pull.rebase 

Cuando es verdadero, la rebase se bifurca en la parte superior de la twig extraída, en lugar de fusionar la twig pnetworkingeterminada del control remoto pnetworkingeterminado 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 tree sucio.
No se necesita alias en ese caso.


Consulte commit 53c76dc (04 Jul 2015) por Kevin Daudt ( Ikke ) .
(Fusionada por Junio ​​C Hamano – gitster – in commit e69b408 , 17 de agosto de 2015)

pull : permitir el tree sucio cuando se habilitó rebase.autostash

Rebase aprendió a esconder los cambios cuando encuentra un tree de trabajo sucio, pero git pull --rebase no lo hace.

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


Nota: si quiere tirar sin autostash (aunque se rebase.autoStash true establecido rebase.autoStash true ), tiene desde git 2.9 (junio de 2016):

  pull --rebase --no-autostash 

Consulte commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 Apr 2016), y commit f66398e , commit c48d73b (21 Mar 2016) por Mehul Jain ( mehul2029 ) .
(Fusionado por Junio ​​C Hamano – gitster – in commit 7c137bb , 13 de abril de 2016)

Commit f66398e en particular incluye:

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

Si se establece la variable de configuration rebase.autoStash , no hay forma de git pull --rebase para " git pull --rebase " desde la línea de command.

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


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

Ver commit f15e7cf (01 Jun 2017) por Tyler Brazier ( tylerbrazier ) .
(Fusionado por Junio ​​C Hamano – gitster – en commit 35898ea , 05 de junio de 2017)

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

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

Como dice el comentario anterior, establecer los dos valores de configuration actualmente no funciona con git pull , ya que la configuration autostash solo se aplica a las rebases reales. Estos commands git hacen lo que quieres:

 git fetch git rebase --autostash FETCH_HEAD 

O configúralo 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.

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

 git pull --rebase --autostash 

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 las configuraciones / opciones como --ff-only no se aplicarán.

Estoy usando un alias para tirar 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 de avance rápido o que haya cambios ocultos.

Como ya mencionaste, esta es la forma de hacerlo. Puede usarlo en alias para ahorrarle tipeo y usar 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 hizo, pero en una sola línea (&&) y está configurado como alias, incluso será 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