¿Cómo puedo solucionar esta advertencia de Git? "Se desaconseja tirar sin especificar cómo conciliar ramas divergentes"

Resuelto Davide Casiraghi asked hace 4 años • 34 respuestas

Después de un git pull origin master, recibo el siguiente mensaje:

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

El intento parece exitoso, pero no estoy seguro.

¿Qué puedo hacer para arreglar esto?

Davide Casiraghi avatar Jun 30 '20 15:06 Davide Casiraghi
Aceptado

En su modo predeterminado, git pull es la abreviatura de git fetch seguido de git merge FETCH_HEAD.

Cuando haces un git pull origin master,
git pullrealiza una fusión, lo que a menudo crea una confirmación de fusión. Por lo tanto, de forma predeterminada, extraer datos desde el control remoto no es una operación inofensiva: puede crear un nuevo valor hash SHA de confirmación que no existía antes. Este comportamiento puede confundir al usuario, porque lo que parece ser una operación de descarga inofensiva en realidad cambia el historial de confirmaciones de manera impredecible.

Para evitar esto, es necesario

git pull --ff-only

(¿O no? Sigue leyendo para ver cuál se ajusta a tus necesidades)

Con git pull --ff-only, Git actualizará su rama sólo si se puede "avanzar rápidamente" sin crear nuevas confirmaciones. Si esto no se puede hacer, git pull --ff-onlysimplemente se cancela con un mensaje de error.

Puedes configurar tu cliente Git para que lo use siempre --ff-onlyde forma predeterminada, de modo que obtengas este comportamiento incluso si olvidas el indicador de la línea de comandos:

git config --global pull.ff only

Nota: La --globalbandera aplica el cambio a todos los repositorios de su máquina. Si desea este comportamiento solo para el repositorio en el que se encuentra, omita la marca.

Tomado de aquí



Esta advertencia se agregó en Git 2.27.

Así es como se ve la advertencia completa:

Se desaconseja tirar sin especificar cómo conciliar ramas divergentes. Puede silenciar este mensaje ejecutando uno de los siguientes comandos en algún momento antes de su siguiente extracción:

git config pull.rebase false # merge (la estrategia predeterminada)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only

Puede reemplazar "git config" con "git config --global" para establecer una preferencia predeterminada para todos los repositorios. También puede pasar --rebase, --no-rebase o --ff-only en la línea de comando para anular el valor predeterminado configurado por invocación.

La advertencia presenta tres comandos como opciones, todos ellos suprimirán la advertencia. Pero tienen diferentes propósitos:

git config pull.rebase false     # merge (the default strategy)

Esto mantiene el comportamiento predeterminado y suprime la advertencia.

git config pull.rebase true      # rebase

En realidad, esto se confirma encima de la rama remota, manteniendo una única rama tanto local como remotamente (a diferencia del comportamiento predeterminado donde están involucradas dos ramas diferentes, una local y otra remota, y, para combinar las dos, se realiza una fusión). ).

git config pull.ff only          # fast-forward only

Esto solo realiza la extracción si la sucursal local puede avanzar rápidamente. De lo contrario, simplemente aborta con un mensaje de error (y no crea ninguna confirmación).


Actualización 1:

Si tiene Git 2.29 o superior, ahora puede configurarlo en o pull.ffpara falsedeshacerse de la advertencia.trueonly

git config pull.ff true

true- Este es el comportamiento estándar. La extracción se adelanta rápidamente si es posible; de ​​lo contrario, se fusiona.

git config pull.ff false

false- La extracción nunca avanza rápidamente y siempre se crea una combinación.

git config pull.ff only

only- La extracción se adelanta rápidamente si es posible; de ​​lo contrario, la operación se cancela con un mensaje de error.


Actualización 2:
hubo un error en esta característica recientemente implementada hasta la versión 2.35en la que Git mostraba esta advertencia incluso si el usuario pasaba una de las tres banderas con el git pullcomando. Esto ya se ha solucionado, considere actualizar su Git a una versión 2.36o superior.


Notas:

  • Lea esta respuesta muy bien escrita de Torek para tener una idea mucho más clara de lo que realmente sucede detrás de escena y comprender qué opción es la más adecuada para usted.

  • Es posible que desee estar atento a la respuesta de VonC aquí para obtener actualizaciones sobre los cambios realizados en esta función en futuras actualizaciones.

Qumber avatar Jun 30 '2020 08:06 Qumber

Esta es una nueva advertencia agregada en Git 2.27 :

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

Para eliminar la advertencia, establezca uno de los valores sugeridos en su comportamiento predeterminado preferido git pullsi no especifica el comportamiento en la línea de comando (usando --ff, --no-ff, --ff-only, --rebase). En todos los casos, gitintentaremos una fusión de avance rápido (¿ Qué es git fast-forwarding? ) si es posible. La configuración controla lo que sucede cuando hay cambios en su sucursal pero no están presentes en la sucursal remota.

  git config pull.rebase false  # merge (the default strategy)

Este es el comportamiento predeterminado existente; configúrelo para que no haya advertencias ni cambios de comportamiento; gitfusionará la sucursal remota con la local.

  git config pull.rebase true   # rebase

Aquí, gitintentaremos cambiar la base de sus cambios en la parte superior de la rama remota. Consulte ¿Cuándo debo usar git pull --rebase? para obtener más detalles sobre por qué es posible que desee eso.

  git config pull.ff only       # fast-forward only

Si no es posible realizar una fusión rápida, gitse negará a continuar. Como diferencia entre git pull --rebase y git pull --ff-only comillas:

Negarse a fusionarse y salir con un estado distinto de cero a menos que el HEAD actual ya esté actualizado o la fusión se pueda resolver como un avance rápido

Joe avatar Jun 30 '2020 08:06 Joe