[Flujo de trabajo básico con un repositorio remoto - Curso Profesional de Git y GitHub](https://platzi.com/clases/1557-git-github/19935-flujo-de-trabajo-basico-con-un-repositorio-remoto/)
Un sistema de control de versiones como Git nos ayuda a guardar el historial de cambios y crecimiento de los archivos -de texto plano, idealmente - en nuestro proyecto.

> **$git init** | arranca el repositorio
> **$git add <archivo>** | arranca el archivo
> **$git commit** | envía los últimos cambios a la base de datos
> **$git add .** | arranca todos los archivos que hayan cambiado en la carpeta actual
> **$git status** | muestra el estado de los archivos
> **$git show** | muestra todos los cambios históricos realizados
> **$git log <archivo>** | muestra los cambios realizados al archivo
> **$git push** | envía a un repositorio remoto
[Cheatsheet Github education](https://education.github.com/git-cheat-sheet-education.pdf)

---
## Terminal y línea de comandos
**Diferencias** entre la estructura de archivos de Windows, Mac o Linux.
- La ruta principal en Windows es `C:\`, en UNIX es solo `/`.
- Windows no hace diferencia entre mayúsculas y minúsculas pero UNIX sí.
Recuerda que GitBash usa la ruta `/c` para dirigirse a `C:\` (o `/d` para dirigirse a `D:\`) en Windows. Por lo tanto, la ruta del usuario con el que estás trabajando es `/c/Users/Nombre de tu usuario`
**Comandos básicos en la terminal:**
- **pwd**: muestra la ruta de carpetas en la que te encuentras.
- **mkdir**: crear carpetas (`mkdir Carpeta`).
- **touch**: crear archivos (`touch archivo.txt`).
- **rm**: borrar un archivo o carpeta (`rm archivo.txt`). Cuidado, puedes borrar tu disco duro.
- **cat**: ver el contenido de un archivo (`cat archivo.txt`).
- **ls**: ver los archivos de la carpeta donde estamos.
Argumentos para ver más información (pueden ser `--` + el nombre del argumento o `-` + una sola letra o shortcut por cada argumento).
- `ls -a`: Mostrar todos los archivos, incluso los ocultos.
- `ls -l`: Ver todos los archivos como una lista.
- **cd**: navegar entre carpetas.
- `cd /`: Ir a la ruta principal
- `cd` o `cd ~`: Ir a la ruta de tu usuario
- `cd carpeta/subcarpeta`: Navegar a una ruta dentro de la carpeta donde estamos ahora mismo.
- `cd ..` (`cd` + dos puntos): Regresar una carpeta hacia atrás.- Si quieres referirte al directorio en el que te encuentras ahora mismo puedes usar `cd .` (`cd` + un punto).
- **history**: ver los últimos comandos que ejecutamos y un número especial con el que podemos repetir su ejecución.
- **! + número**: ejecutar algún comando con el número que nos muestra el comando `history` (por ejemplo, `!72`).
- **clear**: Para limpiar la terminal. También podemos usar los atajos de teclado `Ctrl + L` o `Command + L`.
Todos estos comandos tiene una función de autocompletado, o sea, puedes escribir la primera parte y presionar la tecla `Tab` para que la terminal nos muestre todas las posibles carpetas o comandos que podemos ejecutar.
Si presionas la tecla `Arriba` puedes ver el último comando que ejecutamos.
Recuerda que podemos descubrir todos los argumentos de un comando con el argumento `--help` (`cat --help`).
---
### Branches
Los equipos de desarrollo tienen un estándar:
- Todo lo que esté en la rama master va a producción,
- Las nuevas features, características y experimentos van en una rama “development” (para unirse a master cuando estén definitivamente listas)
- Los issues o errores se solucionan en una rama “hotfix” para unirse a master tan pronto como sea posible.
Crear una nueva rama lo conocemos como **Checkout**. Unir dos ramas lo conocemos como **Merge**.
---
### Git config --list : Mi info de identificación
Recuerda que Git está optimizado para trabajar en equipo, por lo tanto, debemos darle un poco de información sobre nosotros. No debemos hacerlo todas las veces que ejecutamos un comando, basta con ejecutar solo una sola vez los siguientes comandos con tu información:
```
git config --global user.email "
[email protected]"
git config --global user.name "Tu Nombre"
```
Existen muchas otras configuraciones de Git que puedes encontrar ejecutando el comando `git config --list` (o solo `git config` para ver una explicación más detallada).
### Diferencias entre versiones
```bash
git show <file_name> | Cambios del ultimo commit
git log <file_name> | Historial de cambios
git log --stat | Historial de cantidad de cambios en bytes en los archivos especificos, desde el commit
git diff <older_commit_id> <newer_commit_id> | Compara versiones
git diff | compara el stage contra lo que tienes actualmente
```
### Volver en el tiempo en nuestro repo
El comando **`git checkout`** + `ID del commit` nos permite viajar en el tiempo. Podemos **volver a cualquier versión anterior** de un archivo específico o incluso del proyecto entero. Esta también es la forma de crear ramas y movernos entre ellas.
También hay una forma de hacerlo un poco más “ruda”: usando el comando `git reset`. En este caso, no solo “volvemos en el tiempo”, sino que **borramos los cambios que hicimos** después de este commit.
```bash
git reset <commit_id> --hard | Vuelvo al commit, como si nada hubiera pasado.
git reset <commit_id> --soft | Conservando el stage, vuelvo al commit
git reset --soft HEAD^1 | Regresa el Head una posicion (Deshace el ultimo commit) dejando los archivos en stage
git checkout <commit_id> <file_name> | Regresar un archivo a version del commit, dejandolo en stage
git rm --force | Remueve los archivos de Git y del disco duro.
git rm --cached | Remueve los archivos del área de Staging, pero los mantiene en nuestro disco
git restore <file-name> | Devolver archivo de la version actual a la de stage
git reset HEAD | Resetea el stage. Los archivos tendran que git add de nuevo
```
---
## Repositorios remotos
- **`git clone url_del_servidor_remoto`**: Nos permite descargar los archivos de la última versión de la rama principal y todo el historial de cambios en la carpeta `.git`.
- **`git push`**: Luego de hacer `git add` y `git commit` debemos ejecutar este comando para mandar los cambios al servidor remoto.
- **`git fetch`**: Lo usamos para traer actualizaciones del servidor remoto y guardarlas en nuestro repositorio local (en caso de que hayan, por supuesto).
- **`git merge`**: También usamos el comando `git fetch` con servidores remotos. Lo necesitamos para combinar los últimos cambios del servidor remoto y nuestro directorio de trabajo.
- **`git pull`**: Básicamente, `git fetch` y `git merge` al mismo tiempo.