Repositorios remotos en GitHub
Resumen
Enseñando: 30 min
Ejercicios: 0 minPreguntas
¿Cómo puedo compartir los cambios con otros en la web?
Objectivos
Explica qué es un repositorio remoto y por qué es útil.
Hacer push y pull en un repositorio remoto
Cuando se trabaja en colaboración con otras personas es cuando el sistema de control de versiones alcanza su pleno potencial. Ya hemos visto la mayor parte de las herramientas que necesitamos para ello, tan sólo nos falta ver cómo copiar los cambios realizados de un repositorio a otro.
Sistemas como Git ya nos permiten mover el trabajo realizado entre dos repositorios cualesquiera. Sin embargo, en la práctica es más sencillo establecer uno de ellos como repositorio central y tenerlo en la red en lugar de tu computadora particular. La mayoría de desarrolladores usan servicios de alojamiento en la red, tales como GitHub, BitBucket o GitLab, para alojar ese repositorio central; en la última sección de esta lección exploraremos los pros y los contras de cada uno de ellos.
Empecemos por compartir con todos los demás los cambios que hemos realizado en nuestro proyecto actual. Para ello, ingresa en tu cuenta de GitHub y haz click en el icono que hay en la esquina superior derecha para crear un nuevo repositorio llamado planets
:
Dale a tu repositorio el nombre “planets” y haz click en “Create repository”:
Tan pronto es creado el repositorio, GitHub muestra una página con una URL y algo de información sobre cómo configurar tu repositorio local.
Esto en realidad ejecuta lo siguiente en los servidores de GitHub:
$ mkdir planets
$ cd planets
$ git init
Nuestro repositorio local contiene nuestro trabajo previo en mars.txt
, pero el repositorio remoto en GitHub todavía no contiene ningún archivo:
El siguiente paso es conectar los dos repositorios. Ello se consigue convirtiendo al repositorio en GitHub en un repositorio remoto del repositorio local. La página de inicio del repositorio en GitHub incluye la secuencia de caracteres que necesitamos para identificarlo:
Haz click en el enlace ‘HTTPS’ para cambiar el protocolo de SSH a HTTPS.
HTTPS vs. SSH
Usamos aquí HTTPS porque no necesita ninguna configuración adicional. Si en el curso quieres configurar el acceso mediante SSH, que es un poco más seguro, puedes seguir cualquiera de los excelentes tutoriales que existen en GitHub, Atlassian/BitBucket y GitLab (este último con capturas animadas de pantalla).
Copia dicha URL desde el navegador, ve al repositorio local planets
y ejecuta allí este comando:
$ git remote add origin https://github.com/vlad/planets.git
Asegúrate de usar la URL de tu repositorio en lugar de la de vlad: la única diferencia debería ser tu nombre de usuario en lugar de vlad
.
Podemos comprobar que el comando ha funcionado bien ejecutando git remote -v
:
$ git remote -v
origin https://github.com/vlad/planets.git (push)
origin https://github.com/vlad/planets.git (fetch)
El nombre origin
es un apodo local para tu repositorio remoto. Se puede usar cualquier otro nombre si se desea, pero origin
es la elección más habitual.
Una vez seleccionado el apodo local origin
, el siguiente comando enviará los cambios realizados en nuestro repositorio local al repositorio en GitHub:
$ git push origin master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 821 bytes, done.
Total 9 (delta 2), reused 0 (delta 0)
To https://github.com/vlad/planets
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
Proxy
Si la red a la que estás conectado usa un proxy es posible que tu último comando fallara con el siguiente mensaje de error: “Could not resolve hostname”. Para solucionarlo es necesario informar a Git sobre el proxy:
$ git config --global http.proxy http://user:password@proxy.url $ git config --global https.proxy http://user:password@proxy.url
Si después te conectas a otra red que no usa un proxy es necesario decirle a Git que deshabilite el proxy:
$ git config --global --unset http.proxy $ git config --global --unset https.proxy
Gestores de contraseñas
Si tu sistema operativo tiene un gestor de contraseñas configurado,
git push
intentará usarlo cuando necesite un nombre de usuario y contraseña. Al menos ese es el comportamiento por defecto para Git.language-bash en Windows. Si quieres que haya que introducir el nombre de usuario y contraseña en la terminal, en lugar de usar el gestor de contraseñas, hay que ejecutar el siguiente comando en la terminal antes de lanzargit push
:$ unset SSH_ASKPASS
A pesar de lo que se podría deducir por el nombre, git usa
SSH_ASKPASS
para todas las peticiones de credenciales, tanto si se está usando git vía SSH como si se está usando vía https, por lo que es posible que quieras deshabilitarlo en ambos casos conunset SSH_ASKPASS
.Otra alternativa es añadir
unset SSH_ASKPASS
al final de tu~/.bashrc
para que git use por defecto la terminal para los nombres de usuario y las contraseñas.
Nuestros repositorios local y remoto se encuentran ahora en el siguiente estado:
La opción ‘-u’
En la documentación puedes ver que en ocasiones se usa la opción
-u
con el comandogit push
. Esta opción es sinónimo de la opción--set-upstream-to
para el comandogit branch
y se usa para asociar el branch actual con un branch remoto, de modo que el comandogit pull
pueda usarse sin argumentos. Para hacer esto simplemente ejecutagit push -u origin master
una vez que el repositorio remoto haya sido creado.
También podemos hacer pull, es decir, traernos cambios desde el repositorio remoto al repositorio local:
$ git pull origin master
From https://github.com/vlad/planets
* branch master -> FETCH_HEAD
Already up-to-date.
En este caso, hacer pull no ha tenido ningún efecto porque los dos repositorios están ya sincronizados. Por el contrario, si alguien antes hubiera subido con push algunos cambios al repositorio en GitHub, este comando los habría incorporado a nuestro repositorio local.
Interfaz gráfica de GitHub
Navega hasta tu repositorio
planets
en GitHub. En la pestaña Code, localiza el texto “XX commits” (donde “XX” es algún número) y haz click en él. Mueve el cursor sobre los tres botones que hay a la derecha de cada commit, y haz click en ellos. ¿Qué información puedes obtener/explorar con estos botones? ¿Cómo obtendrías la misma información en la terminal?Solución
El botón más a la izquierda (con el dibujo de un portapapeles) sirve para copiar en el portapapeles el identificador completo del commit en cuestión. En la terminal,
git log
muestra los identificadores completos de cada commit.Haciendo click en el botón de en medio, se pueden ver todos los cambios efectuados con el commit en cuestión. Las líneas verdes sombreadas indican adiciones y las rojas eliminaciones. En la terminal se puede ver lo mismo con
git diff
. En particular,git diff ID1..ID2
donde ID1 y ID2 son identificadores de commits (e.g.git diff a3bf1e5..041e637
) mostrará las diferencias entre esos dos commits.El botón más a la derecha permite ver todos los archivos que existían en el repositorio en el momento del commit en cuestión. Para ver lo mismo en la terminal sería necesario hacer checkout del repositorio a ese momento del tiempo. Para ello se ejecutaría
git checkout ID
donde ID es el identificador del commit que queremos investigar. ¡Si se hace esto hay que acordarse luego de poner el repositorio de nuevo en el estado correcto!
Fecha y Hora en GitHub
Crea un repositorio remoto en GitHub. Haz push de los contenidos de tu repositorio local al remoto. Haz cambios en tu repositorio local y haz push de dichos cambios. Ve al repo recién creado en GitHub y comprueba las fechas y horas, también llamadas timestamps de los ficheros. ¿Cómo registra GitHub los tiempos, y por qué?
Solución
Github muestra los tiempos en formato relativo legible para los humanos (i.e. “22 hours ago” or “three weeks ago”). Sin embargo, si mueves el cursor sobre un timestamp, podrás ver el tiempo exacto en el que se realizó el último cambio al fichero.
Push vs. Commit
En esta lección hemos introducido el comando “git push”. ¿En qué se diferencia “git push” de “git commit”?
Solución
Cuando enviamos cambios con push, estamos interaccionando con un repositorio remoto para actualizarlo con los cambios que hemos hecho localmente (a menudo esto supone compartir con otros los cambios realizados). Por el contrario, commit únicamente actualiza tu repositorio local.
Corrigiendo ajustes en el repositorio remoto
Es muy frecuente cometer un error al especificar la URL del repositorio remoto. Este ejercicio trata de cómo corregir este tipo de errores. Empecemos por añadir un repositorio remoto con una URL inválida:
git remote add broken https://github.com/this/url/is/invalid
¿Obtienes un error al añadir el repositorio remoto? ¿Se te ocurre algún comando que hiciera obvio que la URL de tu repositorio remoto no es válida? ¿Se te ocurre cómo corregir la URL? (pista: usa
git remote -h
). No olvides eliminar este repositorio remoto una vez que hayas terminado este ejercicio.Solución
No aparece ningún error cuando añadimos el repositorio remoto (añadir un repositorio remoto informa a git sobre dicho repositorio, pero no intenta usarlo todavía). Sí veremos un error en cuanto intentemos usarlo con
git push
. El comandogit remote set-url
nos permite cambiar la URL del repositorio remoto para corregirla.
Licencia GitHub y ficheros README
En esta sección hemos aprendido cómo crear un repositorio remoto en GitHub, pero cuando lo hicimos no añadimos ningún fichero README.md ni ningún fichero de licencia. Si lo hubiéramos hecho, ¿qué crees que habría sucedido cuando intentaste enlazar tus repositorios local y remoto?
Solución
En este caso, puesto que ya teníamos un fichero README en nuestro propio repositorio (local), habríamos visto un conficto de unión, conocido como merge conflict (que es cuando git se da cuenta de que hay dos versiones de un mismo fichero y nos pide que resolvamos las diferencias).
Puntos Clave
Un repositorio Git local puede ser conectado a uno o más repositorios remotos.
Usa el protocolo HTTPS para conectarte a un repositorio remoto hasta que hayas aprendido como hacerlo con SSH.
git push
copia los cambios desde el repositorio local a un repositorio remoto.
git pull
copia los cambios desde un repositorio remoto a un repositorio local.