Git es un sistema de control de versiones, que es un software permite tener un control de cambios sobre el código fuente de una aplicación.
GitHub es una página que ofrece un grupo de servicios que facilitan el uso de Git, como por ejemplo hosting de proyectos, facilidades de colaboración, reviews de código, perfiles personales, pull requests, issues, etc.
GitHub es la plataforma de «hosting» de los proyectos. Una comunidad llena de personas que desarrollan y comparten, usando GIT.
Como se ha dicho, Github github.com es un servicio para alojamiento de repositorios de software gestionados por el sistema de control de versiones Git. Por tanto, Git es algo más general que nos sirve para controlar el estado de un desarrollo a lo largo del tiempo, mientras que Github es algo más particular: un sitio web que usa Git para ofrecer a la comunidad de desarrolladores repositorios de software. En definitiva, Github es un sitio web pensado para hacer posible el compartir el código de una manera más fácil y al mismo tiempo darle popularidad a la herramienta de control de versiones en sí, que es Git.
Cabe destacar que Github es un proyecto comercial, a diferencia de la herramienta Git que es un proyecto de código abierto. No es el único sitio en Internet que mantiene ese modelo de negocio, pues existen otros sitios populares como Bitbucket o Gitlab que tienen la misma fórmula. No obstante, aunque Github tenga inversores que inyectan capital y esté movido por la rentabilidad económica, en el fondo es una iniciativa que siempre ha perseguido (y conseguido) el objetivo de hacer más popular el software libre. En ese sentido, en Github es gratuito alojar proyectos Open Source, lo que ha posibilitado que el número de proyectos no pare de crecer, y en estos momentos haya varios millones de repositorios y usuarios trabajando con la herramienta.
Pero ojo, para no llevarnos a engaño, al ser Git un sistema de control de versiones distribuido, no necesito Github u otro sitio de alojamiento del código para usar Git. Simplemente con tener Git instalado en mi ordenador, tengo un sistema de control de versiones completo, perfectamente funcional, para hacer todas las operaciones que necesito para el control de versiones. Claro que usar Github nos permite muchas facilidades, sobre todo a la hora de compartir código fuente, incluso con personas de cualquier parte del mundo a las que ni conoces.
Se complementan git y github, pero son personajes independientes.
Más información: https://desarrolloweb.com/articulos/introduccion-git-github.html
Cuando buscas en internet cualquier cosa sobre programación, software libre o Arduino es muy probable que acabemos en la página de https://github.com/ donde podemos acceder al código fuente de proyectos, librerías, etc… Al trabajar con Arduino es importante que conozcamos que es github y cómo hacer ciertas operaciones sencillas. Para conseguir software y ver el código, no es necesario crearse una cuenta, sólo es necesario cuando vamos a subir nuestro propio código. Si vamos a programar, es importante crearse una cuenta en github, no solo para compartir el código sino para tener un repositorio en la nube de nuestro trabajo y no guardarlo en local en nuestro ordenador.
GitHub es una plataforma de desarrollo colaborativo para alojar proyectos utilizando el sistema de control de versiones Git. El código se almacena de forma pública, aunque también se puede hacer de forma privada.
Github tiene planes gratuitos y permite tener repositorios privados. El plan gratuito es perfecto para cualquier programador aficionado que trabaja por su cuenta o para proyectos open source donde los repositorios son abiertos.
Pricing y comparativa de planes en Github: https://github.com/pricing
Github es el servicio elegido por proyectos de software libre como jQuery, reddit, Sparkle, curl, Ruby on Rails, node.js, ClickToFlash, Erlang/OTP, CakePHP, Redis, y otros muchos. Además, algunas de las grandes empresas de Internet, como Facebook, alojan ahí sus desarrollos públicos, tales como el SDK, librerías, ejemplos, etc.
En github podemos encontrar el código fuente de software libre que usamos a diario como el servidor web apache: https://github.com/apache/httpd y por supuesto el del IDE de Arduino https://github.com/arduino/Arduino.
Otro ejemplo para el que usaremos github con Arduino es para conseguir las librerías de Arduino que nos sirven para manejar algunos dispositivos o nos facilitan la programación. Los distribuidores de hardware como https://www.sparkfun.com/ tienen su repositorio https://github.com/sparkfun donde podemos descargar las librerías para manejar el hardware que les compramos.
Y también grandes compañías como Google o Microsoft publican parte de su código en github: https://github.com/google y https://github.com/Microsoft
GitHub aloja tu repositorio de código y te brinda herramientas muy útiles para el trabajo en equipo, dentro de un proyecto. Además de eso, puedes contribuir a mejorar el software de los demás. Para poder alcanzar esta meta, GitHub provee de funcionalidades para hacer un fork y pull request.
Github además es una muy buena herramienta de documentación para los proyectos open source, por ejemplo: https://github.com/ElCableAmarillo/Practicas
Dado que git es un sistema de control de versiones distribuido, Github es un servidor remoto donde sincronizar nuestros repositorios locales y publicarlos para colaborar en equipo o como un repositorio centralizado de los desarrollos.
Workflow de git con un repositorio remoto:
Y lo más importante:
Más información de github:
- http://conociendogithub.readthedocs.io/en/latest/
- http://blog.nubelo.com/github-como-puede-ayudar/
- http://www.genbetadev.com/sistemas-de-control-de-versiones/conociendo-github-el-servicio-donde-alojar-tus-repositorios-git-como-el-nuestro
- https://github.com/Hispano/Guia-sobre-Git-Github-y-Metodologia-de-Desarrollo-de-Software-usando-Git-y-Github
- Buena explicación: https://www.janbasktraining.com/blog/git-vs-github/
- ¿Que es github? https://es.wikipedia.org/wiki/GitHub
Crear Cuenta en Github y Repositorio de Curso
Para poder empezar a trabajar con Github, quien no tenga una cuenta deberá crearla en https://github.com/join.
Instrucciones: https://help.github.com/en/articles/signing-up-for-a-new-github-account
Es necesario una cuenta de correo y verificar el correo. Instrucciones: https://help.github.com/en/articles/verifying-your-email-address
Cada Alumno debe crear un repositorio en su cuenta llamado “Curso_Programacion_Arduino_2019” donde guardará todos lo ejemplos que haga y puedan ser revisados por el profesor.
Instrucciones para crear un nuevo repositorio: https://help.github.com/en/articles/create-a-repo. Pasos:
- Pulsar en new Repository
- El nombre del repo será “Curso_Programacion_Arduino_2019”
- Añadir una descripción del repositorio
- Configurar el repositorio como Público
- Inicializar el repositorio con un README
- Añadir la licencia GNU v3
Una vez hecho, mandar la url del repositorio al profesor a la dirección aprendiendoarduino@gmail.com para poder hacer revisión de código.
Mi repositorio del curso: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino_2019
Configurar Github en Sourcetree
Una vez tenemos la cuenta de Github, debemos configurar Sourcetree para añadir nuestra cuenta de Github y poder utilizarlo desde Sourcetree.
Instrucciones: https://confluence.atlassian.com/get-started-with-sourcetree/connect-your-bitbucket-or-github-account-847359096.html
En el menú opciones, buscar Authentication y añadir una cuenta,
Usar esta configuración, poniendo el usuario y actualizando la contraseña:
NOTA DE SEGURIDAD: Nuestro usuario y contraseña se ha quedado almacenado en SourceTree, para borrar la contraseña ir a preferencias – Accounts. Si estamos en un ordenador público, recordar borralo el último día del curso.
NOTA: es posible que en algún caso que haya que dar permiso a la aplicación sourcetree desde github (Si se hace con oauth autorizar en https://github.com/settings/applications). También es posible que en algún caso (p.e. si se usa autenticación en dos pasos) haya usar token de https://github.com/settings/tokens o aceptar el acceso desde terceros
Trabajar Usando Github con Sourcetree
Veamos las acciones básicas de trabajo en Github usando Sourcetree, una vez que tenemos configurado nuestra cuenta de Github en Sourcetree.
Trabajar usando git: https://confluence.atlassian.com/get-started-with-sourcetree/work-using-git-847359053.html
Operaciones básicas git:
- Pull – cuando alguien del equipo hace un cambio en el repositorio nos permite traernos los cambios a nuestro ordenador local. Ver https://confluence.atlassian.com/get-started-with-sourcetree/pull-changes-from-a-remote-repository-git-847359111.html
Esta es la operación que usaremos para sincronizar nuestro código con el de github.
- Commit y Push – Cuando queremos añadir un cambio o un fichero a un repositorio debemos pasar esos cambios a stage antes de hacer los cambios (commit) en local y enviarlos (push) al servidor, en este caso github. Ver https://confluence.atlassian.com/get-started-with-sourcetree/commit-and-push-a-change-git-847359114.html. Esta es la operación que haremos cada vez que hagamos una nueva versión o cambio y lo mandemos/publiquemos en Github.
- Crear una Branch y hacer Push – Cuando hagamos una nueva feature puede interesarnos hacer una Brach y luego mandar al servidor. Ver https://confluence.atlassian.com/get-started-with-sourcetree/create-and-push-a-branch-to-the-remote-repository-git-847359118.html
- Merge – Si el branch que hemos hecho lo queremos fusionar o integrar los cambios hecho en la rama principal o master, haremos un Merge. Ver https://confluence.atlassian.com/get-started-with-sourcetree/merge-changes-from-one-branch-to-another-git-847359121.html
- Fetch es similar a pull, pero no copia los datos en local, sino que solo consulta en qué estado se encuentra nuestra copia local respecto al servidor. Es recomendable hacerlo antes del pull para ver en qué punto nos encontramos.
Más información:
- SourceTree basis: https://confluence.atlassian.com/sourcetreekb/sourcetree-basics-780870007.html
- Que es una rama: https://git-scm.com/book/es/v1/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F
- Control de versiones: https://confluence.atlassian.com/get-started-with-sourcetree/version-control-and-sourcetree-847359072.html
- Cualquier duda con sourcetree: https://confluence.atlassian.com/sourcetreekb/sourcetree-knowledge-base-265901498.html
Clonar un Repositorio
Clonar un repositorio, significa hacer una copia exacta en nuestro ordenador de un repositorio que hay en un servidor. Un repositorio, depósito o archivo es un sitio centralizado donde se almacena y mantiene información digital, habitualmente bases de datos o archivos informáticos.
Para clonar el repositorio con SourceTree debemos seguir estos pasos:
- Click en el botón “Clone/New”
- Click en “Clone repository”
- En source URL poner la url de nuestro repositorio que lo encontramos en:
- En Destination Path poner la ruta donde clonarlo. Podemos usar la ruta configurada en las propiedades de Arduino que por defecto es C:\Users\nombre_usuario\Documentos\Arduino\Curso_Programacion
- En Name poner el nombre del Repositorio.
- Y procedemos a clonar el repositorio.
Ejercicio: clonar el repositorio de la librería timer en nuestro ordenador en la carpeta librerías.
- Repositorio: https://github.com/JChristensen/Timer
- Observar las versiones,los commits y los pull request que tiene.
Tutoriales de como clonar un repositorio:
- https://confluence.atlassian.com/get-started-with-sourcetree/clone-a-remote-repository-847359098.html
- https://confluence.atlassian.com/sourcetreekb/clone-a-repository-into-sourcetree-780870050.html
Más información sobre cómo clonar y actualizar un repositorio con sourcetree
- https://confluence.atlassian.com/sourcetreekb/clone-a-repository-into-sourcetree-780870050.html
- https://confluence.atlassian.com/bitbucket/clone-a-repository-223217891.html
- https://confluence.atlassian.com/sourcetreekb/commit-push-and-pull-a-repository-on-sourcetree-785616067.html
Hello World Github
Para empezar con github hagamos el hello world: https://guides.github.com/activities/hello-world/
Vamos a hacer lo mismo que hemos hecho en local, pero en github directamente.
Hagamos los siguientes pasos cada uno con su cuenta de github:
- Paso 1: Crear un repositorio llamado hello-world
- Paso 2: Crear una branch/rama
- Paso 3: Hacer cambios y hacer commit creando un archivo README.md
- Paso 4: Hacer un Pull Request en nuestro propio repositorio
- Paso 5: Hacer un Merge del Pull Request
Todo esto que hemos hecho en la web de Github, son operaciones que se pueden hacer con git por comando desde el ordenador o con una herramienta gráfica con SourceTree
Práctica: hacer con SourceTree lo mismo que se ha hecho con el Hello World en Github para comprobar que podemos trabajar en los dos entornos.
- Paso 1: Clonar el repositorio hello world que hemos hecho en nuestro directorio local. Ver como tenemos todos los pasos hechos en la web se ven en local.
- Paso 2: Crear una branch/rama nueva llamada “dev” en SourceTree
- Paso 3: Hacer un cambio en el fichero README.md poniendo nuestro nombre, hacer commit en SourceTree y hacer push de esos cambios al servidor.
- Paso 4: Hacer un Merge de la nueva rama en local y hacer Push y ver los cambio en Github
Subir un Repositorio a Github
Veamos ahora cómo subir el repositorio local blink que hemos creado a Github. Para ello crear un nuevo repositorio en la cuenta de Github llamado “blink”, que es el que sincronizaremos con nuestro repositorio local blink
Una vez tenemos el repositorio remoto, debemos configurar en local la dirección del repositorio remoto, para ello pulsar en settings de Sourcetree del repositorio local blink y en la pestaña Remotes pulsar Add. Rellenar los campos:
- Remote name: poner el Default remote que es origin
- URL/Path: poner la URL del repositorio que acabamos de crear, en mi caso https://github.com/jecrespo/blink
- Remote Account: seleccionar nuestra cuenta de Github
Una vez hecho esto, hacer Push de todas las ramas
Comprobar en Github que se ha subido el nuevo repositorio con todos los cambios históricos hechos.
Fork en Github
Realizar un fork es simplemente clonar un repositorio ajeno (genera una copia en tu cuenta), para eliminar algún bug, modificar cosas de él o simplemente hacer tu propia versión partiendo de un software libre. Una vez realizadas las modificaciones puedes enviar un pull request al dueño del proyecto. Éste podrá analizar los cambios que has realizado fácilmente, y si considera interesante tu contribución, adjuntarlo con el repositorio original.
Forks de un repositorio original:
Cada repositorio clonado es independiente. Esto significa que no importa si no se sincronizan, ellos pueden avanzar el proyecto a su antojo y necesidades.
Todos los clones derivados del repositorio original contienen el mismo registro de cambios, archivos e historial hasta el commit A. A partir de ahí, cada uno puede avanzar su propio proyecto con sus respectivos cambios independientemente y si quiero aportar mis cambios debo hacer un pull request.
Práctica: Hacer un fork en la cuenta de cada uno del repositorio https://github.com/jecrespo/blink
NOTA: Si da error porque ya existe un repositorio “blink”, renombrarlo.
Pull Request en Github
Un pull request es una petición que el propietario de un fork de un repositorio hace al propietario del repositorio original para que este último incorpore los commits que están en el fork. Pull request es el corazón de la colaboración donde podemos hacer una modificación y proponer al dueño
Cuando se realiza un pull request, se está proponiendo tus cambios y solicitando que alguien revise e incorpore tu contribución. Las pull request muestran diferencias, del contenido de ambas ramas. Los cambios, sumas y restas se muestran en verde y rojo respectivamente.
Se puede abrir pull request en su propio repositorio y fusionarlas uno mismo. Es una gran manera de aprender el flujo de GitHub antes de trabajar en proyectos más grandes. Ya lo hemos hecho en el ejemplo Hello-world.
Práctica: Hacer un cambio en el repositorio blink frokeado de https://github.com/jecrespo/blink y solicitar un pull request.
Pasos:
- Una vez hecho el fork, clonar el repositorio en local
- Modificar el archivo README.md con el nombre de cada uno y hacer un commit y push
- Hacer un pull request al repositorio original https://github.com/jecrespo/blink desde https://github.com/jecrespo/blink/pulls pulsando en “new pull request”
El propietario aceptará los cambios propuestos y los incorpora a su código. Comprobar.
NOTA: El profesor usará los pull requests para proponer mejoras a los ejercicios realizados por los alumnos.
Organizaciones en github
Además de las cuentas de usuario, GitHub tiene Organizaciones. Al igual que las cuentas de usuario, las cuentas de organización tienen un espacio donde se guardarán los proyectos, pero en otras cosas son diferentes. Estas cuentas representan un grupo de gente que comparte la propiedad de los proyectos, y además se pueden gestionar estos miembros en subgrupos. Normalmente, estas cuentas se usan en equipos de desarrollo de código abierto.
Un ejemplo de organización es: https://github.com/curso-programacion-arduino
Las organizaciones se asocian con individuos mediante los equipos, que son simplemente agrupaciones de cuentas de usuario y repositorios dentro de la organización, y qué accesos tienen esas personas sobre cada repositorio.
Más información: https://git-scm.com/book/es/v2/GitHub-Gesti%C3%B3n-de-una-organizaci%C3%B3n
Uso de Github/Git en el curso
Durante el curso vamos a usar el sistema de control de versiones git y la plataforma de github para publicar el código que realicemos en el curso, ver las soluciones a los ejercicios y colaborar entre todos para resolver las prácticas propuestas.
Requisitos para realizar las prácticas:
- Tener instalado SourceTree https://www.sourcetreeapp.com/, es una herramienta gratuita pero es necesario crear una cuenta para usarlo.
- Tener una cuenta en github
- Cada Alumno debe crear un repositorio en su cuenta llamado “Curso_Programacion_Arduino_2019” donde guardará todos lo ejemplos que haga y puedan ser revisados por el profesor.
Cada alumno tendrá su propio repositorio donde subirá todo lo que programe y le servirá en el futuro, yo haré pull request o cualquier problema me lo manden para corregirlo. Cada uno solventará un problema de programación de forma diferente y yo podré seguir su trabajo.
Práctica: Crear un repositorio llamado “Curso_Programacion_Arduino_2019” y mandar al profesor.
El alumno tendrá ahora 3 repositorios en su cuenta: Hell-World, Blink (fork de https://github.com/jecrespo/blink) y “Curso_Programacion_Arduino_2019”
Mi repositorio es el https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino_2019