Esta es una pequeña guía aprenderas lo suficiente de git para integrarte a tu equipo de desarrollo.

¿Que es git?

Git es un sistema de control de versión para guardar los cambios en archivos de computadora y coordinar el trabajo de multiples personas en esos archivos [1].

Se usa principalmente para llevar el control del código en el desarrollo de software, pero realmente puede ser usado en cualquier tipo de archivo de computadora.

Eso quiere decir que git nos ayuda a trabajar en equipo en la misma base de código, sin tener que estar en la misma computadora o en el mismo lugar.

¿Que hace diferente a git de otros sistemas de control de versión?

La principal diferencia entre git y la mayoría de los otros sistemas de control de versión, es que los otros sistemas almacenan la información como una lista de cambios en los archivos. Algo similar a la siguiente imagen que muestra un conjunto de archivos y los cambios echos a esos archivos en el tiempo [2].

deltas

En cambio git maneja la información como una serie de “snapshots” o copias de un “mini” sistema de archivos. Cada que guardas el estado de tu proyecto git lo que hace es guardar una copia de tus archivos en ese momento. Para ser eficiente, si un archivo no fue modificado en lugar de copiarlo de nuevo, guarda un enlace a la copia anterior que ya había guardado [2].

snapshots

Esto hace a git algo más parecido a un “mini” sistema de archivos con algunas herramientas increibles construidas en base a él, que a un sistema de control de version convencional [2].

Instalar git

Hay muchas guías para instalar git, puedes usar esta: http://git-scm.com/book/en/v2/Getting-Started-Installing-Git

Iniciar un proyecto

Suponiendo que tu proyecto se llama “miproyecto”

  • Creas la carpeta del proyecto en tu computadora
$ mkdir miproyecto
  • Vas a la carpeta e inicias un repositorio de git
$ cd miproyecto
$ git init
  • Vas a tu editor y creas un archivo README.text (readme driven development?)
  • Agrega el archivo a los cambios que serán persistidos
$ git add README.text
  • Haces tu primer commit
$ git commit -m "Initial commit"
  • Vas a tu cuenta de Github y creas un proyecto con el nombre “miproyecto”
  • Copias el url (que podría ser algo como “git@github.com:bhserna/miproyecto.git”)
  • Asignas el remote en tu proyecto
$ git remote add origin git@github.com:bhserna/asdf.git
  • Y envias tu proyecto a github
$ git push -u origin master
  • Ahora puedes compartir ese proyecto con tu equipo =)

Unirte a un proyecto ya existente

Imagina que alguien ya creo el proyecto “miproyecto” y vas a empezar a colaborar. Lo primero que tienes que hacer es bajar el repositorio a tu maquina. Para eso sigues los siguientes pasos:

  • Obten acceso al proyecto en github
  • Copia el url del repositorio de git (que podría ser algo como “git@github.com:bhserna/miproyecto.git”)
  • Clona el repositorio en tu maquina (yo usare este url “git@github.com:bhserna/miproyecto.git” pero tu pon el que copiaste)
$ git clone git@github.com:bhserna/miproyecto.git

Agregar/modificar algo en un proyecto.

Para este entonces el proyecto “miproyecto” ya esta en github y en tu máquina, esto es lo que tienes que hacer para agregar una modificación (asumiendo que alguien más del equipo es el que aceptará los cambios).

Nota: Esto es una forma de hacer el github flow. Si quieres saber más puedes visitar la guia de github

  • Ve al branch master (si ya estas en ese branch, git te lo dirá)
$ git checkout master
  • Actualiza tu branch master con el que esta en ‘origin’ (github)
$ git pull origin -p
  • Crea un nuevo branch con un nombre descriptivo (por ejemplo add-title)
$ git checkout -b add-title
  • Has las modificaciones necesarias en tu editor (Pudes poner el encabezado en README.text)
  • Agreaga los cambios que hiciste a los cambios que serán persistidos.
$ git add README.text
  • Persiste tus cambios con un commit
$ git commit -m "adds title to the README file"
  • Sube tu branch a github
