Git en terminal – Guía de supervivencia – Sobre el autor



Git en terminal – Guía de supervivencia – Sobre el autor

5 1


git-hangout

slides of Git hangout masterclass

On Github davecarter / git-hangout

Git en terminal

Guía de supervivencia

por David García / @d4vecarter

Software de Control de versiones

¿Qué es Git?

Git es un Software de control de versiones distribuido y descentralizado que permite a un equipo de desarrolladores trabajar sobre el mismo código.

Control de versiones distribuido

Se denomina "distribuido" porque cada miembro del equipo dispone de una copia completa del código.

Control de versiones descentralizado

Los miembros del equipo pueden enviarse código, recibirlo y desarrollar funcionalidades de forma conjunta y separada del servidor central.

Vetajas de usar Git

  • Versionado distribuido de código
  • Código colaborativo
  • Recuperación de archivos
  • Estándar actual

Git en Terminal

  • Mayor control
  • Shorcuts / Plugins
  • Mejora tu productividad
  • Ligarás más

Instalación

Command Line Tools

$ xcode-select --install
				    	
Es probable que necesitemos descargar las Command Line Tools for Xcode

Descarga Git

Selecciona la versión adecuada a tu Sistema Operativo:

Git está disponible para Windows, Mac, Linux y Solaris.

Configuración

Indicamos a Git nuestra info de usuario

$ git config --global user.name "David G."
$ git config --global user.email dave74@gmail.com
$ git config --global core.editor nano

				    	

Git init

Creamos un repositorio local

En un directorio vacío ejecutamos el siguiente comando:

$ > mkdir git-hangout
$ > cd git-hangout
$ > git init

				        

Directorio Git

Git init crea un directorio oculto .git con el siguiente contenido:

  • COMMIT_EDITMSG: Comentarios de mensajes de commit
  • HEAD: Puntero hacia la rama activa
  • config: URLs de origin e info de ramas
  • hooks: Git hooks para CI o Linting
  • ...

Programas con GUI tipo Sourcetree pueden omitir algunos archivos dentro de este directorio.

Crear un nuevo archivo:

Git llevará un control exhaustivo sobre todos los cambios que vayamos haciendo.


$ touch README.md

				        
El comando UNIX touch nos crea un nuevo archivo. Edítalo y guarda los cambios.

.gitignore

Incluimos TODO lo que NO queramos incluir en nuestro repositorio.


$ touch .gitignore

				        
Podemos crear uno ad-hoc en: gitignore.io

Git Status:

Listado de archivos nuevos (untracked), borrados o editados


$ git status

				        

Rutas relativas a la raíz del repositorio.

Flujo de trabajo con Git

Local & Remote

El flujo de Git se distribuye en 3 estados locales y uno remoto

Estados Locales

A nivel local disponemos de:

  • Working Dir > El directorio donde almacenamos los archivos
  • Staging > El estado en el que avisamos a Git de que hemos realizado cambios
  • HEAD > El puntero hacia el último bloque de código (commit)

Working dir

El primer nivel es nuestra carpeta de trabajo. Podemos añadir, quitar, editar archivos y Git sólo se encargará de controlar los archivos que han sido modificados:

Git add

Una vez creados, modificados, añadidos o borrados los archivos al working dir los pasamos al staging mediante:


$ git add nombre de archivo/os
			        

o bien:

$ git add --all
			        

todos los archivos

Staging

En el segundo nivel nuestros archivos están preparados para ser empaquetados. Podemos seguir trabajando y repetir el proceso tantas veces como necesitemos.

Git commit

Cuando hemos completado un conjunto de cambios, los "empaquetamos" mediante la instrucción commit y los colocamos en el HEAD mediante:

$ git commit -m 'mensaje descriptivo'
			        

HEAD

Nuestro conjunto de cambios está listo para enviar al repositorio remoto. El HEAD es nuestra "bandeja de salida". Podemos seguir trabajando y crear más "commits".

ORIGIN remoto

Ahora vincularemos nuestro repo local con uno remoto en Github para poder trabajar en equipo:

