Mantener actualizada una copia de repositorio
Tags: git, opensource
Published: 2020-06-20 21:12:43

Si eres un contruibuidor 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á represantado con una URL.

El proceso se resume en 3 pasos:

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



## 1. Registrar el respositorio 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 respositorio situado en nuestra cuenta. Podemos asegurarnos de ello ejecutando el comando:

```
git remote -v
```

Esto mostrará algo similar a lo siguiente:

```
origin URL_REPOSTORIO (fetch)
origin URL_REPOSTORIO (push)
```

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 cuál se encuentra guardada el repositorio.
- `TIPO_ACCION`
  Determina que 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:

```
git remote add NOMBRE_FUENTE URL_REPOSITORIO_ORIGINAL
```

> 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:

```
git remote -v
```

  Obteniendo algo similar a:

```
origin	    URL_REPOSITORIO (fetch)
origin	    URL_REPOSITORIO (push)
upstream	URL_REPOSITORIO_ORIGINAL (fetch)
upstream	URL_REPOSITORIO_ORIGINAL (push)
```



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

>  Nota, éste proceso se puede llevar a cabo en cualquier rama del proyecto, sin emabrgo, se recomienda realizrlo 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:

```
git fetch NOMBRE_FUENTE
```

Esto descargará 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 índicados 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:

```
git merge NOMBRE_FUENTE/NOMNRE_RAMA
```

> 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:

```
git push
```

>  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 preocupate 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, siente con libertad de expresarla en los comentarios.