Una de las características más usadas de git es su capacidad de facilitar la colaboración en el desarrollos de proyectos basados en texto como programas o documentos importantes. Para lograr esto git usa un concepto basado en repositorios remotos, es decir las carpetas que tenemos con nuestros proyectos e historia de los mismos pueden ser almacenados en equipos remotos.
Originalmente en git estos estos remotos pueden relacionarse en un grafo arbitrario sin embargo, vamos a cubrir en este post un servicio de repositorios remotos centralizado muy popular llamado github. Este servicio almacena repositorios y ofrece herramientas que facilitan realizar proyectos de manera colaborativa.
Lo primero que debemos hacer es visitar https://github.com crear una cuenta y crear un repositorio, el sitio web ofrece dos opciones,
README
o una licencia.La primera opción es útil para cuando ya tenemos un repositorio preparado y solo queremos almacenarlo remotamente. Cuando tomamos esta opcion vamos a nuestra máquina y ejecutamos los siguientes comandos para inicializar el repositorio remoto:
# Desde nuestro repositorio
git remote add origin https://github.com/<username>/<reponame>.git
git push -u origin master
La segunda opcion es muy útil cuando aun no tenemos un repositorio
inicializado, si usamos esta opción es bueno tomar ventaja de las opciones para
agregar un archivo .gitignore
y un archivo LICENCE
. Si tomamos esta
opción vamos a nuestra máquina y ejecutamos los siguientes comandos para
inicializar,
# Desde nuestra carpeta para código
git clone https://github.com/<username>/<reponame>.git
cd <reponame>
En ambos casos un remoto llamado origin es agregado a nuestra lista de
remotos que podemos ver usando el comando git remote -v
.
Bien, ahora que tenemos nuestro repositorio remoto, necesitamos mantener los cambios sincronizados entre los distintos repositorios, local y remoto.
Para lograr esto, primero, hagamos un ejemplo,
# Desde nuestro repositorio
# Hacemos algunos cambios
git add <archivos cambiados>
git commit -m "Describo los cambios"
Luego vamos directamente al repositorio en github la url
debe ser algo como https://github.com/<username>/<reponame>
si inspeccionamos
los cambios recientes nos daremos cuenta de que los cambios recientemente
realizados no se encuentran… que contrariedad.
Este ni ningún otro servicio de repositorios remotos va a mantener sincronizados los repositorios automáticamente, git predata y además tiene una filosofía diferente a algo como dropbox o google drive. Los repositorios tienen que ser sincronizados manualmente, para publicar los cambios recientemente realizados, debemos usar el comando:
# Desde nuestro repositorio
git push origin master
Donde origin
es el nombre del remoto y master
es el nombre de la rama
remota. Recuerden git push -u origin master
, al haber usado esa bandera -u
que es un nombre corto para --set-upstream
la rama local master
se há
asociado a la rama remota origin master
así que este comando se puede
simplificar y simplemente escribir,
# Desde nuestro repositorio
git push
Git, permite tender un grafo arbitrario de remotos, pero cuando usamos github este tiende a convertirse en un lugar centralizado normalmente, en un equipo de desarrollo, cada miembro mantiene sus cambios sincronizados con github, y obtine los cambios de sus compañeros desde github tambien, para leer cambios que se encuentran en el remoto y no se encuentran aun en nuestro repositorio local usamos el comando
# Desde nuestro repositorio
git pull origin master
# Que puede ser simplificado a
git pull
Mantener los repositorios sincronizados usando push
y pull
de manera
asíncrona puede ocacionar conflictos, estos se generan cuando se quiere
realizar un pull
y los cambios que se encuentran en el remoto y los cambios
locales que no se encuentran en el remoto modifican las mismas lineas de un
archivo. Git hace muy fácil combinar cambios controlados semánticamente entre
distintas versiones de un repositorio, sin embargo, git requiere intervención
humana en caso de que se presenten conflictos, y aún así, git hace facil
identificarlos y resolverlos.
Para terminar, si se usan ramas, para evitar conflictos entre versiones, o simplemente para mantener dos versiones de un proyecto simultaneamente en el mismo repositorio hay que tener cuidados especiales, cuando se va a hacer push por primera vez de una nueva rama se puede hacer:
# Desde nuestro repositorio
git checkout -b nueva-rama
# Opcionalmente realizar cambios y commit
git push -u origin nueva-rama
La bandera -u
va a asociar las ramas local y remota para que luego se pueda
hacer simplemente git push
o git pull
desde esta rama.
Para traer nuevas ramas desde un repositorio remoto hacemos,
# Desde nuestro repositorio
git pull
git checkout nueva-rama-remota
las versiones recientes de git, van a detectar que la nueva-rama-remota
no
existe en nuestro repositorio local y luego la va a crear y asociar, en
versiones antiguas de git el comando anterior arrojará un error y lo correcto
sería crear y asociar la rama manualmente,
# En versiones antiguas de git
# Desde nuestro repositorio
git pull
git checkout -b nueva-rama-remota --track origin/nueva-rama-remota
un poco más largo, pero no mucho más complicado.