$ git push origin add-title
  • Crea un pull request en github describiendo el cambio que hiciste
  • Un compañero podrá ahora integrar tus cambios a master (o pedirá un cambio)

Agregar más cambios a un pull request

Suponiendo que hiciste algunos cambios y creaste un pull request para que alguien más lo aceptara, pero el te dice que antes de unir a master necesitas hacer unos cambios más. Esto es lo que debes de hacer.

  • Ve al branch del pull request (si ya estas en ese branch git te lo dirá)
$ git checkout add-title
  • Has los cambios que te pidieron (por ejemplo agregar un a descripción al readme)
  • Agrega los cambios a los cambios que serán persistidos
$ git add README.text
  • Persite los cambios con un commit
$ git commit -m "some changes in README
  • Envía los cambios del branch a github
$ git push origin add-title

Aceptar un pull request

Cuando otro compañero hizo un cambio en el proyecto y a ti te toca integrar su pull request al branch master.

  • Ve a la página del pull request en github.
  • Reviza que los cambios sean correctos.

Si crees que todo esta bien

  • Da click en el botón de Merge pull request.

Si los cambios no son suficientes o crees que no pueden ser agregados

  • Comenta a tu compañero las razones, para que el pueda agregar más cambios al pull request y que ahora sí puedas integrar sus cambios.

Si github no te permite hacer el marge directamente ya que no aparece el botón para hacer la integracion. Es probable que sea porque git encuentró conflictos que no puede resolver entre el branch actual y master. Para esto tendrás que decirle a tu compañero que resuelva los conflictos con master para que tu puedas integrarlo.

Nota: tú podrías resolver los conflictos, pero normalmente le sería más fácil a la persona que hizo los cambios a integrar.

Resolver conflictos con master

Algunas veces cuando haces un pull request o durante el tiempo en que desarrollaste los cambios en tu branch, fueron agregados cambios en master que tienen conflictos con los cambios que tu estas haciendo. De esto te darás cuenta cuando al hacer el pull request, github te dice que no pude integrar tus cambios a master.

Cuando pasa esto el indicado para resolver esos conflictos eres tú. Y lo que tienes que hacer es lo siguiente:

  • Muevete al branch master en tu computadora
$ git checkout master
  • Actualízalo para que tenga la ultima versión que está en github
$ git pull origin
  • Ahora ve al branch que estabas desarrollando (digamos que es add-title aún)
$ git checkout add-title
  • Dile a git que pase lo que hay ahora en master a tu branch haciendo un nuevo commit
$ git merge master --no-ff
  • Git te dirá que hay conflicto
CONFLICT (content): Merge conflict in README.text
Automatic merge failed; fix conflicts and then commit the result.
  • Ve a tu editor y haz los cambios que te parezcan adecuados

Verás algo como lo siguiente

<<<<<<< HEAD

Pi es igual a 3.14

=======

Pi es igual a 3.1416

>>>>>>> master

Git pone <<<<<<< HEAD para empezar a mostrar lo que hay en el branch en el que tú estas trabajando y pone ======= para mostrar el final y comenzar a mostrar lo que hay en el branch master y al final pone >>>>>>> master para indicar que ahí termino el conflicto.

Con eso tu puedes tomar la decisión de dejar lo que mas convenga para tu proyecto, por ejemplo:

Pi es igual a 3 =)
  • Agrega las modificaciones que hiciste a los cambios que serán persistidos
$ git add README.text
  • Persiste los cambios
$ git commit
  • Vuelve a subir tus cambios a github
$ git push origin add-title
  • Avisa a tu compañero que ya resolviste los conflictos.

Actualizar el branch en el que estoy trabajando

Algunas veces hay dos o más personas trabajando en un mismo branch o alguien del equipo agrego un pequeño cambio en el branch que estabas trabajando. Para poder llevar esos cambios a tu computadora, has lo siguiente:

  • Ve al branch que quieres actualizar (supongamos que se llama mi-super-branch)
$ git checkout mi-super-branch
  • Baja los ultimos cambios para ese branch
$ git pull origin mi-super-branch

Referencias

  1. https://en.wikipedia.org/wiki/Git
  2. https://git-scm.com/book/en/v2