¿Alguien puede explicar lo que hace git cherry-pick <sha>?

Como mi preocupación aquí es, tengo una confirmación anterior en mi otra twig local [contiene abc.cpp, def.cpp].

Ahora, después de algunos meses, quiero usar esos cambios, pero en mi twig actual abc.cpp se actualiza. Entonces, ¿es como si yo selecciono inteligentemente, entonces integrará los cambios del viejo abc.cpp en el nuevo abc.cpp [copy del directory de trabajo reciente]?

La página man de git-cherry-pick (1) dice:

Dadas una o más confirmaciones existentes, aplique el cambio que cada una introduce, registrando una nueva confirmación para cada una. Esto requiere que su tree de trabajo esté limpio (sin modificaciones desde el compromiso HEAD).

En lenguaje sencillo, esto significa que git cherry-pick aplica confirmaciones de una twig a otra, pero no conserva el historial original o ascendencia de la otra twig en la forma en que lo haría una combinación adecuada.

Piénselo como aplicar una serie de parches seleccionados, en lugar de una fusión completa de dos twigs de la historia. Obviamente, si tiendes a realizar commits atómicos muy pequeños, el "cherry-picking" es exactamente igual a aplicar un parche bien escrito. Sin embargo, como no tienes ancestros comunes como lo haces con merge o rebase, es posible que tengas que resolver muchos más conflictos si tus commits no son pequeños ni aislados.

Ya sea que la recolección de cereza sea una buena idea depende en gran medida de la forma en que organices tus compromisos. Si no funciona para usted, siempre puede hacer las cosas más manualmente con git format-patch y git apply lugar.

Sí, eso es lo que hace. cherry-pick aplica un compromiso (o un range de ellos) como un parche a su twig (bueno, casi como un parche ).

Es posible que tenga conflictos (como cuando fusiona sucursales) ya que las modificaciones independientes han sucedido en sus sucursales.

Tenga en count que con git1.8.5 / 1.9 (Q4 2013) , git cherry-pick ahora puede seleccionar fácilmente "de la twig anterior":

Al igual que " git checkout - " sabe que revisar y " git merge - " sabe fusionar la twig en la que estaba anteriormente, " git cherry-pick " ahora entiende " git cherry-pick - " para elegir de la twig anterior.

Ver commit 182d7d de Hiroshige Umino (yaotti) :

cherry-pick : permite " - " como abreviatura de ' @{-1} '

" - " la abreviatura es útil para " cherry-pick " como " checkout " y " merge ".

También es bueno para la uniformidad que un " - " se parezca al nombre de la twig anterior donde se acepta el nombre de una twig y no podría significar otras cosas como stdin .