Cómo sincronizar repositorios forkeados con Git

Un día nos creamos cuentas en GitHub y en BitBucket, forkeamos un proyecto, hicimos clone de nuestra copia; y todo anduvo bien. Pero otro día, el proyecto original avanza y nuestro código queda desactualizado.

En lugar de tener que borrar nuestro fork y crear uno nuevo, vamos a sincronizarlo con el proyecto original.

Para el ejemplo, voy a tomar mi desactualizada copia de Magento2.

Fork de Magento2 en GitHub

Lo primero será ejecutar, dentro del directorio local del proyecto, el siguiente comando:

git remote -v

Lo cual nos mostrará los repositorios remotos de nuestro repositorio:

origin git@github.com:barbanet/magento2.git (fetch)
origin git@github.com:barbanet/magento2.git (push)

Ahora, agregamos el upstream para nuestro repositorio, que es el repositorio original desde el cual hicimos el fork.

Siguiendo mi ejemplo, ejecutamos:

git remote add upstream git@github.com:magento/magento2.git

Si volvemos listar los repositorios remotos, tendríamos que ver:

origin git@github.com:barbanet/magento2.git (fetch)
origin git@github.com:barbanet/magento2.git (push)
upstream git@github.com:magento/magento2.git (fetch)
upstream git@github.com:magento/magento2.git (push)

Hasta acá sólo agregamos los repositorios con los cuales vamos a sincronizar. Ahora toca actualizar nuestra copia local.

Actualizamos nuestra copia de upstream.

git fetch upstream

Una vez terminado, habremos descargado la última versión de ese repositorio.

remote: Counting objects: 21970, done.
remote: Compressing objects: 100% (10506/10506), done.
remote: Total 21970 (delta 11123), reused 17158 (delta 8684)
Receiving objects: 100% (21970/21970), 9.15 MiB | 354 KiB/s, done.
Resolving deltas: 100% (11123/11123), done.
From github.com:magento/magento2
* [new branch] master -> upstream/master

Ahora cambiamos a nuestro branch master.

git checkout master

Y para finalizar, mergeamos el branch master de upastream con nuestro master.

git merge upstream/master

Cuando el merge haya terminado (la lista de cambios de mi ejemplo ha sido extremadamente extensa como para copiarla), nuestro código habrá sido sincronizado.

Si todo funcionó correctamente, luego nos quedará hacer el push de nuestro branch master.

git push origin master

El resultado sería algo así:

Counting objects: 26206, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8073/8073), done.
Writing objects: 100% (21977/21977), 6.70 MiB | 60 KiB/s, done.
Total 21977 (delta 12865), reused 20234 (delta 11123)
To git@github.com:barbanet/magento2.git
67519d4..328ef8d master -> master

Sólo para reforzar la confirmación del proceso, si voy a mi fork en GitHub, se puede ver que el código ha sido actualizado correctamente.

Fork de Magento2 actualizado