usar pick multiple how como commits cherry bad git cherry-pick git-cherry-pick

multiple - how to do cherry pick in git



Sintaxis Git cherry-pick y ramas de fusión (5)

Así que he hecho innumerables selecciones de cereza antes y parece que debo fallar en la vida con esto en este momento, estoy tratando de elegir de una rama a otra, lo que debería ser fácil, ¿cómo puedo obtener un error sobre la fusión pero no -m fue dado?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given. fatal: cherry-pick failed

Eso parece estar mal ... debe ser:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

¿Desde cuándo tengo que suministrar una función -m?


El git le solicita que especifique el número principal ( -m ), ya que su compromiso de fusión tiene dos padres y git no sabe qué lado de la fusión se debe considerar como la línea principal. Entonces, al usar esta opción, puede especificar el número principal (comenzando desde 1) de la línea principal y seleccionar con precisión para reproducir el cambio relativo al padre especificado.

Para averiguar cuáles son sus padres confirmados, intente:

git show --pretty=raw <merge_commit>

o:

git cat-file -p <merge_commit>

o incluso para una mejor visibilidad de GUI, intente:

gitk <merge_commit>

Como resultado, deberías obtener algo como:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821 tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit> parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>

Luego, verifique los detalles de cada uno de los padres al:

git show <parent1_or_2_commit>

Agregue --stat para ver la lista de archivos modificados.

O use el siguiente comando para comparar los cambios (basados ​​en el padre anterior):

git diff <parent1_or_2_commit>..<commit>

Agregue --stat para ver la lista de archivos modificados.

o use la diferencia combinada para comparar los dos padres al:

git diff --cc <parent1_commit> git diff --cc <parent2_commit>

Luego, especifique el número principal comenzando desde 1 para su selección de cereza, por ej.

git cherry-pick -m 1 <merge_commit>

Luego ejecuta el git status para ver qué está pasando. Si aún no desea confirmar los cambios, agregue la opción -n para ver qué sucede. Luego, cuando no estés satisfecho, reinicia a HEAD ( git reset HEAD --hard ). Si tienes conflictos de git, probablemente tendrás que resolverlos manualmente o especificar la estrategia de combinación ( -X ), ver: ¿Cómo resolver conflictos de fusión en Git?


Intenta combinar el resultado:

git cherry-pick .... git mergetool git cherry-pick --continue


La sintaxis de las páginas man es la siguiente:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...

El número padre se refiere a:

-m número padre, -número padre principal, por lo general no puede seleccionar una fusión porque no sabe qué lado de la combinación debe considerarse la línea principal. Esta opción especifica el número principal (comenzando desde 1) de la línea principal y permite a cherry-pick reproducir el cambio relativo al padre especificado.

Por lo tanto, verificaría dos veces para asegurarme de que tienes el hash de confirmación correcto. Puede ser que quieras uno que no sea de una combinación, sino más bien el compromiso anterior. De lo contrario, debe usar este indicador y señalar el lado correcto de la combinación para eliminar la ambigüedad de su solicitud.


Personalmente, lo que normalmente hago es que, dado que una combinación combina 2 commits, por ejemplo, si tengo merge commit C, que está compuesto por 2 padres, por ejemplo commit A en master y commit B de la otra rama fusionada, si necesito elegir fusionar no me molestaría con el comando confuso para seleccionar el compromiso de fusión, sino que solo me gustaría hacer una guinda de cada uno de los padres A y B individualmente, esto también es útil en una situación en la que solo quieres seleccionar el compromiso B solo en La confirmación de caso A del maestro ya fue seleccionada a la rama a la que se está eligiendo antes de la fusión.


-m proporcionar -m si la confirmación es una confirmación de fusión , es decir, una confirmación con más de un padre.

Normalmente, lo que git cherry-pick REV hace se puede describir como:

  1. Tome los cambios entre rev y su padre.

  2. Aplica estos cambios al HEAD actual y confirma el resultado con el mensaje de confirmación de rev .

Un commit de fusión une dos líneas de desarrollo. Por ejemplo, una línea implementa el widget y la otra línea elimina el desorden. La combinación te da el código con el widget, sin el desorden.

Ahora considere el paso # 1 del proceso de selección selectiva: git no puede adivinar si desea eliminar el desorden o implementar el widget. Tampoco puede hacer ambas cosas, porque la información sobre cómo hacer ambas cosas no está contenida dentro de una única confirmación de fusión, solo el contenido del árbol fusionado resultante sí lo está.

La opción -m permite decirle a git cómo proceder. Por ejemplo, si la eliminación del desorden sucedió en el master y la confirmación de fusión se creó usando git merge WIDGET , entonces git cherry-pick -m 1 merged-commit seleccionará el nuevo widget porque difiere entre el árbol fusionado y el padre 1 (el último de compromisos de eliminación de desorden) habrá sido exactamente la adición del widget. Por otro lado, git cherry-pick -m 2 merge-commit eliminará el desorden, porque la diferencia entre el padre 2 (el último de los compromisos de adición de artilugios) y merge-commit es exactamente la eliminación de desorden que falta en el widget rama.