Inicio > Git > GIT Branch y GIT Merge

GIT Branch y GIT Merge

La última vez estuve hablando de GIT, de sus comandos básicos y cómo utilizarlos. Ahí vimos que cuando agregamos una arborescencia a GIT, una branch por defecto es creada, la branch master. Cuando analizamos la carpeta .git podemos verla referenciada:

joan@jomaora:~/testGit/testMockito/.git$ tree
.
├── branches
├── ...
│   ├── ...
├── index
├── ...
├── logs
│   ├── HEAD
│   └── refs
│   └── heads
│   └── master
├── objects
│   ├── 01
│   │   └── ...
│   ├── info
│   └── pack
└── refs
├── heads
│   └── master
└── tags

El comando para saber la branch en la que se está trabajando es:

joan@jomaora:~/testGit/testMockito$ git branch
* master

Vamos a crear una branch para poder realizar modificaciones sin alterar el código de master y poderlas probar sin impactar potencialmente a nadie.

joan@jomaora:~/testGit/testMockito$ git branch experimental
joan@jomaora:~/testGit/testMockito$ git checkout experimental
Switched to branch 'experimental'
joan@jomaora:~/testGit/testMockito$ git branch
* experimental
master

En .git vemos que experimental aparece en la arborescencia

joan@jomaora:~/testGit/testMockito/.git$ tree
.
├── ...
│   ├── ...
├── logs
│   ├── HEAD
│   └── refs
│   └── heads
│   ├── experimental
│   └── master
├── ...
├── heads
│   ├── experimental
│   └── master
└── tags

Modifiquemos un archivo cualquiera. Yo modificaré Author.java pero no mostraré los cambios acá. Commiteamos el cambio en experimental, y vemos el historial de commits.

joan@jomaora:~/testGit/testMockito$ git commit -a -m "Adding modif in experimental branch"
[experimental 063d31d] Adding modif in experimental branch
1 file changed, 1 insertion(+), 1 deletion(-)

joan@jomaora:~/testGit/testMockito$ git log
commit 063d31d1c69f8e68686e49163233137ecb9da07b
Author: Joan Ortega-Ardila <jmortega@ekino.com>
Date: Tue Aug 14 12:14:03 2012 +0200
Adding modif in experimental branch

commit d19631e828371823d0f9af3d6b5ba01ede63b39a
Author: Joan Ortega-Ardila <jmortega@ekino.com>
Date: Mon Aug 13 14:46:18 2012 +0200
Adding modifications

commit e574777049f566b9afa86b983f5fda4028ff0a6b
Author: Joan Ortega-Ardila <jmortega@ekino.com>
Date: Mon Aug 13 14:20:24 2012 +0200
Adding files on Git repository

Podemos comprobar que los commits que venían de la branch master están también aca. Ahora si ya terminamos nuestros cambios en experimental, sólo nos falta incluirlos en la branch master, es decir mergearlos. El comando es mas similar al de SVN. Primero pasamos a la branch master, y luego ejecutamos git merge nombredelabranch:

joan@jomaora:~/testGit/testMockito$ git checkout master
Switched to branch 'master'
joan@jomaora:~/testGit/testMockito$ git merge experimental
Updating d19631e..063d31d
Fast-forward
src/main/java/com/jomaora/app/model/Author.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Podemos ver que al mergear, la modificación en Author.java pasa en el mensaje de resultado del comando. Ahora bien, asi como en SVN, en GIT podemos tener los famosos conflictos al momento de hacer los merges. Supongamos que tenemos las siguientes modificaciones:

  • Del lado de la branch experimental:

joan@jomaora:~/testGit/testMockito$ git checkout experimental
Switched to branch 'experimental'
joan@jomaora:~/testGit/testMockito$ git diff
diff --git a/src/main/java/com/jomaora/app/App.java b/src/main/java/com/jomaora/app/App.java
index fd4fff4..bee7578 100644
--- a/src/main/java/com/jomaora/app/App.java
+++ b/src/main/java/com/jomaora/app/App.java
@@ -7,6 +7,6 @@ public class App
{
_____public static void main( String[] args )
_____{
-_____ System.out.println( "Hello World!" );
+_____ System.out.println( "Hello from experimental!" );
_____}
}
joan@jomaora:~/testGit/testMockito$ git commit -a -m "Adding change in experimental for conflict"
[experimental ccc103c] Adding change in experimental for conflict
1 file changed, 1 insertion(+), 1 deletion(-)

  • Del lado de la branch master

