¿PARA QUE QUIERO REALIZAR UN FORK?
Una de las dudas que siempre surge entre los usuarios primerizos en el ambiente de controlar versiones de sus archivos es ¿Para que me sirve hacer un Fork de algún repositorio externo?, respondiendo a esa pregunta: Hacerle ‘Fork’ a un repositorio significa ‘copiarlo’, ¿porqué razón habría de copiar un repositorio?, bueno, la razón de copiar el repositorio es porqué nos va a permitir experimentar libremente sin afectar al proyecto original, obviamente porque nuestro fork es una copia, que se encontrará en nuestra cuenta de github, o algún otro servicio de alojamiento de repositorios.
Por lo general, las copias se utilizan para proponerle cambios en el proyecto de alguna otra persona o equipo de trabajo, o para utilizar el proyecto de otra persona como punto de partida para nuevas ideas, recuerda que ‘la rueda ya existe’ no tendría caso volver a crearla, mejor en base a ella puedes desarrollar una infinidad de soluciones.
REALIZANDO UN FORK A UN REPOSITORIO
Para poner en práctica este concepto vamos a hacerle fork al repositorio de uno de mis estudiantes, dónde se están realizando una serie de proyectos, en este apartado haremos un FORK al repositorio NOTICIAS.
Nota: Para llevar a cabo esto, primero necesitamos iniciar sesión en nuestra cuenta de Github, si no tienes una cuenta, antes debes crearla.
Una vez que iniciaste sesión, procedes a buscar un repositiorio, en mi caso haré un fork de este repositorio Noticias, que tiene uno de mis estudiantes. Para esto nos dirigimos al repositorio de JoseManuel083/Noticias.
En la página principal de este repositorio veremos que en la parte superior derecha hay un botón con la opción Fork. Lo presionamos y con esto empezaremos a realizar un Fork de ese repositorio hacia nuestra cuenta de Github.
En algunos casos en los que tengamos una cuenta personal asociada a alguna organización, Github nos pedirá que especifiquemos si el Fork se hará sobre nuestra cuenta personal o en alguna de las cuentas de organizaciones a las que pertenecemos.
Una vez que este proceso haya terminado, habremos copiado ese repositorio a nuestra cuenta, así que luego de esto veremos un encabezado parecido al siguiente:
Como podemos ver en la imagen anterior, Github nos indica que ahora tenemos en nuestra cuenta un nuevo repositorio llamado Noticias y vemos que debajo dice ‘forked from JoseManuel083/Noticias’ (que fue copiado desde el repositorio original).
TRABAJANDO CON UN REPOSITORIO FORKED
Por lo general, cuando se hace Fork de un repositorio se realizan modificaciones sobre este repositorio para manipular la versión original sin causar problemas, es como tener nuestro propio ‘patio de juegos’ para poder hacer lo que deseemos con el proyecto.
Pero a veces queremos hacer mejoras sobre ese proyecto y enviar nuestras mejoras al dueño original para que las implemente ó simplemente queremos seguir teniendo las actualizaciones del proyecto original.
Esta vez nos enfocaremos en cómo seguir teniendo las actualizaciones del proyecto original
Mediante este procedimiento podremos mantener actualizado nuestro repositorio forked desde el repositorio original, realizando los siguientes pasos:
CLONANDO NUESTRO REPOSITORIO FORKED
Con la siguiente instrucción clonaremos nuestro nuevo repositorio Forked, y nombraremos clonando_forked_noticias a la carpeta que almacenará nuestro proyecto:
git clone https://github.com/angelslv/Noticias.git clonando_forked_noticias
Como podemos apreciar, estamos clonando nuestro repositorio forked, y no el de la cuenta del estudiante, esto es algo que debemos de tener en cuenta, debido a que nuestro repositorio es una copia del repositorio original de JoseManuel083/Noticias.
Una vez que terminamos de clonar nuestro nuevo repositorio, ingresamos a la carpeta clonando_forked_noticias.
cd clonando_forked_noticias
Y luego debemos indicarle a git que nuestro repositorio tiene una ubicación remota, en nuestro caso la url de la ubicación remota original es: https://github.com/JoseManuel083/Noticias.git, y la agregamos a nuestro repositorio local escribiendo el siguiente comando:
git remote add upstream https://github.com/JoseManuel083/Noticias.git
Con esto le estamos indicando a git que agregue la siguiente ubicación remota y la llamamos upstream. Upstream es un término en inglés que se puede interpretar como “principal” o “producción”, pero si deseamos le podemos cambiar de nombre, ya que el nombre upstream sólo se usa por estándar y no es que sea algo obligatorio.
Luego de esto, ya estamos listos para poder actualizar nuestro repositorio desde la ubicación remota original, escribiendo el siguiente comando:
git fecth upstream
De esta forma obtenemos todas las ramas actualizadas desde esa ubicación remota. Pero aún no tendremos los cambios en nuestra rama master o la rama que estemos usando actualmente en nuestro repositorio forked.
Para lograr eso tenemos que hacer un merge o rebase para poder fusionar los nuevos cambios del proyecto principal (original) con nuestro repositorio forked (copia).
Digamos que estamos trabajando en la rama master, entonces debemos asegurarnos que estamos en la rama master, caso contrario ingresamos a nuestra rama master, así:
git checkout master
Y ahora que nos encontramos en nuestra rama master, fusionamos los cambios del proyecto principal con nuestro proyecto con el siguiente comando:
git merge upstream/master
Como actualmente nos encontramos en nuestra rama master local, con esta instrucción le estamos diciendo a git, que fusione los cambios desde la rama upstream/master sobre nuestra rama local master.
En cambio si usas rebase en vez de merge, entonces la instrucción que debes realizar es la siguiente:
git rebase upstream/master
De esa forma, hemos aprendido a utilizar ‘FORK’ desde Github, para comenzar a trabajar con proyectos más grande.
Aclarando diferencias entre Git Clone y Fork de Github
Con git clone podemos copiar el código de un repositorio de forma local, pero no estará conectado al repositorio de origen.
Con Fork podremos crear una copia en remoto de un repositorio git en nuestra cuenta de GitHub y de esa forma sera mas fácil clonar de forma local para hacer pull y push de los cambios realizados.
Para mas informacion puedes verificar la documentacion oficial