miércoles, 21 de marzo de 2018

GIT Cherry-Pick

Explicando el Caso

Tenemos dos ramas:

o---(C1A)---(C2A)---(C3A)----->  A (master)

o---(C1B)---(C2B)---(C3B)----->  B (hija)

Donde:

C{#}{Rama}

- C       : significa commit
- #        : número del commit
- Rama : nombre de la rama

Entonces queremos pasar el segundo commit de la rama B (C2B) a la rama A,  de tal  forma que quede así:

o---(C1A)---(C2A)---(C3A)---(C2B)------>  A (master)

o---(C1B)---(C2B)---(C3B)---------------- ->  B (hija)

Para ello debemos hacer los siguientes pasos:

1.- Para saber los commits de la rama master (A) se hace un git log

$ git log --pretty=oneline

$ git log --pretty=oneline

3cdd67fed7ce2265cb366787455da6fc34c022f5 C3A
c876d29ace62f329da3e5e2874f546fef79de9a8 C2A
1356af1f05d7630f1252618bfe5b5116c9c76654 C1A
2.- Cambio a la rama hija (B) para visualizar los commits

$ git ck hija 


$ git log --pretty=oneline

e7e7b0a1a900b541cbb507d1a638cbe0c92c2697 C3B
0244a2f19abf4a38ac77b6c376512c0e0a86d9d4 C2B
c5d160eae85ebfd5631a716f39842a1f99ea947d C1B
con esto se identifica el #id del commit C2B para poder pasarlo a la rama master (A)

3.- Una vez teniendo el #ID del commit, cambio de rama a la master para realizar un cherry-pick

$ git ck master
Al realizar un CHERRY-PICK se indica que solo el commit con el #ID va a ser aplicado a la rama donde estoy actualmente, en este caso en la rama master (A).
  Para este ejemplo  el commit C2B  contiene un archivo llamado file2B.md
El formato del cherry-pick sería el siguiente: git  cherry-pick #ID
$ git cherry-pick 0244a2f19abf4a38ac77b6c376512c0e0a86d9d4
[master adee66a] C2B
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file2B.md
4.- Para terminar revisamos los commits y vemos que se aplicó correctamente

$ git log --pretty=oneline

adee66a2f27e2bc1b05176efd115e0eba81a8b80 C2B
3cdd67fed7ce2265cb366787455da6fc34c022f5 C3A
c876d29ace62f329da3e5e2874f546fef79de9a8 C2A
1356af1f05d7630f1252618bfe5b5116c9c76654 C1A
En caso de Confictos, que hacer?

  Es posible que al realizar un cherry-pick  nos encontremos conflictos, esto sucede cuando se ha 
editado el mismo archivo por otros usuarios.

Para este caso:
   - Primero  debemos resolver el conflicto:
$ git mergetool

   - Segundo debemos agregar estos cambios:
$ git add --all

  - Tercero debemos aplicar el commando:
$git cherry-pick --continue

* si por algún motivo deseamos abortar el cherry-pick, debemos aplicar este comando:
$ git cherry-pick --abort

Exponiendo un caso

  Aplicamos el #ID del commit que se aplicará a la rama master, entonces se hace un cherry-pick

$ git cherry-pick 688743c6515ed2d32cfbc361c3a796d3b0b1c4c6
error: no se puede aplicar 688743c... C4B
consejo: después de la resolución de conflictos, marcar las rutas corregidas
consejo: con «git add » o «git rm »
consejo: y hacer commit del resultado con «git commit»
Con esto observamos que hay conflictos y el estado nos dará lo siguiente:

$ git status
En la rama master
You are currently cherry-picking commit 688743c.
    (fix conflicts and run "git cherry-pick --continue")
    (use "git cherry-pick --abort" to cancel the cherry-pick operation)

Rutas no combinadas:
    (use «git add ...» para marcar resolución)
        modificado por ambos: readme.md

no hay cambios agregados al commit (use «git add» o «git commit -a»)
 Se aplican  los siguientes pasos  para resolver los confictos y continuar con el cherry-pick

$ git mergetool
$ git add --all
$ git cherry-pick --continue
Así resolvemos los conflictos y aplicamos los cambios.

Caso Práctico

C:\Users\Bext\IdeaProjects\HibernateRoad>git checkout A
Switched to branch 'A'

C:\Users\Bext\IdeaProjects\HibernateRoad>git log --pretty=oneline
3d9f5076c3256f500a664790d5238e0d64c33b89 + Temporal
01e3b261306ef175611c05ff9dad1a0e7fd42c9c + Temporal
0fbccdd5009a7f2df0af4ddab740dfa400b0b4c5 + @Entity Persona @GenericGenerator
5ef85bf2229f1157e518181db3547316b9d22d00 Primer Commit @Entity Persona mysql

C:\Users\Bext\IdeaProjects\HibernateRoad>git checkout B
Switched to branch 'B'

C:\Users\Bext\IdeaProjects\HibernateRoad>git log --pretty=oneline
037aa0ff7c54ab23d8eb4d3e481223e5270f7a0e + @Entity Vehiculo @GenericGenerator se agrega a hibernate.cfg.xml
a014815d78a1261e50b4306afaa4143c2ed07fac + @Entity Vehiculo @GeneratedValue
5ccb332ae5b1477b34ba7525b05bfed647331e16 Primer Commit @Entity Vehiculo
5ef85bf2229f1157e518181db3547316b9d22d00 Primer Commit @Entity Persona mysql





fdt

No hay comentarios:

Publicar un comentario