Créate una cuenta en Github.com

Git remote add origin

Una vez creado el repositorio remoto en Github lo "vinculamos" a nuestro repositorio local mediante:

$ git remote add origin https://github.com/user/repo.git
			        

Git push

Una vez indicado a Git que tenemos un repositorio remoto podemos enviar el conjunto de cambios contenidos en nuestro HEAD mediante:

$ git push -u origin master
			        

Origin

Por defecto Git denomina origin a nuestro repositorio remoto y crea una rama llamada master. Enviamos el contenido de HEAD mediante:

Git pull

Sincronizar nuestro local con origin

Antes de enviar nuestros cambios tenemos que bajarnos la última versión de repositorio remoto

$ git pull origin master
			        
obtenemos los últimos cambios de origin y los combinamos con la rama master

Sincronizando versiones

Cuando obtenemos archivos del repositorio remoto a nuestra copia local Git obtiene todos los archivos nuevos que se hayan añadido y elimina los que se hayan quitado.

Git log

Consulta el historial de "commits" realizados por los diferentes miembros del equipo mediante:

$ git log
$ git log --oneline
			        

Inicializando repositorios remotos

Github

crea una cuenta en Github

Git clone mediante HTTPS

Creamos una copia de un repositorio remoto existente

$ git clone https://github.com/user/repo.git
			        

URL's Git sobre HTTPS

  • Facilita el acceso a través de firewalls
  • No necesita configuración previa
  • Has de proporcionar tu login/pass para acceder a origin

HTTPS + credential-osxkeychain

Almacena user/pass en texto plano

$ git config --global credential.helper osxkeychain // Mac OSX
$ git config --global credential.helper wincred // Windows
			        
Más info en Git Help

URL's Git sobre Secure Shell (SSH)

  • Basado en clave pública/privada
  • Requiere de instalación de clave pública en origin

En la sección /Settings/SSH Keys de tu cuenta de Github

Generando Claves SSH

$ ssh-keygen -t rsa -b 4096 -C "dave74@gmail.com"
			        
Puedes añadir una clave de seguridad o dejarla en blanco.

Añadir clave SSH a ssh-agent

$ ssh-add ~/.ssh/id_rsa
			        
Puedes añadir una clave de seguridad o dejarla en blanco.

Copiar clave SSH al portapapeles

$ pbcopy < ~/.ssh/id_rsa.pub
			        
Podemos abrirla con Sublime Text y copiar el contenido.

HTTPS o SSH

Ramas en Git

$ git branch

Git branch

Una rama nos permite aislar una nueva funcionalidad en nuestro código que después podremos añadir a la versión principal.

Para crear una nueva rama:

$ git branch feature/sliderhome
			        

Git merge

Git procura combinar los cambios automáticamente*.

Si no reconoce qué parte del código ha de quedarse y cual eliminar, hemos de editarlo manualmente.

*Recursive strategy

Git merge conflict

Cuando Git no puede identificar qué cambios ha de mantener y cual eliminar lanzará el siguiente mensaje:

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
			    		

Fixing Merge conflict


Código sin conflicto

<<<<<<< HEAD
I love cats!
=======
Dogs are better
>>>>>>> Master (o SHA del commit)

Código sin conflicto

			    		

Fixing Merge conflict

Pull Request

Github.com

Objetivo

Aportar una mejora al software existente

Contribuir en un proyecto Open Source

PR como colaborador

Sólo disponible si tenemos permisos de escritura

  • Clonamos el repo
  • Creamos rama feature
  • Añadimos cambios a esa rama
  • La publicamos a origin
  • Solicitamos la Pull Request

PR como contribuidor

No tenemos permisos de escritura

  • Hacemos un fork del proyecto
  • Creamos una rama con nuestra propuesta
  • Solicitamos una Pull Request...
  • El owner del proyecto puede aceptarla o denegarla

Ejemplo práctico de PR

Repo Git Hangout

Recursos

Sobre el autor

Twitter - @d4vecarterGitHub - davecarterLinkedIn - David García
Git en terminal Guía de supervivencia por David García / @d4vecarter