crear - git stash
Tener dificultades para entender git-fetch (4)
Me está costando entender los matices de git-fetch. Entiendo que al hacer una fetch
, busca referencias remotas en una sucursal de seguimiento local.
Sin embargo, tengo algunas preguntas:
¿Es posible que no exista una sucursal de seguimiento local? Si es así, ¿se creará automáticamente?
¿Qué pasará si realizo una
fetch
y especifico una rama sin seguimiento como destino?La página man para git-fetch especifica:
git-fetch <options> <repository> <refspec>
¿Cómo utilizaré el refspec para obtener contenidos de mi maestro remoto en su rama de seguimiento remoto? Creo que esto puede ser posible si mi HEAD actual está en master y corro
git fetch origin master
Sin embargo, ¿puedo usar el <+?src:dest>
refspec para lograr lo mismo? Creo que esto me ayudará a entender mejor los conceptos.
Y una pregunta más:
Mi archivo .git / config tiene la siguiente línea para buscar (muestra solo las líneas relevantes):
fetch = +refs/heads/*:refs/remotes/origin/*
¿Puede alguien explicar por favor qué significa exactamente esta línea?
respondió la mayoría de los temas en cuestión en su respuesta .
Quedan unos pocos (la mayoría de ellos tomados de la página de búsqueda de git , que está un poco anticuada en algunos lugares, desafortunadamente):
Si la rama de seguimiento remoto (rama que rastrea alguna rama en algún repositorio remoto) no existe, se crearía.
La rama a la que accede (la
<dst>
en[+]<src>:<dst>
) no necesita residir enremotes/<remote>/
namespace. Por ejemplo para duplicar repositorios (git clone --mirror
) refspec es 1 a 1. En los viejos tiempos antes del diseño de remotos separados (antes de losremotes/<remote>/
espacio de nombres para refs de rastreo remoto) la rama maestra fue captada en la rama llamada origen . Incluso las etiquetas actuales se captan directamente entags/
espacios de nombres en forma de reflejo.Si la bifurcación está captando (el lado derecho de refspec
<src>:<dst>
existe, Git verificaría si la descarga daría como resultado el avance rápido, es decir, si el estado actual en<dst>
es antecesor de estado en<src>
en un repositorio remoto dado. Si no lo es, y no usa la opción-f
/--force
para git-fetch, o prefija refspec con ''+'' (use+<src>:<dst>
refspec) fetch se negaría a actualizar esa rama.git fetch origin master
es equivalente algit fetch origin master:
no agit fetch origin master:master
; almacena el valor obtenido de la rama maestra (de origen remoto) en FETCH_HEAD , y no en la rama maestra o remotos de seguimientoremotes/origin/master
ramaremotes/origin/master
. Puede ser seguido porgit merge FETCH_HEAD
. Por lo general, no se usa directamente, sino como parte de una extracción única sin configurar la rama de seguimiento remoto:git pull <URL> <branch>
.+refs/heads/*:refs/remotes/origin/*
como valor para la variable de configuración remote.origin.fetch significa que cada bifurcación (ref enrefs/heads/
namespace) en origen remoto se busca en la rama de rastreo remoto con nombre respectivo enrefs/remotes/origin/
namespace, p. ej., branch principal en origen (es decir,refs/heads/master
ref) se captarán en la derivación de rastreo remoto de origen / maestro (es decir,refs/remotes/origin/master
ref). El prefijo ''+'' significa que la recuperación tendrá éxito incluso en caso de avance no rápido, lo que significa que la bifurcación en el control remoto se vuelve a establecer o rebobinar (restablecer a algún estado en el pasado) o modificarse de otra manera.
Nota: probablemente quieras usar un comando remoto de nivel más alto para administrar repositorios remotos y obtener actualizaciones.
En primer lugar, no existe un concepto de ramales de seguimiento local , solo ramales de rastreo remotos . Entonces origin / master es una rama de seguimiento remoto para el maestro en el repositorio de origen .
Por lo general, haces git fetch $ remote, que actualiza todas las ramas de seguimiento remoto y crea nuevas si es necesario.
Sin embargo, también puede especificar un refspec, pero eso no tocará las ramas de seguimiento remoto, sino que buscará la rama que especificó y la guardará en FETCH_HEAD, a menos que especifique un destino. En general, no quieres meterse con esto.
Finalmente,
fetch = +refs/heads/*:refs/remotes/origin/*
Eso significa que si lo haces
git fetch origin
Realmente lo hará:
git fetch origin +refs/heads/*:refs/remotes/origin/*
Lo que significa que las cabezas / foobar remotas serán controles remotos / origen / foobar locales, y el signo más significa que se actualizarán incluso si no son de avance rápido.
Tal vez lo que piensas como una rama de rastreo es algo relacionado con git pull y la configuración de fusión.
Tenga en cuenta que el mantenedor principal de Git ahora (Git 2.1, agosto de 2014) agregó esta explicación para git fetch
:
(Ver commit fcb14b0 por Junio C Hamano ( gitster
) :
SUCURSALES CONFIGURADOS DE SEGUIMIENTO REMOTO
A menudo, usted interactúa con el mismo repositorio remoto al obtenerlo de forma regular y repetida. Con el fin de realizar un seguimiento del progreso de un repositorio remoto,
git fetch
permite configurar variables de configuraciónremote.<repository>.fetch
.Por lo general, una variable así puede verse así:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
Esta configuración se usa de dos maneras:
Cuando
git fetch
se ejecuta sin especificar qué ramas y / o etiquetas buscar en la línea de comando, por ejemplo,git fetch origin
ogit fetch
,remote.<repository>.fetch
valoresremote.<repository>.fetch
se utilizan como refspecs --- especifican qué referencias buscar y que refs locales para actualizar .
El ejemplo anterior buscará todas las ramas que existen en elorigin
(es decir, cualquier referencia que coincida con el lado izquierdo del valor,refs/heads/*
) y actualizará las ramas correspondientes de seguimiento remoto en losrefs/remotes/origin/*
jerarquía.Cuando
git fetch
se ejecuta con ramas y / o etiquetas explícitas para buscar en la línea de comando, por ejemplo,git fetch origin master
, las<refspec>
s dadas en la línea de comando determinan qué se debe buscar (por ejemplo,master
en el ejemplo, que es una abreviatura paramaster:
que a su vez significa "buscar la rama ''master
'' pero no digo explícitamente qué rama de seguimiento remoto actualizar con ella desde la línea de comando"), y el comando de ejemplo solo buscará '' ramamaster
Los valoresremote.<repository>.fetch
determinan qué rama de seguimiento remoto, si hay alguna, se actualiza.
Cuando se usan de esta manera, los valoresremote.<repository>.fetch
no tienen ningún efecto al decidir qué se obtiene (es decir, los valores no se usan como refspecs cuando la línea de comando enumera refspecs); solo se usan para decidir dónde se almacenan las referencias que se obtienen al actuar como un mapeo.
Tenga en cuenta también que, con Git 2.5+ (Q2 2015), la git merge FETCH_HEAD
puede combinar varias búsquedas de git fetch .
Ver commit d45366e por Junio C Hamano ( gitster
) , 26 de marzo de 2015.
(Fusionado por Junio C Hamano - gitster
- in commit bcd1ecd , 19 de mayo de 2015)
"
git merge FETCH_HEAD
" aprendió que la "git fetch
" anterior podría ser para crear una fusión de Octopus, es decir, registrar múltiples ramas que no están marcadas como "no-para-fusionar";
esto nos permite perder una invocación de estilo anterior "git merge <msg> HEAD $commits...
" en la implementación del script "git pull
"; la sintaxis de estilo antiguo ahora puede ser desaprobada.
El documento de git merge
ahora menciona:
Cuando se
FETCH_HEAD
(y ninguna otra confirmación), las ramas registradas en el archivo.git/FETCH_HEAD
por la invocación previa degit fetch
para la fusión se fusionan con la rama actual .
Git 2.13 (Q2 2017) oficialmente retira la sintaxis antigua para la git merge
.
Ver commit b439165 (26 Mar 2015) por Junio C Hamano ( gitster
) .
(Fusionada por Junio C Hamano - gitster
- in commit 1fdbfc4 , 30 de marzo de 2017)
merge
: soltar la sintaxis ''git merge <message> HEAD <commit>
''Deje de admitir la sintaxis "
git merge <message> HEAD <commit>
" que ha quedado obsoleta desde octubre de 2007 y emite un mensaje de advertencia de obsolescencia desde v2.5.0.
Eso significa que el mensaje de advertencia de "estilo antiguo '' ''git merge <msg> HEAD <commit>'' is deprecated.
" Ya no existe.