Introducci贸n

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

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

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

Algunas ventajas de usarlo:

  • Es el est谩ndar actual.
  • C贸digo colaborativo, versionado y distribuido.
  • Recuperaci贸n de archivos.
  • Mayor control.
  • Shorcuts y plugins.
  • Mejora la productividad.

Git es descentralizado

Instalaci贸n:

Plataformas web que trabajan con Git:

Git no es GitHub

馃敿 Regresar


Configuraci贸n inicial

Configurando Git por primera vez

git --version
git config --global user.name "Jonathan MirCha"
git config --global user.email jonmircha@gmail.com
git config --global user.ui true
git config --global init.defaultBranch main
git config --list
# asignando visual studio code como editor de configuraci贸n de git
git config --global core.editor "code --wait"
git config --global -e
# para estandarizar los saltos de l铆nea en windows
git config --global core.autocrlf true
# para estandarizar los saltos de l铆nea en linux/mac
git config --global core.autocrlf input
# ver todas las opciones de la configuraci贸n en la terminal
git config -h
# ver todas las opciones de la configuraci贸n en el navegador
git help config

Inicializar Git en un directorio local

mkdir carpeta
cd carpeta
touch README.md
touch .gitignore
git init
code .

馃敿 Regresar


Flujo b谩sico

El flujo de Git, consta de tres estados locales, es decir en la computadora donde se esta trabajando y uno m谩s de forma remota cuando accedemos al codigo centralizado en plataformas como GitHub, Gitlab, Bitbucket, etc.

Dichos estados son modified, staged, committed y remote. A cada uno de ellos le corresponde un 谩rea de trabajo:

  1. Working Directory: Es el 谩rea correspondiente al estado modified y es la carpeta local de tu computadora donde almacenas los archivos de tu proyecto.
  2. Staging Area: Es el 谩rea correspondiente al estado staged tambi茅n se le llama index por que es el 谩rea donde git indexa y agrega los cambios realizados en los archivos previos a comprometerlos en su registro.
  3. Local Repository: Es el 谩rea correspondiente al estado committed, donde los cambios ya se han registrado en el repositorio de git tambi茅n se le llama HEAD por que indica en qu茅 cambio se encuentra el puntero del repositorio.
  4. Remote Repository: Es el 谩rea correspondiente al estado remote y es el directorio remoto donde almacenamos los archivos del proyecto en alguna plataforma web como GitHub, GitLab, BitBucket. Git denomina origin al repositorio remoto.

Flujo b谩sico de Git

# agregar los cambios de un archivo al staged
git add archivo/directorio
# agregar todos los cambios de todos los archivos al staged
git add .


# los cambios son comprometidos en el repositorio
# debes escribir el mensaje del cambio
# cuando se abra el archivo de configuraci贸n
# al terminar guarda y cierra el archivo
# para que los cambios tengan efecto
git commit
# es un shortcut del comando anterior
# escribes y confirmas el mensaje del cambio en un s贸lo paso
git commit -m "mensaje descriptivo del cambio"


# se agrega el origen remoto de tu repositorio de GitHub
git remote add origin https://github.com/usuario/repositorio.git
# la primera vez que vinculamos el repositorio remoto con el local
git push -u origin master
# para las subsecuentes actualizaciones, sino cambias de rama
git push


#para descargar los cambios del repositorio remoto al local
git pull

馃敿 Regresar


De master a main

Con los desafortunados acontecimientos del 25 de mayo de 2020 en los Estados Unidos que culminaron con el asesinato del afroamericano George Floyd a manos de policias de la ciudad de Mine谩polis, se intensific贸 de manera global el movimiento #BlackLivesMatter.

Con dicho movimiento muchas industrias y empresas comenzaron a tomar acciones para erradicar el racismo.

En la industria de la tecnolog铆a por a帽os se han empleado palabras como master, slave, whitelist, blacklist entre otras que actualmente no son bien vistas por el contexto y la sem谩ntica que implican.

Al respecto Microsoft empresa propietaria de GitHub decidi贸 comenzar una campa帽a para reemplazar el nombre de la rama principal de los repositorios de master a main; como lo han explicado en este documento:

"El 1 de octubre de 2020, cualquier nuevo repositorio que crees utilizar谩 'main' como la rama por defecto, en lugar de 'master'. Este cambio no afecta a ninguno de tus repositorios existentes: los repositorios existentes continuar谩n teniendo la misma rama por defecto que tienen ahora".

Este cambio implica agregar una par de l铆neas de comandos adicionales para crear la rama 'main' y hacerla principal en el repositorio.

Entonces el flujo b谩sico quedar铆a de la siguiente manera:

Para repositorios nuevos

git init
git add .
git commit -m "Primer commit"
git branch -M main
git remote add origin https://github.com/usuario/repositorio.git
git push -u origin main

Para repositorios existentes

git branch -M main
git remote add origin https://github.com/usuario/repositorio.git
git push -u origin main

