Git flow, feature branches :)
Tags: git, productivity, tutorial, gitlab
Published: 2022-04-21 04:29:19

# Hello! :sunglasses: :alien:

Una vez dominando los términos generales de Git e aquí recomendaciones para trabajar con ramas, cabe mencionar que existen diferentes métodos para realizarlo... 

Dependiendo de los ambientes que se tengan pueden ser:

- Development (dev)
- QA/Test (test)
- Staging (staging)

## Partiendo desde main o master.

Podemos iniciar ya sea con master o bien con main

```
Jesús Fonseca@DESKTOP-BD5A9L MINGW64 /c/ (main)
$ git branch
* main
```
(En este caso main será nuestra rama principal)

## Creando nueva rama

Se pueden optar por 2 métodos uno:

git branch (nombre de la rama)
```
git branch feat-new-feature
```
y posteriormente pasar a la rama creada con _git switch_
```
git switch feat-new-feature
```
o bien crearla y pasar a la rama con un solo comando 
```
git switch -c feat-new-feature
Switched to a new branch 'feat-new-feature'
```

Para saber en que rama te encuentras puedes checarlo con _git branch_, o bien si requieres conocer tus ramas remotas y locales con _git branch -a_
```
$ git branch -a
  main
* feat-new-feature
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
```

Una vez que realices tus cambios en la rama creada es momento de subirlos a tu repositorio remoto
```
$ git status
On branch feat-new-feature
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   index.php
no changes added to commit (use "git add" and/or "git commit -a")
```
```
$ git commit -am "feature: rama de ejemplo"
[new-feature 94fb72d] feature: rama de ejemplo
 1 file changed, 1 insertion(+), 1 deletion(-)
```
(una vez teniendo tu commit listo solo es mandarlo a tu repositorio remoto, la primera vez tendrás que crear tu rama)
con git push --set-upstream origin (nombre-rama)
```
git push --set-upstream origin new-feature
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 302 bytes | 75.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
```
Ya sea que te encuentres en GitLab o Github, podras hacer (si ya finalizaste tus cambios y realizado la cantidad necesaria de commits) la unión de tu rama via Merge Request o Pull Request respectivamente.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v5srwcngk9l1lt5uz413.png)

Podrás agregar una descripción e incluso indicar que esa rama se borrará una vez aceptada la petición de unión.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c109tw5l60q9dhcjrhjo.png)

Quien se encargue de realizar la revisión aceptará o bien dará observaciones para poder hacerlo.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lnpud19hsjspd2ynmvb.png)
Una vez unido y si la opción fue eliminar la rama los cambios se encontrarán en main 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjncwpg1dg4fsaijvtig.png)

Notarán que ya está unida y la rama no existe en el remoto
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0bxlu435pz9govyh8tz.png)
Pero de manera local quedará así que... para borrar una rama de manera local, primero se debe de estar en una rama distinta 
```
git switch main
```
Posteriormente se puede eliminar con el comando git branch -d (nombre de la rama)
```
git branch -d feat-new-feature
```
Notarás que si consultas tus ramas locales y remotas se podrán visualizar
```
git branch -a
* main
  remotes/origin/main
  remotes/origin/feat-new-feature
```
Así que para que se descarten las ramas que ya no son necesarias se puede ocupar el comando _git remote prune origin_
```
$ git remote prune origin
Pruning origin
URL: https://gitlab.com/tuusuario/tuproyecto.git
 * [pruned] origin/feat-new-feature
```
De esta manera quedará limpio con las ramas únicamente activas
```
$ git branch -a
* main
  remotes/origin/main
```