lunes, 25 de julio de 2011

Branch remotos en git, dos pasos. ¿Y despues?

Anteriormente, en gitevangelism, hice un post que explica como crear un branch remoto en dos pasos, aca un resumen:

Crear un branch de manera local
git checkout -b nuevo_branch
Publicar el branch, y trackearlo local (al especificar -u)
git push -u origin nuevo_branch

Despues, hay que trabajar con el branch, hay cosas que no resultaran tan triviales al principio

Trabajar en el branch, en los branches

Si se ejecutaron los comandos para creacion de branch explicados, habra quedado activo el nuevo_branch, sino se esta seguro se puede utilizar git branch sin argumentos, asi:
git branch
Devuelvera la lista de branch, indicando con un asterisco el branch activo en el momento

Si el branch en el que queremos trabajar no es el activo, entonces ejecutamos el comando checkout
git checkout nuevo_branch
A partir de entonces, todos los commits seran dirigidos al branch activo, actualizando el branch para que apunte a cada commit que se hace.

Si por alguna razon, es necesario dejar el trabajo que se esta realizando en este branch para trabajar en otro (por ejemplo, en master), se utiliza el comando checkout para reactivar master

git checkout master

Si hay cambios no commiteados, seguramente el comando se negara a cambiar el branch activo, si ese fuera el caso hay que commitearlos o stashearlos (stash es un commit temporal que se usa para guardar el indice y los cambios no commiteados y que despues se puede recuperar):

git stash

Para volver, otra vez hay que ejecutar
git checkout nuevo_branch
Y si se tuvo que salvar los cambios mediante stash, hay que recuperarlo haciendo
git stash pop

Por ultimo, se debe ejecutar el comando git push, este sube cada branch trackeado a su correspondiente branch remoto (en este caso subiria el master local al master remoto y el nuevo_branch local al nuevo_branch remoto)

Colaboracion

Si se necesita que otra persona contribuya al branch, desde otra maquina, tiene que trackearlo
git fetch
git checkout --track -b nuevo_branch origin/nuevo_branch

Despues, trabajar de esa manera es lo mismo que trabajar al master, con la diferencia (claro esta) que es el nuevo_branch el que recibe los cambios que se pushean

Otra opcion, para mirar el branch es directamente usar las ref remotas

git fetch
git checkout origin/nuevo_branch


Esto es mas practico si solo se necesita "ver" el contenido del branch, pero para trabajar con el es conveniente trackearlo, de otra manera se tendria que explicitar el branch cada vez que se hace push:


git push origin HEAD:refs/heads/nuevo_branch


Integrar los cambios

Esta es la manera mas practica de integrar, que utiliza el 3-way-merge (otro dia hago un articulo explicando eso), no hay mas que hacer que lo siguiente:
git checkout master
git merge nuevo_branch

Puede ser que master y nuevo_branch no sea divergentes (esto es que una, generalmente master, apuntara a un commit ancestro del otro), en ese caso no habra ningun problema y simplemente master cambiara para igualar a nuevo_branch.
Cuando master y nuevo_branch no son divergentes, se utilizara el algoritmo de merge que
puede no dar conflicto en cuyo caso efectuara un commit automaticamente, ese commit sera un commit de merge (es lo mismo que cuando se hace git pull despues de que un git push fue rechazado)
O puede dar conflicto dependiendo de los cambios que se hayan hecho, para resolver esos conflictos hay que ejecutar git status, ver cuales son los archivos marcados como en conflicto y resolverlos (estan marcados claramente dentro del archivo de texto)
Despues de resolver todos los conflictos, se puede hacer un add de update al indice
git add -u
Y entonces commitear
git commit -m 'merged nuevo_branch into master'

Eliminar el branch cuando ya no se use

Para eliminar el branch local
git branch -d nuevo_branch

NOTA: no funciona si el branch que se quiere eliminar es el activo en ese momento, para evitar eso hay que cambiar a otro branch o commit
NOTA2: si el branch no esta integrado a nada, se negara a borarrlo a no ser que se use la opcion -D en lugar de -d

Para eliminar el branch remoto
git push origin :refs/heads/nuevo_branch

Links

No hay comentarios:

Publicar un comentario