Yo se como solucionar 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
Sin embargo, no hay una manera de dejar que git pullhaga el stashy popbaile para mí?
Si este comando tiene un nombre diferente, está bien.
Crear un alias de shell para git stash; git pull; git stash popes una solución, pero busco una mejor solución.

git stash; git pull; git stash popprogramáticamente es peligroso, porque si no hay nada que esconder,git stashserá una operación no operativa, perogit stash popsacará el último alijo (si lo hay), que es casi seguro que no es lo que desea. El usuario torek tiene una excelente publicación sobre esto en Stack Overflow, pero no puedo encontrarla ...Respuestas:
Para Git 2.6+ (lanzado el 28 de septiembre de 2015)
los
solamentegit configel escenario que sería de interés es:(con Git 2.27, Q2 2020, ahora también lo tiene
merge.autostash, ver más abajo)combinar eso con:
Eso sería suficiente para que un simple
git pullfuncione incluso en un árbol sucio.En ese caso, no se necesita un alias.
Consulte la confirmación 53c76dc (4 de julio de 2015) de Kevin Daudt (
Ikke) .(Combinado por Junio C Hamano -
gitster- en el compromiso e69b408 , 17 de agosto de 2015)Nota: si desea extraer sin autostash (aunque
rebase.autoStash trueesté configurado), lo tiene desde git 2.9 (junio de 2016):Consulte la confirmación 450dd1d , la confirmación 1662297 , la confirmación 44a59ff , la confirmación 5c82bcd , la confirmación 6ddc97c , la confirmación eff960b , la confirmación efa195d (02 de abril de 2016) y la confirmación f66398e , la confirmación c48d73b (21 de marzo de 2016) por Mehul Jain (
mehul2029) .(Combinado con Junio C Hamano -
gitster- en el compromiso 7c137bb , 13 de abril de 2016)El compromiso f66398e en particular incluye:
Advertencia: antes de Git 2.14 (tercer trimestre de 2017), "
git pull --rebase --autostash" no se guardaba automáticamente cuando el historial local avanzaba rápidamente hacia arriba.Consulte la confirmación f15e7cf (01 de junio de 2017) de Tyler Brazier (
tylerbrazier) .(Combinado por Junio C Hamano -
gitster- en el compromiso 35898ea , 05 de junio de 2017)Actualización: Mariusz Pawelski hace en los comentarios una pregunta interesante:
Responder:
El hilo original que analiza esta función de autoestadificación, se implementó originalmente tanto para
git pull(fusionar) como paragit pull --rebase.Pero ... Junio C Hamano (mantenedor de Git) señaló que:
Entonces, con respecto a un pull-merge clásico, es mejor:
Dicho esto, con Git 2.27 (Q2 2020), "
git pull" aprendí a advertir cuando nopull.rebaseexiste ninguna configuración y no se da--[no-]rebaseni--ff-onlyse da (lo que resultaría en una fusión).Consulte la confirmación d18c950 (10 de marzo de 2020) de Alex Henrie (
alexhenrie) .(Combinado por Junio C Hamano -
gitster- en el compromiso 1c56d6f , 27 de marzo de 2020)Con Git 2.27 (Q2 2020), "
git merge" aprende la--autostashopción " " y la nuevamerge.autostashconfiguración.Ver cometer d9f15d3 , comprometerse f8a1785 , comprometerse a03b555 , comprometerse 804fe31 , comprometerse 12b6e13 , cometen 0dd562e , cometen 0816f1d , comprometerse 9bb3dea , cometen 4d4bc15 , comprometerse b309a97 , comprometerse f213f06 , comprometerse 86ed00a , cometen facca7f , comprometerse be1bb60 , comprometerse efcf6cf , comprometerse c20de8b , cometen bfa50c2 , confirmar 3442c3d , confirmar 5b2f6d9 (07 de abril de 2020), confirmar 65c425a(4 de abril de 2020), y confirme fd6852c , confirme 805d9ea (21 de marzo de 2020) por Denton Liu (
Denton-L) .(Combinado por Junio C Hamano -
gitster- en el compromiso bf10200 , 29 de abril de 2020)Y:
fuente
rebase.autoStashse aplica solo cuando se usa rebase.pull.rebasese aplica solo cuando se usa pull.die_on_unclean_work_tree.2.5.5.rebase(opull --rebase). Pero nadie se está tomando el autoescritura cuando lo haces normalmentepullcon las fusiones. ¿Entonces no hay un interruptor automático para eso? ¿O me falta algo? Prefiero hacerlo,git pull --rebasepero OP preguntó sobre "estándar"git pullPara ahorrar unos segundos para los exploradores que se acercan, aquí hay un resumen (gracias a @VonC):
fuente
git config pull.rebase trueygit config rebase.autoStash true, todo lo que necesitará esgit pull. Sologit pull. No se requieren otras opciones.--autostashopción. Las-c rebase.autoStash=trueobras en Git 2.6 en adelante.Como se indicó en el comentario anterior, establecer los dos valores de configuración no funciona actualmente
git pull, ya que la configuración de autostash solo se aplica a las rebases reales. Estos comandos de git hacen lo que quieres:O configúrelo como un alias:
Entonces hazlo:
Por supuesto, este alias puede cambiarse de nombre como desee.
fuente
Con Git 2.6+ puedes usar lo siguiente:
Esto
--rebasehace que git-pull se use enrebaselugar demerge, por lo que las configuraciones / opciones como--ff-onlyno se aplicarán.Estoy usando un alias para extraer
--ff-onlyde forma predeterminada (git pull --ff-only), y luego puedo usargup(desde arriba) en caso de que no sea posible una combinación de avance rápido o haya cambios ocultos.fuente
git pull --ff-onlyy?git pull pull --rebase --autostashComo ya mencionaste, esta es la forma de hacerlo. Puede usarlo en alias para ahorrarle escribir y usar atajos o puede usarlo en una sola línea (también puede ser un alias)
git stash && git pull --rebase && git stash popHará lo mismo que hiciste, pero en una sola línea (&&) y si lo configuras como alias, será incluso más corto.
Las siguientes líneas mostrarán los cambios entrantes / salientes antes de tirar / empujar
fuente
stash popeliminará algunas cosas al azar de antes.git stashno guarda nada, todavía no "devuelve" ningún código de error, por lo que && continuará congit pullygit stash popy mostrará un alijo anterior. ¡Así que es mejor no usar esto a menos que esté seguro de que guardará algo!