Amado

Apuntes de Git y GitHub 📝

Recopilación de comandos, tips y prácticas de Git que fuí aprendiendo y poniendo en práctica


Comandos básicos


#####Iniciar la configuración del repositorio

$ git config --global user.email "[email protected]"
$ git config --global user.name "Tomas"

#####Iniciar un repositorio en el directorio actual

$ git init

#####Añadir los archivos modificados al staging area

$ git add nombre-del-archivo

Añadiendo un . en lugar del nombre del archivo se envian todos los archivos al staging

#####Comprobar el estado del repositorio

$ git status

#####Enviar el commit con todos los cambios que esten en el staging al repositorio

$ git commit -m "primer commit"

Los commits siempre deben de ir acompañados con una descripción de su contenido

######Reconstruir commits

$ git commit --amend -m "mensaje del commit"

En caso de que olvidaste enviar un cambio con tu último commit, amend fusiona el contenido del commit actual con el anterior

#####Muestra el historial de commits

$ git log

Modo pro

$ git log --all --graph --decorate --oneline

#####Compara los contenidos de dos commits, especificando sus hashes

$ git diff adfa73e d8875d6

Los [hashes] (https://es.wikipedia.org/wiki/Funci%C3%B3n_hash) son una serie de caracteres que funcionan como identificadores únicos para cada commit. Podes ver los hashes con el comando git log

#####Compara los contenidos de dos archivos

$ git diff nombre_archivo

#####Añadir etiquetas

$ git tag -a v0.1 -m "primera version" d8875d6

Debes especificar a que commit añadirle el tag con su respectivo hash

#####Eliminar etiquetas

$ git tag -d v0.1
Volver a un commit anterior
$ git stash

Este comando te permite volver al ultimo commit y moverte entre ramas pero manteniendo en memoria los cambios actuales a los que todavía no hiciste commit y luego poder recuperarlos

Esto sirve para cuando necesitas ver cambios de commits anteriores pero no querés perder los cambios actuales.
Para recuperar todo solo tenés que ejecutar el comando

$ git stash pop
Guardar el stash en otra rama
$ git stash branch nombre_rama

Este comando guarda el contenido del stash en una nueva rama

Traer un commit anterior a master

Si necesitas traer un cambio a master (o cualquier rama) de un commit anterior que está en otra rama pero no necesitas hacer un merge de la rama entera con todos los commits ejecuta este comando

$ git cherry-pick dca2a25

Debes especificar el hash del commit que querés traer


###Ramas

#####Crear una branch (rama)

$ git branch nombre_rama

#####Mostrar las ramas

$ git branch

#####Mostrar ramas y su historia

$ git show-branch --all

#####Moverse entre ramas

$ git checkout nombre_rama

#####Fusionar una rama con otra (merge)

$ git merge nombre_rama

Si se quiere hacer un merge de la rama dev a la rama master debemos estar situados en master al momento de hacer el merge y especificar el nombre de la rama que vamos a fusionar con master

Para seguir desarrollando una branch luego de haber hecho merge con master se debe hacer un merge de master a la otra rama para actualizar los cambios


###Revertir-Eliminar

#####Revertir cambios de un archivo/traer últimos cambios del repositorio

$ git checkout d8875d6 --nombre_archivo

#####Volver a un commit anterior

$ git reset d8875d6 
  • Si se indica --soft despues del hash revierte el commit conservando el contenido del staging area
  • Si se indica --hard elimina todo el historial y el contenido del staging

#####Eliminar archivos del staging area

$ git reset HEAD

Podes eliminar un solo archivo especificando un nombre después de HEAD

#####Eliminar archivos del repositorio sin eliminar el historial

$ git rm nombre_archivo
  • Para eliminar un archivo pero conservar el archivo en local debes agregar --cached
$ git rm --cached nombre_directorio
  • Para eliminar un directorio agregar -r
git rm -r nombre_directorio

###Repo en GitHub

Primero, crear un repositorio en [GitHub] (http://github.com/) y copiar la URL del repositorio

#####Conectar tu repositorio local con el repositorio en GitHub

$ git remote add origin https://github.com/aqui-tu-repo.git

Origin es el nombre que hace referencia a tu repositorio en GitHub. Podés llamarlo de otra manera si así lo deseas

#####Pushear tu último commit a GitHub

$ git push origin master

Para hacer push de otra rama solo debes hacer un git checkout hacia la rama

$ git checkout dev
$ git push origin dev

#####Enviar tus tags al repositorio remoto en GitHub

$ git push origin --tags

Escribir el nombre de una tag específica en lugar de --tags para hacer push solo a esa

#####Traer cambios del repositorio remoto al repositorio local

$ git pull origin master

Una buena práctica es hacer un pull antes de hacer push al repositorio remoto para evitar conflictos

#####Traer cambios sin cambiar la rama local

$ git fetch

git fetch trae los cambios, pero los deja en otro branch, hasta que se hace git merge para traerlos al branch local

git pull es una abreviación de git fetch seguido de un git merge

#####Clonar repositorios remotos a local

$ git clone https://github.com/tomas/mi-repo.git

###Ignorar archivos

  • Crear un archivo en el directorio raiz de tu repositorio llamado .gitignore, que tenga texto plano especificando el nombre de los archivos y carpetas que se deban ignorar para no subirlos al repositorio remoto. Ej. .DS_Store ignora todos los archivos del tipo DS_Store.

[gitignore.io] (https://www.toptal.com/developers/gitignore) es una web que te da un listado de archivos que debes poner en tu .gitignore


###Configurar llaves SSH

[SSH (Secure Shell)] (https://es.wikipedia.org/wiki/Secure_Shell) es un protocolo que permite tener una conexión segura y cifrada por medio de [llave pública y privada] (https://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica) con tu repositorio en GitHub.

#####Crear una llave SSH

$ ssh-keygen -t rsa -b 4096 -C "[email protected]"

Debes ingresar el mismo email que tengas en tu cuenta de GitHub

Al ejecutar este comando te va a pedir que selecciones en que directorio va a guardar tus llaves pública y privada, podes seleccionar el directorio que quieras o dejar que se instalen en la dirección por defecto, que es lo mas recomendable.

Luego te solicitará que ingreses una contraseña como segundo factor de seguridad para tu conexión SSH, aunque podes dejarlo sin contraseña.

#####Verificar que el servidor de llaves SSH este funcionando para luego agregarla a tu entorno

$ eval $(ssh-agent -s)

#####Agregar la llave a tu entorno

$ ssh-add ~/.ssh/id_rsa

La dirección ~/.ssh/id_rsa es donde las llaves se guardan por defecto. Si elegiste otra carpeta, indica la dirección de esa carpeta

#####Agregar la llave pública a GitHub Ahora, para poder establecer la conexión con SSH debes copiar el contenido del archivo id_rsa.pub, que es tu llave pública. Luego debes ir a tu cuenta de GitHub y dirigirte a Settings -> SSH and GPG keys -> New SSH key. Una vez acá, ponele un titulo a la llave y pega tu llave pública que copiaste anteriormente en el campo que dice key, hace click en Add SSH key y listo.

#####Crear conexión con el repositorio local por medio de SSH En tu repositorio de GitHub que desees conectar por medio de SSH tenes que dirigirte al botón de clone or download y seleccionar SSH, una vez lo hagas te va a dar una dirección que debes copiar. Luego debes dirigirte a tu repositorio local y escribir el siguiente comando:

$ git remote -v

Esto te muestra las direcciones con las que haces push y fetch con GitHub. Como ves, son direcciones https #####Cambiar la dirección HTTPS a SSH

$ git remote set-url origin [email protected]:nombre/nombre_repo.git

Si volvés a ejecutar el comando git remote -v podrás ver que las direcciones ya no son https sino SSH


###Pull requests en GitHub

Normalmente, en un flujo de trabajo de un proyecto real en el que colaboran varias personas, cuando se quiere hacer un merge de una rama en la que estuviste trabajando hacia la rama master del repositorio remoto en GitHub no basta con solo hacer un merge y luego un push a origin con los cambios, ya que antes otros miembros del equipo deben verificar que el código que estés enviando al repositorio esté bien. A esto se le llama hacer un [code review] (https://github.com/features/code-review/) y para esto sirven los pull requests.
#####Hacer un pull request en tu repositorio de GitHub Para hacer un pull request en un repositorio en el que estes colaborando con otras personas, primero debes estar trabajando en una rama o branch distinta a master con cambios que quieras aplicar a master, luego hacer push de esa rama al repositorio remoto

$ git push origin dev

Una vez hecho el push, debes ir a la branch master en tu repositorio de GitHub y seleccionar la opcion de pull request que te va a dar la opcion de comparar las dos ramas que quieras fusionar teniendo como base la branch master. Luego debes agregar un título y una descripción especificando que cambios queres integrar con master y seleccionar create pull request

Ahora, un compañero que esté en el repositorio como colaborador deberá revisar los cambios y ,en caso de que no haya problemas, aprobar el pull request, enviar un comentario solicitando que cambies o revises algo del código para que luego vuelvas a hacer un pull request o denegarlo.

Y por último, una vez que se haya revisado el pull request se deberá aprobar para que se haga un merge con la rama master integrando todos los cambios.


###Crear un fork y contribuir a un repositorio

Si queres hacer un pull request a un repositorio al que no perteneces como colaborador debes hacer un fork de ese repositorio, seleccionando la opción fork en el repo que quieras contribuir. Esto te hará una copia exacta del repositorio en tu cuneta de GitHub. De ahí, vas a poder clonarlo a tu equipo de forma local

$ git clone https://github.com/usuario/nombre-repo

Una vez lo tengas de forma local vas a poder modificar, agregar o eliminar código y cuando termines hacer un push para actualizar el repositorio con los cambios que hiciste en tu GitHub. Ahora solo queda iniciar un pull request del fork que hiciste del repositorio con el repositorio original, y si es aprobado por el autor, se hará un merge con tus cambios y listo, habrás colaborado a un proyecto open source!