Flujo básico de trabajo con Git

30 Sep
Published by fernando.villalobos in

Tags 

Git, Github

Recientemente tuve un (re)encuentro con SVN, y después de tantos años de no usarlo (y estar acostumbrado a git) me hizo recordar el proceso que pasé para migrar de uno al otro, sobre todo el trabajo que me costó asimilar la simplicidad de git. Es por esto que pongo el presente post con la finalidad de explicar el flujo de trabajo cotidiano que nos toparemos con un repositorio git; ojalá y sea más de uno el que decida hacer el brinco de SVN a git. :D

Inicializar proyecto

Tenemos dos casos posibles, un proyecto ya existente en un repositorio o un proyecto que iniciamos desde cero.

Proyecto ya existente

Descargar la copia de trabajo del proyecto se realiza con el siguiente comando

$ git clone url_al_repo

Se creará un directorio con el nombre del repositorio.

$ cd repo

Con esto tendremos descargada (y configurada) nuestra copia local lista para poder realizar cambios.

Proyecto nuevo

En el caso de que tengamos un directorio que no esté bajo control de versiones, tenemos que decirle a git que lo inicialice (en el siguiente ejemplo, nuestro servidor git se encuentra en github)

$ git remote add origin https://github.com/username/Hello-World.git

Agregar cambios

Ya en nuestro directorio de trabajo, para visualizar los cambios ocurridos desde la última actualización corremos el siguiente comando

$ git status

Ésto nos mostrará una lista de archivos pendientes para actualizar, como la siguiente:

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   app/views/layouts/application.html.haml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       app/views/alumnos/asignar.html.haml
no changes added to commit (use "git add" and/or "git commit -a")

En este caso, contamos con un archivo modificado y uno nuevo. Tenemos que indicarle a __git __ qué archivos son los que deseamos agregar a nuestro cambio (commit). Existen dos formas:

Agregar todos los cambios (archivos nuevos y existentes)

$ git add -A

El parámetro -A agregará TODOS los archivos al commit; hay que tener cuidado con esta opción ya que puede darse el caso en que agreguemos archivos no deseados.

Agregar archivos seleccionados

Podemos agregar a mano los archivos que deseamos agregar al commit de la siguiente forma

$ git add app/views/layouts/application.html.haml app/views/alumnos/asignar.html.haml

Generar cambio (commit)

Ya tenemos la lista de archivos que deseamos agregar al repositorio, necesitamos generar un commit

$ git commit -m "Descripción del cambio"

Si no usamos el parámetro -m, git abrirá nuestro editor de texto para que ingresemos nuestro mensaje de commit.

NOTA: Alguien dirá ¿Un commit? Necesito actualizar primero mi copia de trabajo. En las siguientes líneas verán cómo es que git maneja el flujo de actualización y resolución de conflictos.

Actualizar copia de trabajo y resolución de conflictos

Nuestros cambios ya están seguros; ahora necesitamos actualizar la copia de trabajo con el siguiente comando

$ git pull origin master

Donde master es la rama a la cuál queremos agregar nuestros cambios. Lo que hará este comando es lo siguiente (en caso de existir cambios):

  1. Generará un nuevo commit en el historial para incluir la mezcla de mis cambios con los cambios del repositorio, y
  2. En caso de existir conflictos, marcará los archivos con CONFLICT y los dejará (temporalmente) fuera de la mezcla hasta ser resueltos

Resolución de conflictos

Si nos encontramos en el escenario 2, __git __ nos mostrará un mensaje indicándonos los archivos con conflicto:

Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Automatic merge failed; fix conflicts and then commit the result.

Debemos solucionar los conflictos ANTES de continuar; git agregará comentarios para indicarnos los bloques de código en conflicto como en el siguiente ejemplo:

<<<<<<< HEAD
    hola
============
    Hola
>>>>>>> rama

Pues bueno, a arreglar los conflictos; modificamos el código solucionando los errores y ELMINANDO LOS COMENTARIOS.

NOTA: Podemos utilizar el comando git mergetool para solucionar los conflictos con ayuda de una herramienta de merge (si tenemos una instalada, git la detectará y lanzará).

Por último, agregamos nuestro archivo corregido a la lista de cambios y lo commiteamos:

$ git add app/views/layouts/application.html.haml
$ git commit

Subir mis cambios al repositorio

Ya tenemos nuestro proyecto actualizado a la última versión y mezclados los últimos cambios en nuestra copia local, estamos a un paso de subir nuestros cambios al server; el comando push hará el truco:

$ git push

¡Hemos terminamo! El repositorio ahora tiene nuestros cambios y nadie salió herido. :)

Espero que esta información les sea de utilidad. Como comentaba, éste es el flujo de trabajo básico en git. Existen cuestiones más complejas (como branching, merge, PR) que no fueron abordadas en este post, pero se pueden abordar más adelante. ;)

También dejo la liga a una cheatsheet que muestra los comandos de git y un gráfico con el flujo de trabajo.