Para reemplazar la rama master por main en GitHub

# Paso 1
# Crea la rama local main y p谩sale el historial de la rama master
git branch -m master main


# Paso 2
# Haz un push de la nueva rama local main en el repositorio remoto de GitHub
git push -u origin main


# Paso 3
# Cambia el HEAD actual a la rama main
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main

Paso 4

Cambia la rama default de master a main en tu repositorio de GitHub .

Para hacerlo, sigue las instrucciones de este enlace.

# Paso 5
# Elimina la rama master del repositorio remoto
git push origin --delete master

Para reemplazar la rama master por main en Git

git config --global init.defaultBranch main

馃敿 Regresar


Ayuda

# ayuda en la terminal
git comando -h
# ayuda en el navegador
git help comando

馃敿 Regresar


Ignorar archivos

En el archivo .gitignore incluimos todo lo que NO queramos incluir en nuestro repositorio. Lo podemos crear manualmente o con gitignore.io.

# esto es un comentario
archivo.ext
carpeta
/archivo_desde_raiz.ext
# ignorar todos los archivos que terminen en .log
*.log
# excepto production.log
!production.log
# ignorar los archivos terminados en .txt dentro de la carpeta doc,
# pero no en sus subcarpetas
doc/*.txt
# ignorar todos los archivos terminados en .txt dentro de la carpeta doc
# y tambi茅n en sus subcarpetas
doc/**/*.txt

馃敿 Regresar


Clonar repositorios

git clone https://github.com/usuario/repositorio.git

馃敿 Regresar


Ramas

Una rama nos permite aislar una nueva funcionalidad en nuestro c贸digo que despu茅s podremos a帽adir a la versi贸n principal.

# crear rama
git branch nombre-rama

# cambiar de rama
git checkout nombre-rama

# crear una rama y cambiarte a ella
git checkout -b rama

# eliminar rama
git branch -d nombre-rama

# eliminar ramas remotas
git push origin --delete nombre-rama

#eliminar rama (forzado)
git branch -D nombre-rama

# listar todas las ramas del repositorio
git branch

# lista ramas no fusionadas a la rama actual
git branch --no-merged

# lista ramas fusionadas a la rama actual
git branch --merged

# rebasar ramas
git checkout rama-secundaria
git rebase rama-principal

馃敿 Regresar


Fusiones

Une dos ramas. Para hacer una fusi贸n necesitamos:

  1. Situarnos en la rama que se quedar谩 con el contenido fusionado.
  2. Fusionar.

Cuando se fusionan ramas se pueden dar 2 resultados diferentes:

  • Fast-Forward: La fusi贸n se hace autom谩tica, no hay conflictos por resolver.
  • Manual Merge: La fusi贸n hay que hacerla manual, para resolver conflictos de duplicaci贸n de contenido.
# nos cambiamos a la rama principal que quedar谩 de la fusi贸n
git checkout rama-principal

# ejecutamos el comando merge con la rama secundaria a fusionar
git merge rama-secundaria

馃敿 Regresar


Cambios

Puedes agregar modificaciones al 煤ltimo cambio

# sin editar el mensaje del 煤ltimo commit
git commit --amend --no-edit

# editando el mensaje del 煤ltimo commit
git commit --amend -m "nuevo mensaje para el 煤ltimo commit"

# eliminar el 煤ltimo commit
git reset --hard HEAD~1

Podemos desplazarnos en el historial del repositorio hacia atr谩s o adelante en cambios o ramas , sin afectar el repositorio como tal.

# cambiar a una rama
git checkout nombre-rama

# cambiar a un commit en particular
git checkout id-commit

馃敿 Regresar


Registro del historial

git log nos permite conocer todo el historial de un proyecto, con la informaci贸n de la fecha, el autor y id de cada cambio.

git log

# muestra en una sola l铆nea por cambio
git log --oneline

# guarda el log en la ruta y archivo que especifiquemos
git log > commits.txt

# muestra el historial con el formato que indicamos
git log --pretty=format:"%h - %an, %ar : %s"

# cambiamos la n por cualquier n煤mero entero y mostrar谩 los n cambios recientes
git log -n

# muestra los cambios realizados despu茅s de la fecha especificada
git log --after="2019-07-07 00:00:00"

# muestra los cambios realizados antes de la fecha especificada
git log --before="2019-07-08 00:00:00"

# muestra los cambios realizados en el rango de fecha especificado
git log --after="2019-07-07 00:00:00" --before="2019-07-08 00:00:00"

# muestra una gr谩fica del historial de cambios, rama y fusiones
git log --oneline --graph --all

# muestra todo el registro de acciones del log
# incluyendo inserciones, cambios, eliminaciones, fusiones, etc.
git reflog

# diferencias entre el Working Directory y el Staging Area
git diff

馃敿 Regresar


Reseteo del historial

