# Comandos Útiles Git

Git es una grandiosa herramienta que nos permite realizar un control de versiones profesional sobre nuestros proyectos y saber manejarla es un plus muy importante, en este post resumo algunos puntos importantes que me han servido a lo largo de mi carrera como Desarrollador Web.

###  Configuraciones globales
Para realizar configuraciones ejecutamos el comando "git config --global", por ejemplo para establecer el usuario y el correo del usuario global en tu pc o laptop debes ejecutar:
```
### CONFIGURACION GLOBAL
git config --global user.name "YOUR_USER_NAME"
git config --global user.email "YOUR_USER_EMAIL"
```

###  Inicializar un repositorio
Para inicializar un repositorio en el directorio actual ejecutamos:
```bash
git init
```
###  Añadir archivos al stage
Para añadir archivos al stage y github les mantenga seguimiento ejecutamos el comando:
```bash
git add file_name // archivo en especifico
git add . // todos los archivos 
```

### Cambiar de Rama
Si estas trabajando en una rama y deseas cambiar a otra y crearla al mismo tiempo puedes ejecutar el comando:
```bash
git checkout -b branch_name
```

### Hacer un commit
Si estas trabajando con archivos en el stage y deseas hacer un commit debes ejecutar el comando:
```bash
git commit -m "message_to_commit"
```

###  Mostrar origenes locales y remotos del repositorio
Si estas trabajando con archivos en el stage y deseas hacer un commit debes ejecutar el comando:
```bash
git remote show origin
```

###  Remover archivos
En git para remover archivos es similar a como se trabaja en Linux
```
git rm ‘.txt’  #remover un archivo en especifico
git rm -r ‘doodle’  #remover carpetas
git rm -r --cached . # remover archivos cache
```
### Listar diferencias
Para poder listar las diferencias o cambios entre el repositorio remoto y el local podemos ejecutar el comando:
```
git diff [filename]
```

### Crear alias de comandos
Si deseas ver de una mejor manera el log de tu repositorio puedes crear el siguiente alias
```bash
git config --global alias.lg "log --oneline --decorate --all --graph"
```
Con esto para ver el log del repositorio solo debes ejecutar "git lg"

Si deseas listar de una forma amigable los archivos que estan en el stage o los que no están puedes crear el alias
```bash
git config --global alias.s "status -s -b"
```
Con esto para ver el log del repositorio solo debes ejecutar "git s"

### Crear etiquetas(tags)
Para crear etiquetas, por ejemplo para mantener un versionado del proyecto debemos ejecutar el comando:
```
git tag -a v0.0.1 #commit -m "message" //reemplazas v.0.0.1 por tu versión
```
Para subir las etiquetas a Github debes eejecutar el siguiente comando, ya que por defecto no se suben al ejecutar un git push
```
git push --tags
```

###  Clonar Repositorio
Para clonar un repositorio lo hacemos de la siguiente manera, especificando la url del repositorio y opcionalmente la rama que deseamos clonar 
 ```
git clone [branch_name] url_repositorio_remoto directorio_local_donde_guardar
```

### Bajar cambios de un repositorio remoto
Podemos utilizar el comando
 ```
git pull origin [branch_name] [--allow-unrelated-histories]
```
el cual descarga los cambios remotos e inmediatamente intenta hacer un merge con los cambios locales. Si no deseas que suceda esto puedes usar los siguientes comandos:
 ```
git fetch origin [branch_name] [--all]
```
el cual se descarga los cambios remotos, y luego con el comando:
 ```
git merge
```
realizamos manualmente la fusión(merge), si da errores de conflictos revisamos los archivos que dieron conflicto y podemos aceptar los dos cambios, aceptar nuestros cambios o aceptar los cambios que vienen del repositorio remoto

### Regresar al ultimo commit y descartar nuevos cambios
Para resetear nuestro repositorio al ultimo commit debemos ejecutar el siguiente comando:
 ```
git reset --hard origin/[branchname]
```

### Setear una rama local a una rama remota
Si creamos una rama local y queremos que git sepa a que rama nos referimos cuando queremos hacer un git push o git fetch, debemos ejecutar el siguiente comando:
 ```
git branch --set-upstream-to=origin/[branch_local_name] [branch_remote_name]
```
