Abril 29, 2014
enzo
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.
- 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
- 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.