Podemos eliminar el historial de cambios del proyecto hacia adelante con respecto de un punto de referencia.

#nos muestra el listado de archivos nuevos (untracked), borrados o editados
git status

# borra HEAD
git reset --soft

# borra HEAD y Staging
git reset --mixed

# borra todo: HEAD, Staging y Working Directory
git reset --hard

# deshace todos los cambios despu茅s del commit indicado, preservando los cambios localmente
git reset id-commit

# desecha todo el historial y regresa al commit especificado
git reset --hard id-commit

馃敿 Regresar


Resetear un repositorio

Si en alg煤n momento tienes la necesidad de resetear el historial de cambios de un repositorio para que quede como si lo acabar谩s de crear ejecuta esta serie de comandos:

cd carpeta-repositorio
mv .git/config ~/saved_git_config
rm -rf .git
git init
git branch -M main
git add .
git commit -m "Commit inicial"
mv ~/saved_git_config .git/config
git push --force origin main

馃敿 Regresar


Remotos

# muestra los or铆genes remotos del repositorio
git remote

# muestra los or铆genes remotos con detalle
git remote -v

# agregar un or铆gen remoto
git remote add nombre-or铆gen https://github.com/usuario/repositorio.git

# renombrar un or铆gen remoto
git remote rename nombre-viejo nombre-nuevo

# eliminar un or铆gen remoto
git remote remove nombre-or铆gen

# descargar una rama remota a local diferente a la principal
git checkout --track -b rama-remota origin/rama-remota

馃敿 Regresar


Etiquetas

Con esta opci贸n git nos permite versionar nuestro c贸digo, librer铆a o proyecto.

# listar etiquetas
git tag

# crea una etiqueta
git tag numero-versi贸n

# eliminar una etiqueta
git tag -d numero-versi贸n

# mostrar informaci贸n de una etiqueta
git show numero-versi贸n

# sincronizando la etiqueta del repositorio local al remoto
git add .
git  tag v1.0.0
git commit -m "v1.0.0"
git push origin numero-versi贸n

# generando una etiqueta anotada (con mensaje de commit)
git add .
git tag -a "v1.0.0" -m "Mensaje de la etiqueta"
git push --tags

馃敿 Regresar


GitHub Pages

gh-pages es una rama especial para crear un sitio web a tu proyecto alojado directamente en tu repositorio de GitHub.

  • URL del repositorio: https://github.com/usuario/repositorio
  • URL del sitio: https://usuario.github.io/repositorio

Para crear esta rama especial en GitHub ejecutamos los siguientes comandos:

git branch gh-pages
git checkout gh-pages

git remote add origin https://github.com/usuario/repositorio.git
git push origin gh-pages

# para descargar los cambios del repositorio remoto al local
git pull origin gh-pages

馃敿 Regresar


Colaboraci贸n en GitHub

Para poder colaborar en proyectos alojados en GitHub necesitamos hacer uso de los forks y pull requests, herramientas que nos ofrece la plataforma para dicho objetivo.

A continuaci贸n describo el proceso de colaboraci贸n en GitHub.

  1. Forkea el repositorio en el que quieras colaborar, para hacerlo, sigue las instrucciones de este enlace.
  2. Una vez forkeado el repositorio en tu cuenta de GitHub, cl贸nalo en tu equipo de c贸mputo.
  3. En el repositorio local hay que configurar los or铆genes remotos de tu nueva cop铆a para tener ambos remotos, los originales (origin) y los de tu copia, para hacerlo, sigue las instrucciones de este enlace.
  4. Crea una rama nueva en tu fork local para hacer tu colaboraci贸n, y sincr贸nizala con tu repositorio remoto, para hacerlo, sigue las instrucciones de este enlace.
  5. Configura tu repositorio para que acept茅 cambios (pull requests), para hacerlo, sigue las instrucciones de este enlace.
  6. Crea una pull request, para hacerlo, sigue las instrucciones de este enlace.
  7. Espera a que el due帽o del repositorio original, acepte tus cambios.
  8. Una vez que acepten tu pull request, es recomendable que borres la rama en la que trabajaste el cambio y actualices tu repositorio forkeado, con los cambios del repositorio original.

Anexo un resumen de los comandos a ejecutar para colaborar en un repositorio de GitHub:

# forkear repositorio
git clone https://github.com/usuario/repositorio.git
git remote -v
git remote rename origin fork
git remote add origin https://github.com/usuario/repositorio.git
git checkout -b rama-nueva
git push fork rama-nueva
# solicitar el pull request
# aceptar el pull request
git checkout main
git pull origin main
git push fork main
git branch -d rama-nueva
git push fork --delete rama-nueva

馃敿 Regresar


Aprende m谩s

A continuaci贸n te dejo algunos enlaces donde puedes profundizar tus conocimientos sobre Git y GitHub:

Y tambi茅n puedes ver mi curso de Git en YouTube:

Ver Curso

馃敿 Regresar