GitHub es la red social más grande de programadores, donde se encuentran hospedados gran parte de los proyectos de software libre y código abierto, por lo tanto es necesario saber como actuar para realizar colaboraciones tanto a proyectos de programación, como a otros tipos de proyectos.
En esta guía me limitaré solo a un proyecto de programación, pero el proceso sería casi similar para otros tipos de proyectos.

Para comenzar hay que tener listo nuestro entorno con Git, y seleccionar el proyecto al cual deseamos hacer un aporte, en mi caso seleccioné MongoEngine un ODM de MongoDB para Python.
Fork del repositorio
El primer paso de todo este proceso es "forkear" el repositorio, vamos a la dirección del repositorio.

Presionamos el botón Fork.

Y ya tenemos el repositorio en nuestra cuenta.

Esto lo realizamos, porque la mayoría de las veces no tenemos permiso directo a los repositorios de los proyectos, por lo tanto debemos trabajar en un fork del repositorio para luego enviar los cambios al repositorio original.
Empecemos a trabajar!
Clonar el repositorio
Luego de tener el repositorio en nuestra cuenta, seleccionamos la dirección SSH del repositorio y lo clonamos con las herramientas de Git.

Código :
$ git clone [email protected]:yograterol/mongoengine.git
Nos vamos a la carpeta que se genera, en este caso mongoengine y verificamos la URL del repositorio.
Código :
$ cd mongoengine $ git remote -v origin [email protected]:yograterol/mongoengine.git (fetch) origin [email protected]:yograterol/mongoengine.git (push)
Al ingresar a la carpeta nos encontramos en la rama master, es importante mencionar que se recomienda no hacer los cambios en la rama master, sino utilizar otras ramas, para comodidad y evitar perder otros cambios; el master se mantendrá solo para recuperar los últimos cambios del repositorio original.
Otra cosa que debemos hacer antes de realizar modificaciones es agregar la URL del repositorio original del proyecto, que si no tienes permiso entonces será de solo lectura.
Código :
$ git remote add upstream https://github.com/MongoEngine/mongoengine.git
Verificamos.
Código :
$ git remote -v origin [email protected]:yograterol/mongoengine.git (fetch) origin [email protected]:yograterol/mongoengine.git (push) upstream https://github.com/MongoEngine/mongoengine.git (fetch) upstream https://github.com/MongoEngine/mongoengine.git (push)
Actualizar la rama master
Como la utilidad de nuestra rama master es mantener todos los cambios del repositorio original, debemos actualizarla antes de comenzar a trabajar, así tendremos los cambios que se hagan a último minuto.
Ejecutamos:
Código :
$ git pull -r upstream master
Crear una rama
Se recomienda siempre hacer una rama desde master para realizar cambios y proponer su inclusión en el repositorio oficial.
Para crear una rama usamos la opción checkout de git.
Código :
git checkout -b feature-progressive-jpeg
Mi ejemplo lo baso en un problema reportado en GitHub para el almacenamiento de imágenes JPEG, por lo tanto llamo la rama con un nombre similar para lo que deseo hacer, esta no es una regla, solo lo uso para mantener un orden.
Codeando
En este paso realizamos todos los cambios que se desea hacer al proyecto, y verificamos con git status los archivos que hemos modificados.
Código :
$ git status # On branch feature-progressive-jpeg # 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: mongoengine/fields.py # no changes added to commit (use "git add" and/or "git commit -a")
Agregamos los archivos y hacemos un commit. Lo normal es ejecutar dos comandos.
Código :
$ git add . $ git commit -m "mensaje"
Pero si te gusta ahorrar caracteres, usa git commit -a -m "Mensaje", de esa manera agregas los archivos modificados y realizas el commit. Algo importante, el mensaje que uno coloque debe ser lo más descriptivo posible; NO colocar algo como "Cambio de archivo" o "Modificación simple", en este tipo de proyectos exigen ser detallados.
En mi caso este es mi commit.
Código :
$ git commit -a -m "Feature for progressive JPEG. Issue #486" [feature-progressive-jpeg 341e1e7] Feature for progressive JPEG. Issue #486 1 file changed, 14 insertions(+), 4 deletions(-)
Después de realizar el commit uno debe hacer el push hacia nuestro repositorio indicando la URL de nuestro repositorio y la rama que hemos trabajado.
Código :
$ git push origin feature-progressive-jpeg Counting objects: 7, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 578 bytes | 0 bytes/s, done. Total 4 (delta 3), reused 0 (delta 0) To [email protected]:yograterol/mongoengine.git * [new branch] feature-progressive-jpeg -> feature-progressive-jpeg
Revisamos nuestro repositorio en GitHub y este es el resultado:

Hacer un Pull Request
El último paso para que nuestro aporte se haga efectivo en el repositorio es enviar un Pull Request y esperar a que el encargado del repositorio lo revise, acepte y mezcle en la rama correspondiente a la versión del software.

Hacemos click en "Compare & Pull Request", nos llevará a otra página donde podremos detallar nuestro Pull Request.

Si todo está bien, realizamos el envío con el botón "Send Pull Request".
Y felizmente veremos lo siguiente.


¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Cristian Hernandez el 27 de Febrero de 2014
Por Juank el 15 de Agosto de 2014
Por Ruben el 08 de Enero de 2016