joan@jomaora:~/testGit/testMockito$ git checkout master
Switched to branch 'master'
joan@jomaora:~/testGit/testMockito$ git diff
diff --git a/src/main/java/com/jomaora/app/App.java b/src/main/java/com/jomaora/app/App.java
index fd4fff4..ade30e2 100644
--- a/src/main/java/com/jomaora/app/App.java
+++ b/src/main/java/com/jomaora/app/App.java
@@ -7,6 +7,6 @@ public class App
{
_____public static void main( String[] args )
_____{
-_____ System.out.println( "Hello World!" );
+_____ System.out.println( "Hello from master!" );
_____}
}
joan@jomaora:~/testGit/testMockito$ git commit -a -m "Adding change in master for conflict"
[master 2afcd87] Adding change in master for conflict
1 file changed, 1 insertion(+), 1 deletion(-)

Ahora desde master, intentemos mergear los cambios de la branch experimental:

joan@jomaora:~/testGit/testMockito$ git merge experimental
Auto-merging src/main/java/com/jomaora/app/App.java
CONFLICT (content): Merge conflict in src/main/java/com/jomaora/app/App.java
Automatic merge failed; fix conflicts and then commit the result.

Un git diff nos permetirá ver dónde se encuentran los conflictos, que se muestran de la misma manera que en SVN:

joan@jomaora:~/testGit/testMockito$ git diff
diff --cc src/main/java/com/jomaora/app/App.java
index ade30e2,bee7578..0000000
--- a/src/main/java/com/jomaora/app/App.java
+++ b/src/main/java/com/jomaora/app/App.java
@@@ -7,6 -7,6 +7,10 @@@ public class Ap
{
_____public static void main( String[] args )
_____{
++<<<<<<< HEAD
+ _____System.out.println( "Hello from master!" );
++=======
+ _____System.out.println( "Hello from experimental!" );
++>>>>>>> experimental
_____}
}

Editamos el archivo para solucionar el conflicto y efectuamos el commit.

joan@jomaora:~/testGit/testMockito$ git diff
diff --cc src/main/java/com/jomaora/app/App.java
index 3dba7e0,c8a695c..0000000
--- a/src/main/java/com/jomaora/app/App.java
+++ b/src/main/java/com/jomaora/app/App.java
@@@ -9,6 -9,6 +9,6 @@@ public class Ap
_____public static void main( String[] args )
_____{
- _____ System.out.println( "Hello from master!" );
- _____ System.out.println( "Hello from experimental!" );
++ ____ System.out.println( "Hello from experimental and master!" );
 _____}
}
joan@jomaora:~/testGit/testMockito$ git commit -a -m "Resolving"
[master 6a77f57] Resolving
joan@jomaora:~/testGit/testMockito$ git status
# On branch master
nothing to commit (working directory clean)

Una manera de observar cuáles son los impactos de los commits entre varias branches y cómo son mergeados es a través del commado gitk, que abre una ventana con la representación gráfica de los commits, tal como podemos ver a continuación:

joan@jomaora:~/testGit/testMockito$ gitk master experimental

Ya para terminar, otro comando útil para mostrar la información de las branches y los commits y los merge es :

joan@jomaora:~/testGit/testMockito$ git log --pretty=format:'%h : %s' --graph

Que mostrará la información en consola. Espero que esta información les sirva de ayuda.

About these ads
Categorías:Git Etiquetas: , , , ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

My experiments with SCRUM

Site to discuss Agile (Scrum, XP, etc) concepts and ideas.

Chris Aniszczyk's (zx) diatribe

work. life. open source. diatribes.

GermanTrevi

repositorio de mi mente...

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 148 seguidores

%d personas les gusta esto: