Tengo problemas para realizar una selección de cereza. En mi máquina local, actualmente estoy en mi rama "maestra". Quiero elegir un compromiso de otra rama, llamada "cebra". La rama "cebra" es una rama remota.
Entonces git status:
# On branch master
nothing to commit (working directory clean)
Ok, ahora trato de elegir el commit que quiero:
git cherry-pick xyz
fatal: bad object xyz
donde "xyz" es la firma de la confirmación que me interesa, que sucedió en la rama "zebra".
Entonces, la primera pregunta obvia es, ¿por qué git no puede encontrar la confirmación a la que me refiero? Realmente no entiendo cómo funciona esto en primer lugar para ser honesto. ¿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, ¿va y busca en esa base de datos local para encontrar la confirmación de la que estoy hablando?
Como "zebra" es una rama remota, estaba pensando que no tengo sus datos localmente. Entonces cambié ramas:
git checkout zebra
Switched to branch 'zebra'
Así que ahora aquí en mi máquina local, puedo ver que los archivos en el directorio reflejan el estado de la cebra correctamente. Vuelvo a master, intento volver a elegir (esperando que los datos de confirmación estén disponibles ahora), pero me sale el mismo problema.
Tengo un malentendido fundamental de lo que está sucediendo aquí, cualquier ayuda sería genial.
Respuestas:
Tiene razón en que no tiene los datos correctos, pero trató de resolverlos de manera incorrecta. Para recopilar datos localmente desde una fuente remota, debe usar
git fetch
. Cuando lo hicistegit checkout zebra
, cambiaste a cualquier estado de esa rama la última vez que buscaste. Así que primero busca desde el control remoto:fuente
Así como un apéndice de OP aceptó la respuesta:
Si tienes problemas con
eso es porque no tienes acceso a esa confirmación. Lo que significa que no tiene ese repositorio almacenado localmente. Luego:
Donde xxxxxxx es el hash de confirmación que desea.
fuente
Agregar repositorio remoto (como "foo") del que queremos elegir
Recoge sus ramas
Enumere sus confirmaciones (esto debería enumerar todas las confirmaciones en el obtenido
foo
)Elige el compromiso que necesitas
fuente
Después de fusionar una rama de desarrollo para dominar, generalmente elimino la rama de desarrollo. Sin embargo, si quiero elegir los commits en la rama de desarrollo, tengo que usar el hash de commit de fusión para evitar el error de "objeto malo".
fuente
Primero debe extraer los datos de ambas ramas en su unidad local.
Lo que está sucediendo es que estás tratando de elegir desde la rama-a a la rama-b, donde actualmente estás en la rama-b, pero la copia local de la rama-a no está actualizada todavía (debes realizar un git pull on ambas ramas primero).
pasos:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>
salida:
[branch-b <hash>] datos de registro
Autor: Autor <Autor
1 archivo cambiado, 1 inserción (+), 3 eliminaciones (-)
fuente
Recibí este error después de usar la identificación de confirmación de una pestaña de identificación de confirmación de solicitud de extracción. Ese compromiso fue posteriormente aplastado y fusionado. En la solicitud de extracción de github, busque este texto: "commit comprometido xxxxxxx en ..." en lugar de intentar usar los identificadores de compromiso de la pestaña de compromisos.
fuente
El commit debe estar presente en su local, verifique usando
git log
.Si el commit no está presente, intente
git fetch
actualizar el local con el último control remoto.fuente
Esto también se puede lograr fácilmente con SourceTree:
hecho :)
fuente
Si ha buscado, pero esto todavía sucede, lo siguiente podría ser una razón.
Puede suceder que la confirmación que intenta elegir ya no pertenezca a ninguna rama. Esto puede suceder cuando rebasas.
En tal caso, en el repositorio remoto:
git checkout xxxxx
git checkout -b temp-branch
Luego, en tu repositorio, busca de nuevo. Se buscará la nueva rama, incluida esa confirmación.
fuente
Resolví este problema yendo a la rama con el commit que quiero elegir.
usa log para encontrar hash de commit
cuando hayas encontrado tu hash corta y pega en el bloc de notas. si usa el comando, simplemente desplácese hacia arriba para obtener el hash y luego revise la rama en la que desea colocar el compromiso.
finalmente llame a cherry-pick de git (note) -x es agregar su mensaje de cherry-pick al original. "Cuando grabe el commit, agregue una línea que diga" (cherry seleccionado de commit ...) "al mensaje de compromiso original para indicar de qué commit se eligió este cambio".
fuente