Compartir y actualizar proyectos en git

Enviar o recibir cambios en git a servidores online o a servicios como Github o Bitbucket

En los dos artículos anteriores: uso básico de git y ramas y uniones en git, hemos realizado todos los cambios y procesos en nuestro servidor local. Para colaborar con otros desarrolladores, los cambios se suben a un servidor al que ellos tengan acceso también, y así se sincronizan los proyectos.

Cuando tienes un repositorio git en un servidor o en sitios como Github o Bitbucket, puedes enviar los cambios que has hecho de forma local al repositorio remoto (git push) o recibir los cambios que hay en esos repositorios online en tu repositorio local (git fetch o git pull).

Los cambios no tienen por qué corresponder a ningún commit. Normalmente se suelen hacer una serie de commits localmente, se reciben (fetch o pull) los cambios del servidor online, se unen y finalizan los cambios y se envían de vuelta servidor (push).

Listar, añadir y eliminar repositorios remotos, git remote

Los repositorios son iguales en cualquier servidor local, remoto o Github, los cambios simplemente se sincronizan de unos a otros.

Git almacena un alias para cada URL de los repositorios remotos en los que poder hacer cambios. Con el comando git remote se muestra la lista con los alias de los repositorios remotos:

git remote

Si tu repositorio es clonado, Git añade la URL del repositorio que has clonado bajo el nombre origin. Si escribes el comando con -v se muestra también la URL de cada alias:

git remote -v

Si quieres compartir un repositorio creado de forma local, puedes añadirle un remoto. Para ello se emplea el código git remote add [alias] [url], esto añade una URL donde se podrá subir el repositorio con el alias escogido. Por ejemplo para añadir un remoto a Bitbucket:

git remote add bitbucket https://nombreusuario@bitbucket.org/nombreusuario/proyecto.git

La URL la proporciona Bitbucket. El nombre del alias es personalizable, pero se suele utilizar origin. Así como en las ramas la rama master es la que se crea por defecto al crear un repositorio, cuando clonas un proyecto se crea por defecto el nombre origin como alias.

Puedes eliminar un alias remoto con el siguiente comando:

git remote rm origin

Para renombrar un alias remoto se utiliza:

git remote rename [old-alias] [new-alias]

También puedes actualizar una URL de un alias:

git remote set-url origin https://nombreusuario@bitbucket.org/nombreusuario/proyecto.git

Recibir actualizaciones de repositorios remotos, git fetch y git pull

Se pueden emplear dos comandos para actualizar un repositorio:

  • git fetch sincroniza el proyecto local con el remoto, recibe los datos que no se tienen localmente y señala donde estaba cada rama en ese repositorio cuando se ha sincronizado. Estas ramas remotas son iguales que las ramas locales pero no se pueden eliminar, aunque puedes unirlas (merge), ver los cambios (diff), ver históritos (log)... Lo ideal es hacer las acciones necesarias antes de sincronizar.
  • git pull es como git fetch seguido de git merge en la rama a la que ese remoto está ligado con la actual. Es un comando más rápido que utilizar fetch y merge, aunque a veces puede dar algún problema.

Por ejemplo si quieres actualizar tu repositorio actual con el remoto, primero se haría git fetch [alias] para recibir los datos que no tienes actualizados, y después git merge [alias]/[branch] para unirlos a la rama actual.

Enviar actualizaciones a repositorios remotos, git push

Para enviar los commits que hayas realizado en tu repositorio local se utiliza el comando git push [alias] [branch]. Por ejemplo:

git push origin master 

Tus commits se envían desde tu repositorio master al repositorio remoto origin, y si alguien clona el proyecto ahora, tendrá tus nuevos commits y el historial anterior.

Puedes enviar una rama que hayas creado también, simplemente con _git push origin [rama]. _Cuando alguien haga git fetch, verá esa rama nueva, y si quiere puede incluirla en su repositorio para modificarla con git merge origin/rama.

Si da la casualidad de que tu y otro usuario clonais en un momento dado y enviáis commits de la misma rama, si llegan antes sus commits, los tuyos no serán aceptados. Git acciona el comando git log en la rama en la que intentas hacer commit e intenta incluir los cambios si es posible, pero si concluye que estás desactualizado, rechaza tus commits. Entonces tendrás que hacer fetch, merge y push de nuevo, teniendo así en cuenta los cambios del otro usuario.

Fuentes: gitref.org, git-scm.com