origin - ¿Cuál es la diferencia entre ''git pull'' y ''git fetch''?
git pull origin branch (30)
¿Cuál es la diferencia entre
git pull
ygit fetch
?
Para comprender esto, primero debe comprender que su git local no solo mantiene su repositorio local, sino que también mantiene una copia local del repositorio remoto.
git fetch
actualiza su copia local del repositorio remoto. Por ejemplo, si su repositorio remoto es GitHub, es posible que desee buscar los cambios realizados en el repositorio remoto en su copia local del repositorio remoto. Esto le permitirá realizar operaciones como comparar o fusionar.
git pull
por otro lado, reducirá los cambios en el repositorio remoto donde guardará su propio código. Normalmente, git pull
se hará una git fetch
primera actualización de la copia local del repositorio remoto, y luego se fusionarán los cambios en su propio repositorio de código y posiblemente en su copia de trabajo.
Nota para el moderador: Dado que esta pregunta ya tiene sesenta y siete respuestas publicadas (algunas de ellas eliminadas), considere si está aportando algo nuevo antes de publicar otra.
¿Cuáles son las diferencias entre git pull
y git fetch
?
Prima:
Al hablar de pull & fetch en las respuestas anteriores, me gustaría compartir un truco interesante,
git pull --rebase
Este comando anterior es el comando más útil en mi vida de git que ahorró mucho tiempo.
Antes de enviar sus nuevas confirmaciones al servidor, pruebe este comando, se sincronizarán automáticamente los últimos cambios del servidor (con fetch + merge) y colocará su confirmación en la parte superior del registro de git. No hay necesidad de preocuparse por la extracción / fusión manual.
Encuentre detalles en: http://gitolite.com/git-pull--rebase
Aquí está la imagen de Oliver Steele de cómo encaja todo :
Si hay suficiente interés, supongo que podría actualizar la imagen para agregar git clone
y git merge
...
En los términos más simples, git pull
realiza una git fetch
seguida de una git merge
.
Puede realizar una git fetch
en cualquier momento para actualizar sus sucursales de seguimiento remoto en refs/remotes/<remote>/
.
Esta operación nunca cambia ninguna de sus propias sucursales locales bajo refs/heads
, y es seguro hacerlo sin cambiar su copia de trabajo. Incluso he oído hablar de personas que ejecutan git fetch
periódicamente en un trabajo cron en segundo plano (aunque no recomendaría hacerlo).
Un git pull
es lo que haría para actualizar una sucursal local con su versión remota, al mismo tiempo que actualiza sus otras sucursales de seguimiento remoto.
Documentación Git: Git Pull
Es importante contrastar la filosofía de diseño de git con la filosofía de una herramienta de control de fuente más tradicional como SVN.
Subversion fue diseñado y construido con un modelo cliente / servidor. Existe un único repositorio que es el servidor, y varios clientes pueden obtener el código del servidor, trabajar en él y luego enviarlo de nuevo al servidor. El supuesto es que el cliente siempre puede ponerse en contacto con el servidor cuando necesita realizar una operación.
Git fue diseñado para admitir un modelo más distribuido sin necesidad de un repositorio central (aunque ciertamente puede usar uno si lo desea). Además, git fue diseñado para que el cliente y el "servidor" no tengan que estar en línea al mismo tiempo. Git fue diseñado para que las personas en un enlace no confiable puedan intercambiar códigos por correo electrónico, incluso. Es posible trabajar completamente desconectado y grabar un CD para intercambiar código a través de git.
Para admitir 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 descubrir los cambios necesarios incluso cuando no se puede acceder al repositorio remoto. Más tarde, cuando necesite enviar los cambios a otra persona, git puede transferirlos como un conjunto de cambios desde un punto en el tiempo conocido por el 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 a donde guardo mi propio código".
Normalmente, git pull
hace esto haciendo un git fetch
para actualizar la copia local del repositorio remoto, y luego fusionando los cambios en su propio repositorio de código y posiblemente en su copia de trabajo.
Lo que debe tener en cuenta es tener en cuenta 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 confirmación. 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.
La respuesta breve y sencilla es que git pull
es simplemente git fetch
seguido por git merge
.
Es muy importante tener en cuenta que git pull
se fusionará automáticamente, te guste o no . Esto podría, por supuesto, dar lugar a conflictos de fusión. Digamos que tu control remoto es origin
y tu rama es master
. Si git diff origin/master
antes de tirar, debería tener una idea de los posibles conflictos de fusión y podría preparar su sucursal local en consecuencia.
Además de tirar y empujar, algunos flujos de trabajo incluyen git rebase
, como este, que parafraseo del artículo vinculado:
git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch
Si se encuentra en tal situación, puede verse tentado a git pull --rebase
. A menos que realmente, realmente sepas lo que estás haciendo, aconsejaría no hacerlo. Esta advertencia proviene de la página de man
de git-pull
, versión 2.3.5
:
Este es un modo de operación potencialmente peligroso. Reescribe la historia, que no es un buen augurio cuando ya la publicaste. No use esta opción a menos que haya leído git-rebase (1) con cuidado.
Me costó un poco entender cuál era la diferencia, pero esta es una explicación simple. master
en tu localhost es una rama.
Cuando clonas un repositorio, obtienes todo el repositorio a tu host local. Esto significa que en ese momento tiene un puntero de origen / maestro a HEAD
y un maestro que apunta a la misma HEAD
.
cuando comienzas a trabajar y haces confirmaciones, avanza el puntero maestro a HEAD
+ tus confirmaciones. Pero el puntero de origen / maestro sigue apuntando a lo que era cuando clonaste.
Así que la diferencia será:
- Si realiza una
git fetch
, solo obtendrá todos los cambios en el repositorio remoto ( GitHub ) y moverá el puntero de origen / maestro aHEAD
. Mientras tanto, su maestro de sucursal local seguirá apuntando a dónde tiene. - Si realiza una
git pull
, básicamente se recuperará (como se explicó anteriormente), fusionará cualquier cambio nuevo en su rama maestra y moverá el puntero aHEAD
.
Me gusta tener una representación visual de la situación para comprender estas cosas. Tal vez otros desarrolladores también quieran verlo, así que aquí está mi adición. No estoy totalmente seguro de que todo sea correcto, así que comente si encuentra algún error.
LOCAL SYSTEM
. =====================================================
================= . ================= =================== =============
REMOTE REPOSITORY . REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY
(ORIGIN) . (CACHED)
for example, . mirror of the
a github repo. . remote repo
Can also be .
multiple repo''s .
.
.
FETCH *------------------>*
Your local cache of the remote is updated with the origin (or multiple
external sources, that is git''s distributed nature)
.
PULL *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur,
you are asked for decisions.
.
COMMIT . *<---------------*
When coming from, for example, subversion, you might think that a commit
will update the origin. In git, a commit is only done to your local repo.
.
PUSH *<---------------------------------------*
Synchronizes your changes back into the origin.
Algunas de las principales ventajas de tener un espejo del control remoto son:
- Rendimiento (desplácese por todas las confirmaciones y mensajes sin intentar exprimirlo a través de la red)
- Comentarios sobre el estado de su repositorio local (por ejemplo, uso el SourceTree de Atlassian, que me dará un indicador que indica si estoy comprometido adelante o atrás en comparación con el origen. Esta información se puede actualizar con un GET FETCH)
Puede obtener desde un repositorio remoto, ver las diferencias y luego extraer o fusionar.
Este es un ejemplo para un repositorio remoto llamado origin
y una rama llamada master
rastrea el origin/master
rama remota:
git checkout master
git fetch
git diff origin/master
git rebase origin master
Un caso de uso de git fetch
es que lo siguiente le indicará cualquier cambio en la rama remota desde su última extracción ... para que pueda verificar antes de realizar una extracción real, que podría cambiar los archivos en su rama actual y copia de trabajo.
git fetch
git diff ...origin
git fetch
baja el código del servidor remoto a sus sucursales de seguimiento en su repositorio local. Si el mando a distancia se llama origin
(el valor predeterminado), entonces estas ramas estarán dentro de origin/
, por ejemplo origin/master
, origin/mybranch-123
,, etc. Estos no son sus ramas actuales, que son locales copias de esas ramas del servidor.
git pull
hace un, git fetch
pero luego también combina el código de la rama de seguimiento en su versión local actual de esa rama. Si aún no estás listo para los cambios, solo git fetch
primero.
git fetch
recuperará ramas remotas para que pueda git diff
o git merge
ellos con la rama actual. git pull
ejecutará fetch en el archivo remoto rastreado por la rama actual y luego fusionará el resultado. Puede usarlo git fetch
para ver si hay actualizaciones en la sucursal remota sin que sea necesario combinarlas con su sucursal local.
Bien , aquí hay información sobre git pull
y git fetch
, para que pueda comprender las diferencias reales ... en pocas palabras, fetch obtiene los datos más recientes, pero no cambia el código y no va a meterse con su código de sucursal local actual , pero obtenga los cambios de código y fusione su sucursal local, siga leyendo para obtener más detalles sobre cada uno:
git fetch
Descargará todos los refs y objetos y cualquier rama nueva a su Repositorio local ...
Obtenga ramas y / o etiquetas (colectivamente, "refs") de uno o más repositorios, junto con los objetos necesarios para completar sus historias. Las sucursales de seguimiento remoto se actualizan (consulte la descripción a continuación para conocer las formas de controlar este comportamiento).
De forma predeterminada, también se obtiene cualquier etiqueta que apunte a las historias que se están recuperando; el efecto es recuperar las etiquetas que apuntan a las ramas en las que está interesado. Este comportamiento predeterminado se puede cambiar usando las opciones --tags o --no-tags o configurando remote..tagOpt. Al usar un refspec que obtiene etiquetas explícitamente, puede obtener etiquetas que no apuntan a las ramas que le interesan también.
git fetch puede obtenerse desde un único repositorio con nombre o URL, o desde varios repositorios a la vez si se proporciona y hay controles remotos. Entrada en el archivo de configuración. (Ver git-config 1 ).
Cuando no se especifica ningún control remoto, de forma predeterminada se usará el control remoto de origen, a menos que haya una rama ascendente configurada para la rama actual.
Los nombres de las referencias que se recuperan, junto con los nombres de los objetos a los que apuntan, se escriben en .git / FETCH_HEAD. Esta información puede ser utilizada por scripts u otros comandos de git, como git-pull.
git pull
Se aplicarán los cambios de remoto a la rama actual en local ...
Incorpora cambios desde un repositorio remoto en la rama actual. En su modo predeterminado, git pull es una abreviatura de git fetch seguida de git merge FETCH_HEAD.
Más precisamente, git pull ejecuta git fetch con los parámetros dados y llama a git merge para combinar las cabezas de rama recuperadas en la rama actual. Con --rebase, ejecuta git rebase en lugar de git merge.
debe ser el nombre de un repositorio remoto tal como se pasa a git-fetch 1 . puede nombrar una referencia remota arbitraria (por ejemplo, el nombre de una etiqueta) o incluso una colección de referencias con las correspondientes ramas de seguimiento remoto (por ejemplo, refs / heads / : refs / remotes / origin / ), pero generalmente es el nombre de una rama en el repositorio remoto.
Los valores predeterminados para y se leen desde la configuración "remota" y "fusionar" para la rama actual tal como lo establece git-branch --track.
También creo la imagen a continuación para mostrarte cómo git fetch
y git pull
trabajan juntos ...
Brevemente
git fetch
es similar a pull
pero no se fusiona. es decir, recupera actualizaciones remotas ( refs
y objects
) pero su local permanece igual (ie origin/master
se actualiza pero master
permanece igual).
git pull
tira de un control remoto y se fusiona instantáneamente.
Más
git clone
clones a repo.
git rebase
guarda las cosas de su rama actual que no se encuentran en la rama ascendente en un área temporal. Su rama es ahora la misma que antes de comenzar sus cambios. Por lo tanto, git pull -rebase
reducirá los cambios remotos, rebobinará su sucursal local, volverá a reproducir los cambios en la parte superior de su rama actual uno por uno hasta que esté actualizado.
Además, git branch -a
le mostrará exactamente lo que está pasando con todas sus sucursales: local y remota.
Esta entrada de blog fue útil:
La diferencia entre git pull, git fetch y git clone (y git rebase) - Mike Pearce
y cubre git pull
, git fetch
, git clone
y git rebase
.
====
ACTUALIZAR
Pensé que actualizaría esto para mostrar cómo lo utilizarías en la práctica.
Actualice su repositorio local desde el control remoto (pero no fusione):
git fetch
Después de descargar las actualizaciones, veamos las diferencias:
git diff master origin / master
Si está satisfecho con esas actualizaciones, entonces fusione:
git pull
Notas:
En el paso 2: Para obtener más información sobre las diferencias entre los controles locales y remotos, consulte: ¿ comparar la rama local de git con la rama remota?
En el paso 3: probablemente sea más preciso (por ejemplo, en un repositorio de cambio rápido) hacer un git rebase origin
aquí. Ver @Justin Ohms comentar en otra respuesta.
Véase también: longair.net/blog/2009/04/16/git-fetch-and-merge
Git Fetch
Usted descarga los cambios a su sucursal local desde el origen hasta la recuperación. Fetch solicita el repositorio remoto para todas las confirmaciones que otros hayan hecho pero no tiene en su repositorio local. Fetch descarga estos compromisos y los agrega al repositorio local.
Git Merge
Puede aplicar los cambios descargados a través de búsqueda utilizando el comando de combinación. Combinar tomará las confirmaciones recuperadas de la búsqueda e intentará agregarlas a su sucursal local. La fusión mantendrá el historial de confirmación de sus cambios locales para que cuando comparta su sucursal con push, Git sepa cómo otros pueden combinar sus cambios.
Git Pull
La búsqueda y fusión se ejecutan juntas con la suficiente frecuencia como para crear un comando que combina las dos, extracción. Pull realiza una búsqueda y luego una combinación para agregar las confirmaciones descargadas en su sucursal local.
En realidad, Git mantiene una copia de su propio código y del repositorio remoto.
El comando git fetch
hace que su copia local esté actualizada al obtener datos del repositorio remoto. La razón por la que necesitamos esto es porque alguien más podría haber realizado algunos cambios en el código y usted desea mantenerse actualizado.
El comando git pull
lleva los cambios en el repositorio remoto a donde guarda su propio código. Normalmente, git pull
hace esto haciendo primero una ''búsqueda de git'' para actualizar la copia local del repositorio remoto, y luego combina los cambios en su propio repositorio de código y posiblemente en su copia de trabajo.
Git obtiene la rama de la última versión del remoto al local usando dos comandos:
git fetch: Git obtendrá la última versión de remoto a local, pero no se fusionará automáticamente.
git fetch origin master
git log -p master..origin/master
git merge origin/master
Los comandos anteriores significan que descargan la última versión de la rama principal desde el origen desde la rama maestra remota a la original. Y luego compara la rama maestra local y la rama maestra de origen. Finalmente, fusionar.
git pull: Git obtendrá la última versión desde el control remoto y se fusionará con el local.
git pull origin master
El comando anterior es el equivalente a
git fetch
ygit merge
. En la práctica,git fetch
quizás sea más seguro porque antes de la fusión podemos ver los cambios y decidir si se fusionan.
Simplemente decimos:
git pull == git fetch + git merge
Si ejecuta git pull
, no necesita combinar los datos a local. Si ejecuta git fetch
, significa que debe ejecutar git merge
para obtener el último código para su máquina local. De lo contrario, el código de máquina local no se cambiaría sin la combinación.
Por lo tanto, en Git Gui, cuando realiza la búsqueda, debe combinar los datos. Fetch en sí no hará que los cambios de código en su local. Puede verificar que cuando actualice el código extraiga una vez que busque y vea; El código no cambiará. Luego te fusionas ... Verás el código cambiado.
Tratando de ser claro y sencillo.
El comando git pull es en realidad un comando shortcut
para git fetch seguido por el comando git merge o git rebase dependiendo de su configuración. Puede configurar su repositorio Git para que git pull sea una recuperación seguida de una rebase.
Una representación gráfica simple para principiantes,
aquí,
git pull
buscará el código del repositorio y lo reajustará con su local ... en git pull existe la posibilidad de que se creen nuevos confirmaciones.
pero en ,
git fetch
obtendremos el código del repositorio y necesitamos volverlo a preparar manualmente usando git rebase
por ejemplo: voy a buscar desde el servidor maestro y lo reagrupo en mi maestro local.
1) git pull (rebase se hará automáticamente):
git pull origin master
Aquí el origen es tu maestro de repositorio remoto es tu rama.
2) git fetch (hay que reajustar manualmente):
git fetch origin master
recuperará los cambios del servidor desde el origen. y estará en tu local hasta que lo modifiques por tu cuenta. Necesitamos arreglar conflictos manualmente revisando los códigos.
git rebase origin/master
esto volverá a cambiar el código en local. antes de eso asegúrate de estar en la rama derecha.
git pull == (git fetch + git merge)
git fetch no cambia a las sucursales locales.
Si ya tiene un repositorio local con una configuración remota para el proyecto deseado, puede tomar todas las ramas y etiquetas para el control remoto existente utilizando git fetch. ... Fetch no realiza ningún cambio en las sucursales locales, por lo que deberá fusionar una sucursal remota con una sucursal local emparejada para incorporar los cambios recién capturados. de github
Esta representación gráfica interactiva es muy útil para entender git: http://ndpsoftware.com/git-cheatsheet.html
git fetch
simplemente "descarga" los cambios desde el control remoto a su repositorio local. git pull
descarga los cambios y los combina en su rama actual. "En su modo predeterminado, git pull
es una abreviatura de git fetch
seguida de git merge FETCH_HEAD
".
Git permite que los compromisos cronológicamente más antiguos se apliquen después de los nuevos. Debido a esto, el acto de transferir confirmaciones entre repositorios se divide en dos pasos:
Copiando nuevas confirmaciones desde una rama remota a una copia de esta rama remota dentro del repositorio local.
(Repo a repo operación)
master@remote >> remote/origin/master@local
Integrando nuevos compromisos a la sucursal local.
(Operación dentro del repositorio)
remote/origin/master@local >> master@local
Hay dos formas de hacer el paso 2. Puedes:
- Bifurque la rama local después del último ancestro común y agregue nuevos confirmaciones paralelas a las confirmaciones que son exclusivas del repositorio local, finalizadas mediante la combinación de confirmaciones, cerrando la horquilla.
- Inserte nuevas confirmaciones después del último ancestro común y vuelva a aplicar las confirmaciones únicas al repositorio local.
En git
terminología, paso 1 es git fetch
, paso 2 es git merge
ogit rebase
git pull
es git fetch
ygit merge
He luchado con esto también. De hecho, llegué aquí con una búsqueda en google de exactamente la misma pregunta. Al leer todas estas respuestas, finalmente pinté una imagen en mi cabeza y decidí intentar ver esto en el estado de los 2 repositorios y 1 caja de arena y las acciones realizadas a lo largo del tiempo mientras observaba la versión de ellos. Así que aquí es lo que se me ocurrió. Por favor corrígeme si me equivoco en cualquier lugar.
Los tres repos con un fetch:
--------------------- ----------------------- -----------------------
- Remote Repo - - Remote Repo - - Remote Repo -
- - - gets pushed - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- -----------------------
--------------------- ----------------------- -----------------------
- Local Repo - - Local Repo - - Local Repo -
- pull - - - - fetch -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- -----------------------
--------------------- ----------------------- -----------------------
- Local Sandbox - - Local Sandbox - - Local Sandbox -
- Checkout - - new work done - - -
- @ R01 - - @ R01+ - - @R01+ -
--------------------- ----------------------- -----------------------
Los tres repos con un tirón.
--------------------- ----------------------- -----------------------
- Remote Repo - - Remote Repo - - Remote Repo -
- - - gets pushed - - -
- @ R01 - - @ R02 - - @ R02 -
--------------------- ----------------------- -----------------------
--------------------- ----------------------- -----------------------
- Local Repo - - Local Repo - - Local Repo -
- pull - - - - pull -
- @ R01 - - @ R01 - - @ R02 -
--------------------- ----------------------- -----------------------
--------------------- ----------------------- -----------------------
- Local Sandbox - - Local Sandbox - - Local Sandbox -
- Checkout - - new work done - - merged with R02 -
- @ R01 - - @ R01+ - - @R02+ -
--------------------- ----------------------- -----------------------
Esto me ayudó a entender por qué una búsqueda es bastante importante.
La única diferencia entre git pull
y git fetch
es que:
git pull
tira de una rama remota y la fusiona.
git fetch
solo obtiene de la rama remota pero no se fusiona
es decir, git pull = git fetch + git merge ...
La diferencia entre GIT Fetch y GIT Pull se puede explicar con el siguiente escenario: (¡Teniendo en cuenta que las imágenes hablan más que las palabras! He proporcionado una representación pictórica)
Tomemos un ejemplo de que está trabajando en un proyecto con los miembros de su equipo. Por lo tanto, serán una rama principal del proyecto y todos los contribuyentes deben vincularlo a su propio repositorio local y luego trabajar en esta rama local para modificar / agregar módulos y luego enviarlos a la rama principal.
Así, estado inicial de las dos ramas bifurcadas cuando el principal proyecto en su repositorio local será como esto: ( A
, B
y C
son módulos ya terminados del proyecto)
Ahora, que ha empezado a trabajar en el nuevo módulo (supongamos D
) y cuando haya completado el D
módulo que desea empujar a la rama principal, pero mientras tanto lo que pasa es que uno de sus compañeros de equipo ha desarrollado un nuevo módulo E
, F
y modificado C
.
Así que ahora, lo que sucedió es que su repositorio local carece del progreso original del proyecto y, por lo tanto, empujar sus cambios a la rama principal puede generar conflictos y causar que su Módulo no D
funcione correctamente.
Para evitar tales problemas y para trabajar en paralelo con el progreso original del proyecto, hay dos formas:
1. Git Fetch: esto descargará todos los cambios que se hayan realizado en el proyecto de la sucursal de origen / principal que no están presentes en su sucursal local. Y esperará a que el comando Git Merge aplique los cambios que se han recuperado en su Repositorio o sucursal.
Así que ahora puede monitorear cuidadosamente los archivos antes de fusionarlos con su repositorio. Y también puede modificar D
si es necesario debido a Modificado C
.
2. Git Pull: esto actualizará tu sucursal local con el origen / rama principal, es decir, en realidad lo que hace es una combinación de Git Fetch y Git se fusionan una tras otra. Pero esto puede causar conflictos, por lo que se recomienda usar Git Pull con una copia limpia.
git-pull - Fetch from and merge with another repository or a local branch SYNOPSIS git pull … DESCRIPTION Runs git-fetch with the given parameters, and calls git-merge to merge the retrieved head(s) into the current branch. With --rebase, calls git-rebase instead of git-merge. Note that you can use . (current directory) as the <repository> to pull from the local repository — this is useful when merging local branches into the current branch. Also note that options meant for git-pull itself and underlying git-merge must be given before the options meant for git-fetch.
Si querrías que las historias se fusionaran, obtendrías una respuesta si simplemente "quieres el código", ya que alguna persona ha estado etiquetando algunos artículos por aquí.
git pull = git fetch + git merge
Cuando usas
pull
, Git intenta hacer automáticamente tu trabajo por ti. Es sensible al contexto , por lo que Git combinará cualquier compromiso extraído en la rama en la que está trabajando actualmente.pull
combina automáticamente los compromisos sin permitirle revisarlos primero . Si no administra sus sucursales de manera cercana, puede tener conflictos frecuentes.Cuando
fetch
, Git recopila cualquier confirmación de la rama de destino que no existe en su rama actual y los almacena en su repositorio local . Sin embargo, no los combina 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 las confirmaciones en su rama maestra, usemerge
.