Hero

Como sincronizar un repositorio fork con su fuente en Git

Abril 29, 2014

enzo
GIT

Como sabemos GIT es hoy día el sistema de control de versiones mas usado y ni que decir de su porcentaje de uso en proyectos Open Source.

Una de las características mas usadas en Git es el fork que nos permite tomar un proyecto en el que contribuyen muchas personas y hacernos nuestra propia version para nuestros proyecto y así tener el control de agregar o quitar código a nuestro gusto sin tener que pasar por el tedioso proceso de aprobación.

Hasta aquí todo bien, pero nunca se puede comparar el esfuerzo individual con el esfuerzo de una comunidad de desarrollo y al hacer el fork estaríamos perdiendo todas esas contribuciones. Para contrarrestar este problema debemos sincronizar nuestro fork con el repositorio original haciendo uso del upstream que hasta donde se es una funcionalidad que esta disponible en los repositorios públicos de datos como son BitBucket y Github.

  1. Definir fuente de upstream.

Para este ejemplo tomare el repositorio de Plato Tipico en github git@github.com:enzolutions/plato_tipico.git es cual es fork del repositorio Drops-7 git@github.com:pantheon-systems/drops-7.git que es el master de todos los repositorios usados por Pantheon en sus servicios.

Lo primero que debemos hacer es clonar plato típico en nuestra maquina con el siguiente comando.

$ git clone git@github.com:enzolutions/plato_tipico.git
$ cd plato_tipico

Luego verificamos los branch remotos disponibles con el siguiente comando

$ git remote -v
origin	git@github.com:enzolutions/plato_tipico.git (fetch)
origin	git@github.com:enzolutions/plato_tipico.git (push)

Como era de esperarse solo tenemos las url remotas para hacer fetch (pull) y push

Ahora debemos definir la dirección para el upstream como se muestra a continuación.

$ git remote add upstream git@github.com:pantheon-systems/drops-7.git

El comando anterior si no hay ningún error, no retorna nada.

Si tenemos dudas en que haya quedado bien solo debemos verificar las URL remotas como lo hicimos anteriormente

$ git remote -v
origin	git@github.com:enzolutions/plato_tipico.git (fetch)
origin	git@github.com:enzolutions/plato_tipico.git (push)
upstream	git@github.com:pantheon-systems/drops-7.git (fetch)
upstream	git@github.com:pantheon-systems/drops-7.git (push)

Como se puede ver ahora ya tenemos las URLs para fetch y push de upstream

  1. Sincronizar repositorio con upstream.

Ahora debemos obtener la definición de todos branch y tags disponibles con nuestro repositorio de upstream como vemos a continuación.

$ git fetch upstream

La salida variara dependiendo de cada repositorio, como nuestro objetivo es poder traer a nuestro repositorio personal los cambios efectuados en el repositorio upstream, verifiquemos si existe el branch con el que nos queremos sincronizar que podría ser el branch master pero no exclusivamente este branch; Veamos el comando

$ git branch -va | grep master
* master                                               aec08d5 Added modules link, title, entityreference, phone, email and fieldgroup; Fixed
  remotes/upstream/master                              7aeca3e Add function_exists for bulk_file_delete to prevent errors in local development environments

La salida sera los branches master y el comentario de su ultimo commit. Ahora que ya sabemos que en nuestros repositorio de upstream solo debemos realizar un merge

$ git merge upstream/master
Removing modules/pantheon/pantheon_api/pantheon_api.inc
Merge made by the 'recursive' strategy.
..
..
 209 files changed, 7595 insertions(+), 4395 deletions(-)

La salida cambiara en tu caso particular pero sera muy parecida en términos de estructura. Si no tenemos ningún conflicto el merge hará un commit en tu repositorio local y lo único que haría falta seria hacer un push a nuestros repositorio remoto.

$ git push origin master

En caso de algún conflicto deberás resolverlos, hacer un commit y luego el push a tu repositorio remoto.

Espero que haya sido de tu agrado.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.