6288 votos

¿Cuáles son las diferencias entre 'git pull' y 'git fetch'?

¿Cuáles son las diferencias entre git pull y git fetch?

5275voto

Greg Hewgill Puntos 356191

En términos más simples, git pull hace un git fetch seguido de un git merge.

Usted puede hacer un git fetch en cualquier momento para actualizar sus ramas remotas bajo refs/remotes/<remote>/. Esta operación no cambia nunca ninguna de sus propias ramas locales bajo refs/heads, y es seguro hacerlo sin cambiar su copia de trabajo. Incluso he oído hablar de gente ejecutando git fetch periódicamente en un cron job en el background (aunque yo no recomendaría hacer esto).

Un git pull es lo que puedes hacer para actualizar una rama local respecto a su versión remota, mientras que también se actualizan sus ramas remotas.

1158voto

Mouna Cheikhna Puntos 12741
  • Cuando usas pull, Git intenta hacer el trabajo automáticamente por ti. Es sensible al contexto para que Git fusione cualquier commits extraídos en la rama en la que estás trabajando actualmente. pull fusiona automáticamente los commits sin dejar que los revises primero . Si no gestionas de cerca tus sucursales, puedes encontrarte con frecuentes conflictos.

  • Cuando recuperas, Git recoge cualquier commits de la rama de destino que no exista en tu rama actual y los almacena en su repositorio local . Sin embargo, no los fusiona con su rama actual . Esto es particularmente útil si necesita mantener su repositorio actualizado, pero está trabajando en algo que podría romperse si actualiza sus archivos. Para integrar los commits en su rama maestra, se utiliza merge.

600voto

MikeD Puntos 3559

Es importante contrastar la filosofía de diseño de git con la de una herramienta de control de fuentes más tradicional como svn.

Subversion fue diseñado y construido con un modelo cliente/servidor. Hay un único repositorio que es el servidor, y varios clientes pueden obtener código del servidor, trabajar en él, y luego commit de vuelta al servidor. La suposición es que el cliente siempre puede contactar con el servidor cuando necesita realizar una operación.

Git fue diseñado para soportar un modelo más distribuido sin necesidad de un repositorio central (aunque ciertamente puedes usar uno si quieres.) También git fue diseñado para que el cliente y el "servidor" no necesiten estar en línea al mismo tiempo. Git fue diseñado para que la gente en un enlace poco fiable pueda intercambiar código por correo electrónico, incluso. Es posible trabajar completamente desconectado y grabar un CD para intercambiar código a través de git.

Para soportar este modelo git mantiene un repositorio local con su código y también un repositorio local adicional que refleja el estado del repositorio remoto. Al mantener una copia del repositorio remoto localmente, git puede averiguar los cambios necesarios incluso cuando el repositorio remoto no es accesible. Más tarde, cuando necesites enviar los cambios a otra persona, git puede transferirlos como un conjunto de cambios desde un punto conocido del repositorio remoto.

  • git fetch es el comando que dice "actualizar mi copia local del repositorio remoto".

  • git pull dice "llevar los cambios en el repositorio remoto donde guardo mi propio código".

Normalmente " git pull " lo hace haciendo un " git fetch " para actualizar la copia local del repositorio remoto, y luego fusionar los cambios en su propio repositorio de código y posiblemente en su copia de trabajo.

Lo que hay que tener en cuenta es que a menudo hay al menos tres copias de un proyecto en su estación de trabajo. Una copia es su propio repositorio con su propio historial de commit. La segunda copia es su copia de trabajo donde está editando y construyendo. La tercera copia es su copia local "en caché" de un repositorio remoto.

281voto

mepster Puntos 1839

Un caso de uso de git fetch es que lo siguiente le dirá cualquier cambio en la rama remota desde su último pull... para que pueda comprobarlo antes de hacer un pull real, que podría cambiar archivos en su rama actual y en su copia de trabajo.

git fetch
git diff ...origin

216voto

Gerardo Puntos 959

Me costó un poco entender cuál era la diferencia, pero para mí es una explicación sencilla. Piensa que "master" en tu localhost es una rama.

Cuando se clona un repositorio, se obtiene todo el repositorio en el host local. Esto significa que en ese momento tiene un puntero de origen/master a HEAD y master apuntando al mismo HEAD.

cuando empiezas a trabajar y haces commits avanzas el puntero maestro a HEAD + tu commits. Pero el puntero origen/maestro sigue apuntando a lo que era cuando clonaste.

Así que la diferencia será:

  • Si se hace un "git fetch" sólo se obtendrán todos los cambios en el repositorio remoto ( GitHub ) y mover el puntero de origen/maestro a HEAD. Mientras tanto su rama local master seguirá apuntando a donde lo ha hecho.
  • Si haces un "git pull", hará básicamente lo mismo, pero intentará fusionar lo que hayas sacado en tu rama maestra.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X