Git no puede pagar otra sucursal huérfana de una sucursal huérfana

En machine1 creo una git checkout --orphan branch1 huérfana de git checkout --orphan branch1 .

En git clone <url> --branch branch1 --single-branch el repository con este git clone <url> --branch branch1 --single-branch una twig git clone <url> --branch branch1 --single-branch . Esto funcionó como se esperaba.

De vuelta en la máquina1 , creé un nuevo git checkout --orphan branch2 twig huérfano git checkout --orphan branch2 .

En machine2 Cuando hago git fetch origin -- branch2 responde con:

* branch branch2 -> FETCH_HEAD

Pero cuando trato de pagar la sucursal con git checkout branch2 veo

error: pathspec 'branch2' no coincide con ningún file conocido por git.

No puedo encontrar la forma de search y pagar la segunda sucursal huérfana de mi máquina2 . ¿Es porque comenzó como un clon de single-branch ?

Primero, una nota al margen: una twig huérfana es una twig sin padres y sin compromisos . Como no tiene compromisos, no existe. Una vez que haces un commit en él, ya no es un huérfano: tiene un commit, que puede ser un padre; deja de ser una twig huérfana en absoluto. Es solo una twig ordinaria, como cualquier otra twig. Lo inusual de su repository es que ahora tiene dos (o más) confirmaciones de raíz : confirmaciones que no tienen padre.

Como git fetch a git fetch estas cosas, no eran twigs huérfanas; solo eran twigs. La "orfandad" (o la falta de ella) es solo una pista falsa.

Que esta pasando

… Cuando hago git fetch origin -- branch2

Como señaló PetSerAl en un comentario , los arguments de refspec para git fetch pueden, y a menudo deberían, contener tanto una parte de origen remota como una parte de destino:

 git fetch origin src:dst 

La parte fuente se puede abreviar (como en branch2 ) o deletreado ( refs/heads/branch2 , para que esté seguro de que está obteniendo una twig y no una label o algo). La parte de destino es normalmente un nombre de sucursal de seguimiento remoto (que no es una bifurcación) en su propio repository, como refs/remotes/origin/branch2 .

El refspec puede (y para las sucursales de rastreo remoto, por lo general debería) comenzar con un signo más, indicando a Git que sobrescriba su propia reference independientemente de lo que eso signifique para usted. Para nombres de sucursales de rastreo remoto, la sobrescritura es sensata. Para nombres de sucursales locales, es mucho más cuestionable.

Normalmente no tienes que hacer nada de esto

Si la versión de Git es al less 1.8.4, git fetch normalmente calcula todo esto por sí mismo. Pero los clones de una sola twig son diferentes:

¿Es porque comenzó como un clon de twig única?

¡Sí! Como clon de twig única, su clon tendrá su set de references de fetch pnetworkingeterminado para que coincida con una sola twig. Es decir, git fetch examina la configuration de su repository, y esa configuration dice: no haga un seguimiento de nada en sentido ascendente, excepto esta única twig.

Intentas search una twig diferente , por lo que tu git fetch asume que realmente no deseas seguirle la pista. FETCH_HEAD el resultado en el file FETCH_HEAD temporal en el que cada búsqueda siempre descarga todo (por razones históricas, entre otras) y luego lo olvida.

Si convierte su clon de twig única a un clon normal, editando la línea fetch = para que lea como lo hace normalmente, su clon ahora normal se comportará, bueno, normalmente. Ver ¿Cómo puedo "deshacer" un clon de una sola twig? para más detalles (la respuesta aceptada asume exactamente un origin remoto, con nombre).