Mantener actualizada una copia de repositorio


Si eres un contribuidor activo de algún proyecto open source te darás cuenta de que éste después de que algún pull request es aceptado, éste no se sincroniza atomáticamente con la copia de tu proyecto, lamentablemente éste proceso debe realizarse de manera manual, pero no te preocupes en este blog te enseñaremos a hacerlo.

Nota: Un repositorio es un espacio en el que se almacenan los archivos de un proyecto. En git un repositorio está representado con una URL.

El proceso se resume en 3 pasos:

  1. Registrar el repositorio original como fuente de datos.
  2. Obtener los cambios del repositorio original.
  3. Combinar ramas entre repositorios.
  4. Subir los cambios.

 

1. Registrar el repositorio original como fuente de datos.

Al realizar el clon de algún proyecto, por default tendrémos registrado una fuente de origen, esta fuente apuntará a la url del repositorio situado en nuestra cuenta. Podemos asegurarnos de ello ejecutando el comando:


Esto mostrará algo similar a lo siguiente:

En dónde la salida del comando se compone de 3 elementos:

  • NOMBRE_FUENTE Es un nombre que nosotros le indicamos a git para poder utilizar esta fuente de datos.
  • URL_REPOSITORIO Es la url en la cual se encuentra guardada el repositorio.
  • TIPO_ACCION Determina qué tipos de "movimiento" puede tener esa fuente. Solo existen 2 tipos de acción: descarga ( fetch) y subida (push).

La manera de lograr sincronizar nuestro proyecto con el proyecto original, es agregar la url del repositorio como una fuente de datos adicional. Ésto se logra con la ayuda del comando:

Nota: El NOMBRE_FUENTE puede ser cualquier cosa, sin embargo, por convención suelen utilizarse las palabras origin para hacer referencia a la URL de nuestro repositorio y upstream para la url del repositorio original.

Al ejecutar esta línea agregamos una nueva fuente de datos a nuestro repositorio, podemos consultar los cambios ejecutando nuevamente:

Obteniendo algo similar a:

 

2. Obtener los cambios más reciente del repositorio original.

Nota, éste proceso se puede llevar a cabo en cualquier rama del proyecto, sin embargo, se recomienda realizarlo sobre la rama principal (usualmente master) para obtener los últimos cambios estables del proyecto.

Si necesitas cambiar a la rama principal, utiliza el comando git checkout master

Una vez que tenemos una fuente adicional de datos, podemos utilizar el NOMBRE_FUENTE para obtener los cambios más recientes de cualquiera de nuestros repositorios, por defecto git utilizará el repositorio de origen, pero podemos cambiarlo al específicarlo como primer argumento del comando fetch:

Esto descargara las referencias del repositorio original sobre NOMBRE_FUENTE/RAMA_ACTUAL. Es decir, que los archivos aún no estarán actualizados en nuestro proyecto, para aplicar los cambios indicados en las referencias de NOMBRE_FUENTE/RAMA_ACTUAL debemos combinar las ramas.

3. Combinar ramas entre repositorios.

Para combinar las ramas, basta con ejecutar un solo comando:


Nota: Este proceso no suele marcar ningún error, dado que los cambios que subiste ya fueron previamente aprobados. Pero en caso de tener algún problema, te recomiendo revisar si existen cambios locales en tu proyecto posterior a tu PR, en caso de haberlos deberías deshacerlos antes y/o crear un nuevo pull request con los cambios.

 

4. Subir los cambios.

Finalmente debemos subir todos los cambios a nuestro repositorio:


Nota: si al hacer push marca conflictos, esto quiere decir que el proyecto original modificó la historia de git, por ende, tendrás que forzar los cambios con: git push --force

 

Conclusión

Cómo se mencionó en un inicio, el proceso de sincronización de repositorios no es de manera automática, en realidad ésto tiene muchas ventajas cuando eres contribuidor ya que no tienes que preocuparte por los cambios del repositorio hasta que logras terminar tus cambios y/o hasta que necesitas hacer más cambios sobre el proyecto. 

Espero que esta guía te haya servido y si tienes algún comentario o duda, sientete con libertad de expresarla en los comentarios.