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 pull
haga el stash
y pop
baile 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.
git stash; git pull; git stash pop
programáticamente es peligroso, porque si no hay nada que esconder,git stash
será una operación no operativa, perogit stash pop
sacará 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 config
el 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 pull
funcione 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 true
esté 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.rebase
existe ninguna configuración y no se da--[no-]rebase
ni--ff-only
se 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--autostash
opción " " y la nuevamerge.autostash
configuració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.autoStash
se aplica solo cuando se usa rebase.pull.rebase
se 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 normalmentepull
con las fusiones. ¿Entonces no hay un interruptor automático para eso? ¿O me falta algo? Prefiero hacerlo,git pull --rebase
pero OP preguntó sobre "estándar"git pull
Para ahorrar unos segundos para los exploradores que se acercan, aquí hay un resumen (gracias a @VonC):
fuente
git config pull.rebase true
ygit config rebase.autoStash true
, todo lo que necesitará esgit pull
. Sologit pull
. No se requieren otras opciones.--autostash
opción. Las-c rebase.autoStash=true
obras 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
--rebase
hace que git-pull se use enrebase
lugar demerge
, por lo que las configuraciones / opciones como--ff-only
no se aplicarán.Estoy usando un alias para extraer
--ff-only
de 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-only
y?git pull pull --rebase --autostash
Como 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 pop
Hará 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 pop
eliminará algunas cosas al azar de antes.git stash
no guarda nada, todavía no "devuelve" ningún código de error, por lo que && continuará congit pull
ygit stash pop
y mostrará un alijo anterior. ¡Así que es mejor no usar esto a menos que esté seguro de que guardará algo!