rama - ¿Diferencias entre la actualización remota de git y fetch?
git push (2)
¿ git remote update
el equivalente de git fetch
?
Si y no. git remote update
obtiene de todos los controles remotos, no solo uno.
Sin mirar el código para ver si remote update
es solo un script de shell (posible), básicamente, ejecuta fetch para cada control remoto. git fetch
puede ser mucho más granular.
ACTUALIZACIÓN: más información!
Debería haber hecho esto desde el principio: agrupé las notas de la versión de Git en el repositorio de Git''s Git (¡así que meta!)
grep --color=always -R -C30 fetch Documentation/RelNotes/* | less
Luego --all
less
--all
, y esto es lo que encontré en las notas de la versión 1.6.6 de Git :
git fetch
learned--multiple
y--multiple
opciones, para ejecutar fetch desde muchos repositorios, y--prune
option para eliminar las ramas de rastreo remotas que se volvieron obsoletas. Esto hace quegit remote update
y lagit remote prune
menos necesarias (sin embargo, no hay un plan para eliminarremote update
remote prune
niremote prune
).
La versión 1.6.6 no fue lanzada hasta el 23 de diciembre de 2009 , y el póster original hizo su pregunta el 6 de diciembre de 2009.
Como pueden ver en las notas de la versión, los autores de Git eran conscientes del hecho de que la funcionalidad del comando de git remote update
estaba siendo duplicada por git fetch
, pero decidieron no eliminarla, tal vez por compatibilidad con scripts existentes y versiones anteriores. programas, o tal vez porque es demasiado trabajo y hay elementos de mayor prioridad.
Respuesta original con más detalles
La respuesta de xenoterracide tiene 3.5 años, y Git ha pasado por varias versiones desde entonces (ha pasado de v1.6.5.5 a v1.8.3.2 al momento de escribir esto), y está mirando la documentación actual para git remote update
y git fetch
, parece que ambos pueden realizar básicamente la misma función de obtener nuevas confirmaciones de múltiples controles remotos , dadas las opciones y argumentos correctos.
Obteniendo todos los controles remotos
Una forma de obtener múltiples controles remotos es con --all
flag:
git fetch --all
Esto se obtendrá de todos sus controles remotos configurados, suponiendo que no tiene el remote.<name>.skipFetchAll
configurado para ellos:
Si es verdadero, este control remoto se omitirá de manera predeterminada al actualizar usando git-fetch (1) o el subcomando de actualización de git-remote (1) . - Documentación de git-config
Esto sería equivalente a usar
git remote update
sin especificar ningún grupo remoto a recuperar, y tampoco teniendo remotes.default
configurados en su configuración de repositorio, y también que ninguno de sus controles remotos tiene remote.<name>.skipDefaultUpdate
establecido en verdadero.
La documentación actual de 1.8.3.2 para la configuración de Git no menciona la configuración de remotes.default
, pero consulté a The Almighty Google al respecto y encontré esta útil explicación de Mislav Marohnić :
$ git config remotes.default ''origin mislav staging''
$ git remote update
# fetches remotes "origin", "mislav", and "staging"
Puede definir una lista predeterminada de controles remotos para ser recuperados por el comando de
remote update
. Estos pueden ser controles remotos de sus compañeros de equipo, miembros de la comunidad de confianza de un proyecto de código abierto o similar.
Así que, presumiblemente, si tiene remotes.default
configuración remotes.default
, y no todos sus controles remotos figuran en ella, entonces git remote update
no recuperará todos los controles remotos que su repositorio esté "al tanto".
En cuanto a la configuración remote.<name>.skipDefaultUpdate
, los documentos de Git lo explican de este modo:
Si es verdadero, este control remoto se omitirá de manera predeterminada al actualizar usando git-fetch (1) o el subcomando de actualización de git-remote (1) .
Obtener un grupo específico de controles remotos
En lugar de buscar todos los controles remotos, tanto la fetch
como remote update
permiten especificar múltiples controles remotos y grupos de controles remotos para recuperar:
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch [<options>] <group>
permite buscar múltiples controles remotos que son parte de un grupo (para tomar otro ejemplo de Mislav ):
$ git config remotes.mygroup ''remote1 remote2 ...''
$ git fetch mygroup
git fetch --multiple
permite especificar varios repositorios y grupos de repositorios para obtener a la vez (de los documentos ):
Permita que se especifiquen varios argumentos
<repository>
y<group>
. No se pueden especificar<refspec>s
.
Ambigüedad en git remote update
documentación de git remote update
La sinopsis de git remote update
especifica que la sintaxis del comando es la siguiente:
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
Observe la última parte, [(<group> | <remote>)…]
? Los puntos finales ...
implican que puede especificar múltiples grupos y controles remotos con el comando, lo que significa que se comporta de la misma manera que git fetch --multiple
... ¿ve cómo la sintaxis entre los dos es tan similar?
Sin embargo, en el mismo documento, la explicación del comando de update
no dice nada acerca de especificar múltiples grupos y argumentos remotos, solo que
Obtener actualizaciones para un conjunto de remotos con nombre en el repositorio, tal como se define en los
remotes.<group>
.
Por lo tanto, no está claro si git remote update
funciona de manera idéntica a la git fetch --multiple
con respecto a la especificación de múltiples controles remotos individuales y múltiples grupos remotos.
Obtener un solo control remoto
Finalmente, todos conocen el simple caso de buscar un único control remoto:
git fetch <remote>
Puede ser que también puedas usar
git remote update <remote>
hacer lo mismo, pero como mencioné en la sección anterior, la documentación para git remote update
no está clara sobre si es posible buscar algo que no sea un solo grupo de controles remotos con el comando.
Envolver
Como he explicado, git remote update
git fetch
y git remote update
comportan de manera similar con respecto a la git fetch
desde múltiples remotos. Comparten sintaxis y argumentos similares, aunque la git fetch
es más corta, por lo que las personas probablemente les resulte más fácil escribir y usar.
Puede ser que git remote update
no se pueda usar para buscar solo un control remoto como con git fetch
, pero como ya he señalado, la documentación no lo deja en claro.
Aparte
La duplicación de la funcionalidad entre los comandos de porcelana de Git, ejemplificada por la git fetch
git remote update
y git remote update
arriba, no es única. He notado una situación similar con git rebase --onto
y git cherry-pick
, en el sentido de que ambos pueden tomar un rango de confirmaciones para parchear en una nueva base de compromiso.
Supongo que, a medida que Git evolucionó a lo largo de los años, algunas funciones se duplicaron (¿inevitablemente?), Tal vez a veces como una conveniencia para los usuarios finales (por ejemplo, es más fácil pasar un rango para cherry-pick
, que pasar un solo compromiso una y otra vez para elegir un rango). Aparentemente, cherry-pick
no siempre aceptaba un rango de confirmaciones, como se explica en las notas de la versión v1.7.2 :
git cherry-pick
aprendió a elegir un rango de commits (por ejemplo,cherry-pick A..B
ycherry-pick --stdin
), asígit revert
; sin embargo, estos no son compatibles con el mejor control de secuenciaciónrebase [-i]
.