¿Cómo seleccionar cuidadosamente desde una sucursal remota?
Tengo problemas para realizar una selección selectiva. En mi máquina local, actualmente estoy en mi rama "maestra". Quiero seleccionar una confirmación de otra rama, llamada "cebra". La sucursal "cebra" es una sucursal remota.
Entonces git estado:
# On branch master
nothing to commit (working directory clean)
Bien, ahora intento seleccionar el compromiso que quiero:
git cherry-pick xyz
fatal: bad object xyz
donde "xyz" es la firma de la confirmación que me interesa, que ocurrió en la rama "zebra".
Entonces, la primera pregunta obvia es: ¿por qué git no puede encontrar el compromiso al que me refiero? Para ser honesto, realmente no entiendo cómo funciona esto. ¿Git almacena algo así como una base de datos de confirmaciones localmente en mi directorio de trabajo, para todas las demás ramas? Al ejecutar el comando cherry-pick, ¿busca en esa base de datos local para encontrar la confirmación de la que estoy hablando?
Dado que "zebra" es una sucursal remota, estaba pensando que no tengo sus datos localmente. Entonces cambié de sucursal:
git checkout zebra
Switched to branch 'zebra'
Ahora, aquí en mi máquina local, puedo ver que los archivos en el directorio reflejan el estado de zebra correctamente. Vuelvo al modo maestro, intento seleccionar nuevamente (con la esperanza de que los datos de confirmación estén disponibles ahora), pero tengo el mismo problema.
Tengo un malentendido fundamental de lo que está pasando aquí, cualquier ayuda sería genial.
Dado que "zebra" es una sucursal remota, estaba pensando que no tengo sus datos localmente.
Tienes razón en que no tienes los datos correctos, pero intentaste resolverlos de forma incorrecta. Para recopilar datos localmente desde una fuente remota, debe utilizar git fetch
. Cuando lo hizo git checkout zebra
, cambió al estado de esa rama la última vez que la recuperó. Así que busca primero desde el control remoto:
# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz
Solo como un complemento a la respuesta aceptada por OP:
Si tienes problemas con
fatal: bad object xxxxx
eso es porque no tienes acceso a ese compromiso. Lo que significa que no tienes ese repositorio almacenado localmente. Entonces:
git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx
Donde xxxxxxx es el hash de confirmación que desea.