Git, Branching
Branching funciona como caminos diferentes que pueden volver a unirse. En un punto determinado de la historia del proyecto se crean dos caminos que contienen lo mismo pero que pueden cambiar independientemente.
Existe un puntero HEAD que apunta a la rama actual.
La rama mestra se crea por defecto y se llama master.
Antes de cambiar de rama (checkout) es buena idea hacer un commit.
El libro oficial muestra un par de formas de trabajo con ramas, flujos de trabajo.
Cuando se trabaja remotamente se trabaja con ramas, la rama remota por defecto es origin/master, origin siendo el remote y master siendo la rama.
Crear una rama nueva, nueva branch
Para crear una rama nueva se ejecuta el siguiente comando.
git branch nuevaRama
Nota: Esto no carga la rama directamente, solo la crea.
Listar ramas
git branch
Para más información ver libro oficial.
Cargar una rama
Este comando carga el contenido de una rama y hace que el puntero HEAD apunte a dicha rama.
git checkout nuevaRama
Cargar la rama maestra
Este comando carga el contenido de la rama maestra y hace que el puntero HEAD apunte a dicha rama.
git checkout master
Crear rama y cargarla
git checkout -b nuevaRama
Es un atajo que hace lo mismo que:
git branch nuevaRama
git checkout nuevaRama
Merge branches (unificar ramas)
Lo siguiente deja como rama de trabajo a master y sobre esta introduce nuevaRama.
git checkout master # Se carga la rama master estando en otra rama
git merge nuevaRama # Se hace merge de la nuevaRama sobre master
Borrar una rama
Se pueden borrar ramas cuando se desee pero puede ser buena idea hacerlo cuando se planee no usarla más, eso puede ocurrir por ejemplo cuando se trabajo en una rama, se unió al master y ya no tiene sentido tener la rama todavía porque no se va a trabajar más sobre ella.
git branch -d nuevaRama
Remotes, ramas remotas
Obtener rama remota
No muestra los archivos obtenidos solo los obtiene.
git fetch nombreRemote [nombreRama] # Si no se especifica nombreRama obtiene master
Obtener cambios de rama remota
Se obtienen los archivos y luego se mezclan con lo que hay en el directorio de trabajo.
git pull nombreRemote nombreRamaRemote # Si no especifico HEAD me pide una versión
Subir cambios a rama remota
git push nombreRemote nombreRama[:nombreRamaEnServidor] # :nombreRamaEnServidor es opcional y setea el nombre de la rama en el servidor
Tracking Branches, ramas locales que siguen una rama remota
Son ramas que permiten hacer git push
y git pull
sin argumentos, tienen una relación directa con la rama remota. Los siguientes comandos hacen lo mismo: crean una rama local, obtienen la fuente de una rama remota y asocian la rama remota con la local.
git checkout -b nombreRamaLocal nombreRemote/nombreRamaRemote # Forma de creación generica
git checkout --track nombreRemote/nombreRamaRemote # Forma reducida, no se especifica nombre local, Git > v1.6.2
Borrar ramas remotas
Conceptualmente, el siguiente comando hace que se suba una rama local inexistente en una rama remota, lo que hace que se borre la remota.
git push nombreRemote :nombreRama
Conflictos
Para más información sobre cuando se producen conflictos y cómo resolverlos trabajando con branches, ver libro oficial.