git cherry-pick no solo selecciona el diff del commit

Tengo dos twigs: A y B

  • A historial de confirmaciones de A: a <- b <- c ;
  • El historial de compromiso de B : a <- h <- i ;

Supongamos que solo hay un file aquí.

  1. En commit b , agrego algunos texts como "foo".
  2. En commit c , agrego algunos texts como "bar".
  3. Luego git cherry-pick c en la twig B Pensé que cherry-pick solo elegiría los cambios en c en la twig B Sin embargo, agregará tanto foo como la bar a la twig B Lo cual obviamente no es lo que quiero.

Por lo tanto, cherry-pick seleccionará todos los cambios de esos files tocados en commit c ya que el antepasado confirma a . ¿Está bien? ¿Qué pasa si solo quiero elegir el diff de b a c y aplicarlo en i ?

Actualiza los pasos exactos

  1. Init a git repo;
  2. Agregue el file test.txt y emita la primera confirmación commit init commit . test.txt es ahora:

     first line second line 
  3. Cree un nuevo desarrollador de twigs pero permanezca en el master twigs;

  4. Agregue added in commit b al file y emita la confirmación b . test.txt es ahora:

     first line added in commit b second line 
  5. Agregue added in commit c al file y emita la confirmación c . test.txt es ahora:

     first line added in commit b added in commit c second line 
  6. Verifica la twig dev y emite la confirmación h . test.txt es ahora:

     first line second line adding by commit h 
  7. git cherry-pick <commit c SHA1 ID> para seleccionar con precisión commit c en commit h .

  8. El post de conflicto:

     index 6a8dc57,594c6ec..0000000 @@@ -1,4 -1,4 +1,9 @@@ first line ++<<<<<<< HEAD ++======= + added in commit b + added in commit c ++>>>>>>> 06ce9b1... commit c adding another line second line + +adding by commit h 
  9. ¿Ver? cherry-pick también trae el cambio en commit b .

¡Gracias!

git cherry-pick intenta traer solo una confirmación. Pero lo hace aplicando un parche que requiere cierto context. El cambio realizado en la confirmación C está muy cerca del cambio realizado por la confirmación b, de modo que se obtiene el conflicto; no se puede encontrar el lugar correcto donde se debe aplicar el cambio. Y cuando tienes conflicto, también obtienes parte del context conflictivo que es al less parte de tu compromiso B.

Así es como funcionaría sin el conflicto:

 $ git init $ cat > f line1 line2 line3 $ git add f $ git commit -a -m "initial" # Edited to add a line in the beginning of f $ cat f Commit b line1 line2 line3 $ git commit f -m "B" # Edited to add a line in the end of f $ cat f Commit b line1 line2 line3 Commit c $ git commit f -m "C" $ git checkout HEAD^^ $ git cherry-pick master $ cat f line1 line2 line3 Commit c 

¿Qué pasa si solo quiero elegir el diff de b a c y aplicarlo en i?

Puede encontrar / escribir la diff de un file entre dos confirmaciones ( c..d ). Luego, aplica eso en tu twig actual.

 $ git checkout <B-branch> # write the diff in a file named 'change.patch' (root directory) $ git diff <b-commit> <c-commit> <file-name> >> ~/changes.patch $ git apply ~/changes.patch # apply the changes $ git add . # merge the changes to i (previous commit) $ git commit --amend -m 'Apply the diff of b and c' $ git push -f origin HEAD # force(-f) push since history is changed