¿Cómo elegir desde una sucursal remota?

135

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.

usuario291701
fuente
2
conceptualmente todo parece correcto. ¿estás seguro de que estás usando el hash correcto (firma como lo llamas) del commit? intente 'git show <hash>' para verificar.
0xc0de
Hola, sí, positivo: mis dos ramas están en github y puedo usarlas para encontrar las páginas de confirmación de esa manera. Si entiendo, el estado de mi máquina localmente es tal que git no puede encontrar el hash de 'zebra' mientras está en el contexto de 'master'. ¿Necesito decirle de alguna manera que 'cebra' también existe localmente?
user291701
ah y hacer 'git show xyz' da el mismo error "fatal: objeto malo". (y estoy reemplazando xyz con el hash correcto).
user291701
Y para aclarar, puedo usar mi hash 'xyz' para ver el commit en github sin problemas, como: " github.com/me/test/commit/xyz ".
user291701

Respuestas:

195

Como "zebra" es una rama remota, estaba pensando que no tengo sus datos localmente.

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 hiciste git checkout zebra, cambiaste a cualquier estado de esa rama la última vez que buscaste. Así que primero busca 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
Peter Lundgren
fuente
1
Enlace archivado: archive.miek.nl/blog/archives/2011/12/13/…
brianpeiris
1
Intenté este enfoque para elegir una solución aguas arriba en Github y resultó que el hash desprotegido era diferente al de Github. Por lo tanto, tuve que revisar, obtener el hash y elegir eso.
DustWolf
1
Realmente falta aquí una opción para pasar el control remoto en cherry-pick como: git cherry-pick <remote> <hash>
Jared
funcionó bien después de buscar la rama remota. Gracias :)
Adeel
Sí, funcionó después de buscar para mí también. Más información sobre git cherry-pick está disponible en atlassian.com/git/tutorials/cherry-pick
Satheesh M
12

Así como un apéndice de OP aceptó la respuesta:

Si tienes problemas con

fatal: bad object xxxxx

eso es porque no tienes acceso a esa confirmación. Lo que significa que no tiene ese repositorio almacenado localmente. Luego:

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.

Cezar Augusto
fuente
hmm cuando ya agregué el repositorio sin la bandera aguas arriba?
Gobliins
10

Agregar repositorio remoto (como "foo") del que queremos elegir

$ git remote add foo git://github.com/foo/bar.git

Recoge sus ramas

$ git fetch foo

Enumere sus confirmaciones (esto debería enumerar todas las confirmaciones en el obtenido foo)

$ git log foo/master

Elige el compromiso que necesitas

$ git cherry-pick 97fedac
Muhammad Soliman
fuente
5

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".

Juuso Ohtonen
fuente
3

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 (-)

temyong
fuente
1

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.

María
fuente
1

El commit debe estar presente en su local, verifique usando git log.

Si el commit no está presente, intente git fetchactualizar el local con el último control remoto.

Kuldeep Saxena
fuente
0

Esto también se puede lograr fácilmente con SourceTree:

  • revisa tu rama maestra
  • abra la pestaña "Registro / Historial"
  • localice el commit xyz y haga clic derecho sobre él
  • haga clic en "Combinar ..."

hecho :)

Giona
fuente
Esto es incorrecto. Porque ahora estás fusionando el HEAD of master en zebra en lugar de solo commits seleccionados.
Chef Faraón
0

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:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

Luego, en tu repositorio, busca de nuevo. Se buscará la nueva rama, incluida esa confirmación.

lulalala
fuente
0

Resolví este problema yendo a la rama con el commit que quiero elegir.

git checkout <branch With Commit To Cherry-Pick>

usa log para encontrar hash de commit

git log

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.

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

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".

git cherry-pick -x <your hash commit to add to the current branch>
RVscript
fuente