miércoles, 18 de octubre de 2017

Git con Git-Cola Pull, Merge y Resolución de Conflictos

Resumen de pasos a seguir.

- Se trabaja con dos carpetas iniciales MiProyecto y origin(remote).
- Se clona origin(remote) a carpeta BetoRepo
- Se agregan dos archivos diferentes a MiProyecto y BetoRepo.
- Stage change,Commit y Push en MiProyecto
- Stage change, Commit y Push en BetoRepo, se tendrá un error. Se necesita Fetch a los cambios
- Fetch y Prune, se observará en el arbol que el master esta adelante de BetoRepo
- Se buscará hacer Merge para unir los cambios.
- Se hace Pull en BetoRepo.
- Antes de hacer Commit se puede hacer revision manual a los cambios.
- Se observará en el arbol que aparece el commit de MiProyecto y tambien el de BetoRepo
- Se hace Push, y el remoto recivirá los cambios.
- En el arbol se verá que master y origin/master se emparejan.
- Se observa en la carpeta MiProyecto el archivo que se agregó a BetoRepo
- Hasta el momento no ha habido conflicto.
- Se hara un conflicto a OtroArchivo.txt se agregarán datos distintos y se resolverá con alguna herramienta (KDiff3).



Comenazamos.


Se clona origin(remote) a carpeta BetoRepo
  Para esto se puede hacer con git-cola o git-gui, el git-cola tiene un bug, ya que crea un directorio extra "origin(remote)" el cual se debe ajustar subiendo su contenido un nivel y borrando este directorio. Con git-gui no ocurre esto.


Revisamos el contenido



Clonar con Git-Cola

Se creará una carpeta que será el repositorio BetoRepo, debajo de esta carpeta creará un directorio origin(remote) que correspinde al nombre del que se esta clonando, así que moveremos su contenido a BetoRepo y borraremos el directorio origin(remote). Esto para que quede la estructura igual que el repositorio MiProyecto.

- Se agregan dos archivos diferentes a MiProyecto y BetoRepo.
  ArchivoMiProyecto en MiProyecto y ArchivoBetoRepo en BetoRepo.

 - Stage change,Commit y Push en MiProyecto.

- Stage change, Commit y Push en BetoRepo, se tendrá un error. Se necesita Fetch a los cambios.



- Fetch y Prune, se observará en el arbol que el master esta adelante de BetoRepo.
  se da Fetch.


- Se buscará hacer Merge para unir los cambios.
- Se hace Pull en BetoRepo.
  Se desmarca la opción Fast-Forward only.
  Se observa que aparece el commit de MiProyecto. un Branch automaticamente.


- Antes de hacer Commit (se hace automaticamente) se puede hacer revision manual a los cambios.
 Tenemos en MiProyecto                                  BetoRepo
   .git                                                                  .git
   ArchivoMiProyecto                                       ArchivoBetoRepo
   OtroArchivo                                                   ArchivoMiProyecto
   PrimerArchivo                                                OtroArchivo
                                                                           PrimerArchivo


- Se observará en el arbol que aparece el commit de MiProyecto y tambien el de BetoRepo.
- Se hace Push, y el remoto recivirá los cambios.
- En el arbol se verá que master y origin/master se emparejan.


- Se observa en la carpeta MiProyecto el archivo que se agregó a BetoRepo
- Hasta el momento no ha habido conflicto.

- Se hara un conflicto OtroArchivo se agragarán datos distintos.
  MiProyecto - OtroArchivo se agrega "MiProyecto agrega Esto".
  BetoRepo    - OtroArchivo se agrega "BetoRepo agrega Esto".

- MiProyecto Stage, Commit. Push aún No.

- BetoRepo Stage, Commit.

 -BetoRepo Push

- MiProyecto Pull
  No es necesario hacer un Fetch si pensamos hacer un Pull.
  Nos da un conflicto.
 



Aquí es donde visualizamos el conflicto, el archivo BetoRepo-OtroArchivo estará intacto, pues BetoRepo lo subio primero pero MiProyecto-OtroArchivo visualizara el conflicto y tendrá esto el contenido del archivo.

Datos a OtroArchivo
Un Buen Cambio :)
<<<<<<< HEAD
MiProyecto agrega ESTO
=======
BetoRepo agrega ESTO
>>>>>>> 667fa34898becc350bb0c1b1b9ea25320fb9ca36

Vamos a editar el contenido del archivo, y dejaremos el cambio que hizo MiProyecto.
   Con un editor abrimos el archivo OtroArchivo, lo modificamos para que quede a nuestro gusto, se guarda. y en git-cola hacemos Stage, Commit y Push. Así se resuelve el conflicto manualmente.
- MiProyecto hace Commit y Push

Entonces Queda en origin(remote) el Push de MiProyecto.

Creación de Contenido en Conflicto para Resolver con Alguna Herramienta

   Para resolver los conflictos hay herramientas especializadas como meld, xxdiff ,kdiff3... en este caso git-cola llama a xxdiff pero no esta instalado. xxdiff corre mejor en ambientes linux. Por el momento configuraremos meld para correr en windows. Así que bajamos meld y los instalamos para windows.

meld-1.8.6.0  --- Despues de algunos tropiezos no nos deja configurarlo
Se tiene exito con KDiff3
KDiff3-64bit-Setup_0.9.98-2.exe  Se instala en la compuradora.

Se tiene que modificar el archivo .git/config agregando las lineas

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/Program Files/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false


Hasta el momento tenemos MiProyecto en origin(remote). Consideranto esto, haremos lo siguiente para crear un contenido que conflictue, esto es diferente contenido en archivo OtroArchivo

- Se agrega a MiProyecto-OtroArchivo el contenido "MiProyecto agrega Tambien Esto a OtroArchivo".
- Se agrega a BetoRepo-OtroArchivo el contenido "BetoRepo agrega Tambien Esto a OtroArchivo".
- MiProyecto hace Stage, Commit, and Push.
- BetoRepo hace Stage, Commit y Pull. Se mandara Error anunciando el Conflicto de contenido en el archivo OtroArchivo.
- Abrimos GitGui en BetoRepo. Esto por que Git-Cola no propone en sus opciones usar la versión Remota o Local. Solo tiene la opción de correr la herramienta para resolver el conflicto, misma que debe configurarse.

Podemos resolver el conflicto de la siguiente manera:
- Run Merge Tool:  Corriendo una herramienta Merge que nos ayudara a visualizar los archivos y hacer los ajustes.
- Use Remote Version: Simplemente descartara los cambios locales y tomara los remotos.
- Use Local Version: Descartara los cambios Remotos y tomara los Locales.

- Resolvemos por medio de una herramienta, en este caso se configuró KDiff3 para GitGui y Git-Cola. Accedemos a ella en GitGui seleccionando el archivo con click-derecho ->Run Merge Tool, para Git-Cola seleccionamos el archivo con click-derecho->Abrir Herramienta de Comparación.

En KDiff3 tenemos tres ventanas arriba que muestran de donde obtenemos los datos A,B y C. En la de abajo OutPut, se editan los datos, en este caso tomamos de B [BetoRepo agrega ESTO] y C [MiProyecto agrega ESTO], y además agregamos la linea [y Resolviendo Agregamos ESTO]. hecho esto Salvamos el archivo.

- Se hace Commit, el mensaje es propuesto por default.

- Se hace Push. enviando el cambio al repositorio remoto.

Y Listo, el Conflicto se ha resuelto.

No hay comentarios:

Publicar un comentario