• Git: es un sistema de control de versiones que permite tener un mejor manejo del proyecto.
• ¿Qué es un sistema de control de versiones?
Un sistema que registra los cambios realizados sobre un archivo o conjunto de archivos a lo largo del tiempo.
• Tipos de sistemas de control de versiones.
- Local: Vive en el computador. Si ocurre algún fallo al equipo vamos a perder todo el trabajo, además que la combinación de teclas Ctrl + Z del computador tiene ciertas limitaciones.
- Centralizado: Depende de un súper servidor donde se encuentra almacenado el repositorio, si se quema el servidor, al igual que en un sistema local se pierde todo el trabajo.
- Distribuido (Git): Cada participante del repositorio tiene una copia local del mismo y el trabajo del resto del equipo no se ve afectado. No se pierde el trabajo si nuestro computador se daña, se perdió la copia que residía en él de forma local y podemos recuperar una copia del mismo en el servidor donde esté almacenado.
• Repositorio: Es el espacio en donde se encuentra almacenado el proyecto.
Git es un VCS (version control system → sistema de control de versiones) DISTRIBUIDO.
Git fue creado en el año 2005 por Linus Torvalds y se enfocó en las siguientes características:
Velocidad.
Diseño Sencillo.
Fuerte apoyo en el desarrollo no lineal.
Completamente DISTRIBUIDO.
Capaz de manejar grandes proyectos.
• Los 3 estados de Git.
- Working Directory: Es el área de trabajo local, es por ello que para guardar los cambios hay que pasarlos al Staging Area.
- Staging Area: Es el área de preparación, es acá donde se almacena todo antes de hacer un commit (confirma los cambios).
- Git Repository: Es el repositorio en donde se almacenan los cambios del proyecto.
Git es diferente de GitHub (GIT !== GITHUB). Git es el sistema de control de versiones mientras que GitHub es un hosting donde almacenaremos nuestro proyecto, en otras palabras, se podría decir que es la red social de los programadores.
• Comandos útiles.
git: es el comando principal de git valga la redundancia.
clear: limpia la consola.
touch [nombreArchivo]: crea un nuevo archivo.
cd: permite movernos hacia delante en los directorios, ejemplo: cd [nombreDirectorio].
cd…: permite movernos un espacio hacia atrás en los directorios, ejemplo: cd… sin especificar el nombre del directorio.
mkdir: crea un nuevo directorio, ejemplo: mkdir [nombreDirectorio].
ls: permite ver los archivos y directorios.
rmdir: borra un directorio, ejemplo: rmdir [nombreDirectorio].
• Subcomandos de Git.
git --version: permite ver la versión de git.
git init [nombreDirectorio]: crea un repositorio local, si no se indica el directorio lo creará en la ubicación actual.
git add: agrega el archivo al repositorio.
git add -A: agrega todos los archivos que estén listos.
git add -n [nombreArchivo]: crea un archivo para ser agregado luego con git add, es decir, se crea, pero no se incluye en el Staging Area.
git status: indica el status de los archivos.
git rm --cached [nombreArchivo]: hace un unstage de ese archivo, es decir lo elimina del repositorio.
git rm -f [nombreArchivo]: quita el archivo del Staging Area y lo elimina.
git config --list: muestra la lista de la configuración actual.
Ahora bien, para configurar git con nuestros datos es necesario implementar los siguientes subcomandos:
git config –global user.name “nombre de usuario”.
git config –global user.mail “correo electrónico”.
Siguiendo la lista de subcomandos, tenemos:
git commit -m: confirma los cambios en el repositorio.
git commit --amend: modifica la última confirmación de cambios (commit) cambia el mensaje o los archivos añadidos.
git tag [SHA1]: nos permite agregar etiquetas a nuestro a los commits del proyecto.
git tag -a [SHA1]: para la anotación de la etiqueta.
git tag -m [SHA1]: para el mensaje de la etiqueta.
git tag -l: muestra la lista de etiquetas.
git tag -f [SHA1]: para renombrar etiqueta.
git tag -d [SHA1]: para borrar etiqueta.
git log: muestra la historia de todos los commits que se han realizado.
git log --oneline: muestra la lista de commits de manera resumida.
git log --graph: muestra los commits haciendo referencia a las ramas o bifurcaciones representadas con un asterisco (*).
git log --oneline –graph: es una combinación de los 2 anteriores.
git log -[posición del commit]: muestra la información del commit.
git log --oneline --decorate: muestra las ramas.
git diff [SHA1]: compara los estados de los commits, si solo se especifica un [SHA1] compara al mismo con el primer commit, si se especifica el otro [SHA2] compara las 2 versiones de commits v.1 VS v.2.
git reset --soft [SHA1]: permite quitar los cambios de un commit específico. Deja los archivos en el Staging Area, listos para hacer un commit nuevamente.
git reset --mixed[SHA1]: además de eliminar los cambios del commit también los elimina del Staging Area.
git reset --hard[SHA1]: nos elimina los cambios incluso del Working Directory, se debe ser muy cuidado al usarse.
Importante, para borrar el último commit, es decir, el que se encuentra en la cabecera es necesario usar git reset (–soft, --mixed o --hard) HEAD~1.
Las ramas son muy importantes a la hora de trabajar en equipo o para llevar un mejor control sobre el proyecto, si no quieres tocar la rama master (rama principal) para no crear conflictos.
git branch [nombre de la rama]: crea una nueva rama.
git branch -l: muestra la lista de todas las ramas.
git branch -d/-D [nombre de la rama]: borra la rama.
git branch -m [nombre de la rama] [nuevo nombre de la rama]: renombra la rama.
Se usa git branch -D [nombre de la rama] para forzar el borrado de la rama incluso cuando ésta posea cambios (commits).
git checkout [nombre de la rama/SHA1(commit)]: permite movernos entre ramas o commits, este comando es el que nos permite mover en el tiempo.
git checkout -b [nombre de la rama]: nos permite crear y posicionarnos en una rama sin necesidad de usar el comando git branch [nombre de la rama].
git merge [nombre de la rama]: nos permite mezclar los cambios entre ramas, hay que tener presente que se mezcla la rama selecciona con la rama en la que estamos posicionados actualmente.
git manual merge: nos toca especificar que ramas queremos mezclar.
Cabe destacar que existen 2 tipos de cambios, son los siguientes:
- fast-forward: los mezcla automáticamente.
- recursive/auto-merging: ambas ramas salieron al mismo tiempo y hay algo nuevo en una rama que la otra no recuerda, por eso se hace la mezcla de forma recursiva.
git rebase: es parecido a merge, cambiamos la historia del proyecto sin crear bifurcaciones.
git rebase -i: de manera interactiva, abrirá el editor que tengamos configurado por defecto para confirmar los cambios.
git stash: es otro de los limbos, muy parecido al Staging Area, para conservar los cambios es necesarios que los mismo estén en Staging Area, este comando es útil cuando no queremos hacer muchos commits o los cambios no sabemos si se aplicarán.
git stash list: muestra la lista de stash.
git stash drop stash@{número}: borra el stash especificado.
git stash apply: aplica el último stash.
git stash apply stash@{número}: aplica el stash especificado.
git cherry -pick [SHA1]: permite mover un commit a otra rama.
Curso profesional de Git y GitHub 2017