se agrega .md de tailscale para hacer gitea https
This commit is contained in:
1 parent
f915802fb4
commit
920a4a2d56
10 files changed
+2081
-2066
No files matched your search
@@ -1,192 +1,755 @@
|
||||
# 🌿 Guía Completa para Crear y Manejar un Branch en Git
|
||||
|
||||
Porque romper `main` directamente es una tradición demasiado popular en desarrollo de software.
|
||||
Git existe precisamente para evitar ese tipo de tragedias humanas.
|
||||
|
||||
|
||||
Romper `main` directamente sigue siendo una tradición muy popular en desarrollo de software.
|
||||
|
||||
Git existe precisamente para evitar ese tipo de tragedias.
|
||||
|
||||
|
||||
|
||||
En esta guía usaremos un caso real como hilo conductor: una agencia que lleva un **proyecto por cada cliente**, y necesita crear una rama nueva cada vez que empieza a trabajar en la funcionalidad de un cliente específico (por ejemplo, `cliente-acme`).
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "inicio"
|
||||
|
||||
commit id: "version estable"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "dashboard acme"
|
||||
|
||||
commit id: "ajustes acme"
|
||||
|
||||
checkout main
|
||||
|
||||
merge cliente-acme id: "merge acme a main"
|
||||
|
||||
branch cliente-globex
|
||||
|
||||
checkout cliente-globex
|
||||
|
||||
commit id: "reporte globex"
|
||||
|
||||
checkout main
|
||||
|
||||
merge cliente-globex id: "merge globex a main"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 1️⃣ Verifica el estado actual del proyecto
|
||||
|
||||
|
||||
## 🗺️ Flujo general del proceso
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
flowchart TD
|
||||
|
||||
A[git status] --> B{Hay cambios sin guardar?}
|
||||
|
||||
B -- Si --> C[git add . + git commit]
|
||||
|
||||
B -- No --> D
|
||||
|
||||
C --> D[git checkout main]
|
||||
|
||||
D --> E[git pull]
|
||||
|
||||
E --> F["git checkout -b cliente-acme"]
|
||||
|
||||
F --> G[git branch para confirmar]
|
||||
|
||||
G --> H[Trabajar y hacer commits]
|
||||
|
||||
H --> I[git checkout main]
|
||||
|
||||
I --> J["git merge cliente-acme"]
|
||||
|
||||
J --> K[git push]
|
||||
|
||||
K --> L["git branch -d cliente-acme"]
|
||||
|
||||
```bash
|
||||
git status
|
||||
```
|
||||
|
||||
Esto te mostrará:
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 1️⃣ Verifica el estado actual del proyecto
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git status
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Esto te muestra:
|
||||
|
||||
|
||||
|
||||
- Archivos modificados
|
||||
|
||||
- Archivos en stage
|
||||
|
||||
- Archivos sin seguimiento
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 2️⃣ Guarda tus cambios importantes
|
||||
|
||||
|
||||
Si tienes cambios importantes, crea un commit antes de crear el branch.
|
||||
## 2️⃣ Guarda tus cambios importantes
|
||||
|
||||
|
||||
|
||||
Si tienes cambios importantes, crea un commit antes de crear el branch:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git add .
|
||||
|
||||
git commit -m "Version estable antes de nueva funcionalidad"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
✅ Esto crea un punto seguro al cual regresar.
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 📦 Alternativa: usar stash
|
||||
### 📦 Alternativa: usar stash
|
||||
|
||||
|
||||
|
||||
Si todavía no quieres hacer commit:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git stash
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Luego podrás recuperarlos con:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git stash pop
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 3️⃣ Ve a la rama principal
|
||||
|
||||
|
||||
## 3️⃣ Ve a la rama principal
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout main
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 4️⃣ Descarga lo último del repositorio
|
||||
|
||||
|
||||
## 4️⃣ Descarga lo último del repositorio
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git pull
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Esto sincroniza tu proyecto local con el remoto.
|
||||
|
||||
---
|
||||
|
||||
# 5️⃣ Crea la nueva rama
|
||||
|
||||
```bash
|
||||
git checkout -b nueva-funcionalidad
|
||||
```
|
||||
|
||||
## 📌 Ejemplo real
|
||||
|
||||
```bash
|
||||
git checkout -b agregar-dashboard-powerbi
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 6️⃣ Verifica que estás en la nueva rama
|
||||
|
||||
|
||||
## 5️⃣ Crea la nueva rama
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout -b nombre-de-la-rama
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 📌 Ejemplo con proyecto por cliente
|
||||
|
||||
|
||||
|
||||
Supongamos que la agencia empieza a trabajar en el dashboard del cliente **Acme**:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout -b cliente-acme
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Si más adelante empieza otro proyecto, para el cliente **Globex**:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout -b cliente-globex
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
De esta forma cada cliente tiene su propio espacio de trabajo aislado, sin afectar el código de los demás.
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main estable"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
branch cliente-globex
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 6️⃣ Verifica que estás en la nueva rama
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git branch
|
||||
|
||||
```
|
||||
|
||||
La rama actual aparecerá con un `*`
|
||||
|
||||
|
||||
## 📌 Ejemplo
|
||||
La rama actual aparecerá marcada con un `*`.
|
||||
|
||||
|
||||
|
||||
### 📌 Ejemplo
|
||||
|
||||
|
||||
|
||||
```text
|
||||
|
||||
main
|
||||
* agregar-dashboard-powerbi
|
||||
|
||||
* cliente-acme
|
||||
|
||||
cliente-globex
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 7️⃣ Trabaja normalmente y guarda cambios
|
||||
|
||||
|
||||
## 7️⃣ Trabaja normalmente y guarda cambios
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git add .
|
||||
git commit -m "Agrega nueva funcionalidad"
|
||||
|
||||
git commit -m "Agrega dashboard de ventas para Acme"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Puedes repetir este paso tantas veces como necesites mientras avanzas en el proyecto del cliente:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git add .
|
||||
|
||||
git commit -m "Ajusta colores y logo segun manual de marca de Acme"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main estable"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "dashboard ventas"
|
||||
|
||||
commit id: "ajustes de marca"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 8️⃣ Regresa a main cuando todo funcione
|
||||
|
||||
|
||||
## 8️⃣ Regresa a main cuando todo funcione
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout main
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 9️⃣ Une la nueva funcionalidad a main
|
||||
|
||||
|
||||
## 9️⃣ Une la nueva funcionalidad a main
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
git merge nueva-funcionalidad
|
||||
|
||||
git merge cliente-acme
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 📌 Ejemplo del resultado
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main estable"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "dashboard ventas"
|
||||
|
||||
commit id: "ajustes de marca"
|
||||
|
||||
checkout main
|
||||
|
||||
merge cliente-acme id: "entrega a Acme lista"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 🔟 Sube los cambios al repositorio remoto
|
||||
|
||||
|
||||
## 🔟 Sube los cambios al repositorio remoto
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git push
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 1️⃣1️⃣ Elimina la rama si ya no la necesitas
|
||||
|
||||
|
||||
## 1️⃣1️⃣ Elimina la rama si ya no la necesitas
|
||||
|
||||
|
||||
|
||||
Una vez que el trabajo del cliente ya fue entregado y fusionado a `main`, puedes borrar la rama para mantener el repositorio limpio:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
git branch -d nueva-funcionalidad
|
||||
|
||||
git branch -d cliente-acme
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
# 🧠 Recomendaciones importantes
|
||||
Si Git no te deja borrarla porque detecta cambios sin fusionar, y estás seguro de que quieres eliminarla de todos modos:
|
||||
|
||||
✅ Nunca trabajes directamente sobre `main`
|
||||
✅ Haz commits pequeños y claros
|
||||
✅ Usa nombres descriptivos para tus branches
|
||||
✅ Verifica siempre con `git status`
|
||||
|
||||
---
|
||||
|
||||
# 🚨 Comandos útiles extra
|
||||
|
||||
## Ver historial de commits
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git branch -D cliente-acme
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 🧠 Recomendaciones importantes
|
||||
|
||||
|
||||
|
||||
✅ Nunca trabajes directamente sobre `main`
|
||||
|
||||
✅ Haz commits pequeños y claros
|
||||
|
||||
✅ Usa nombres descriptivos para tus branches (por ejemplo, `cliente-acme`, no `rama1`)
|
||||
|
||||
✅ Verifica siempre con `git status` antes de cambiar de rama
|
||||
|
||||
✅ Si manejas varios clientes a la vez, mantén una rama por cliente para evitar mezclar entregas
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
branch cliente-globex
|
||||
|
||||
branch cliente-initech
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "avance acme"
|
||||
|
||||
checkout cliente-globex
|
||||
|
||||
commit id: "avance globex"
|
||||
|
||||
checkout cliente-initech
|
||||
|
||||
commit id: "avance initech"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## ❓ ¿Siempre hay que hacer merge a main?
|
||||
|
||||
|
||||
|
||||
No. El `merge` a `main` solo tiene sentido si `main` representa algo que **todos los clientes comparten**. Si los cambios son exclusivos de un cliente y no deben mezclarse con nada más, tienes otras opciones.
|
||||
|
||||
|
||||
|
||||
### Opción 1: La rama del cliente vive sola (sin merge a main)
|
||||
|
||||
|
||||
|
||||
Trabajas y subes esa rama directamente, sin tocar `main`:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout -b cliente-acme
|
||||
|
||||
# ... trabajas y haces commits ...
|
||||
|
||||
git push origin cliente-acme
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
`main` se queda intacto, y `cliente-acme` existe como una línea de desarrollo independiente para siempre (o hasta que ya no la necesites).
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main estable"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "dashboard acme"
|
||||
|
||||
commit id: "ajustes acme"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Aquí `cliente-acme` nunca se vuelve a juntar con `main`.
|
||||
|
||||
|
||||
|
||||
### Opción 2: main es solo una plantilla base
|
||||
|
||||
|
||||
|
||||
Si cada cliente parte de una base común (por ejemplo, la plantilla del proyecto), tiene sentido traer cambios **de main hacia el cliente** cuando la plantilla mejora, pero no al revés:
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout cliente-acme
|
||||
|
||||
git merge main
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
Esto trae las mejoras de la plantilla al proyecto del cliente. Es al revés del flujo normal: en vez de `cliente-acme → main`, es `main → cliente-acme`.
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "plantilla v1"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
checkout main
|
||||
|
||||
commit id: "plantilla v2 mejorada"
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "avance acme"
|
||||
|
||||
merge main id: "trae mejoras de plantilla"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Opción 3: Cada cliente es su propio repositorio o deploy
|
||||
|
||||
|
||||
|
||||
Si el código de cada cliente es tan distinto que ni siquiera comparte historial útil con los demás, muchas agencias usan directamente **una rama por cliente que se despliega tal cual**, sin merges entre ellas. En este caso `main` queda solo como referencia general, o incluso no se usa en ese repo.
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
gitGraph
|
||||
|
||||
commit id: "main (referencia)"
|
||||
|
||||
branch cliente-acme
|
||||
|
||||
branch cliente-globex
|
||||
|
||||
checkout cliente-acme
|
||||
|
||||
commit id: "deploy acme"
|
||||
|
||||
checkout cliente-globex
|
||||
|
||||
commit id: "deploy globex"
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
> 💡 Elige la opción según qué tan relacionado esté el trabajo entre clientes: si comparten código base, usa la Opción 2; si son totalmente independientes, la Opción 1 o la Opción 3.
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
## 🚨 Comandos útiles extra
|
||||
|
||||
|
||||
|
||||
### Ver historial de commits
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git log --oneline
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Ver diferencias de archivos
|
||||
### Ver diferencias de archivos
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git diff
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Salir del visor de git diff
|
||||
### Salir del visor de git diff / git log
|
||||
|
||||
|
||||
|
||||
Presiona:
|
||||
|
||||
|
||||
|
||||
```text
|
||||
|
||||
q
|
||||
|
||||
```
|
||||
|
||||
Porque claramente mostrar texto simple en terminal era demasiado fácil para Unix.
|
||||
|
||||
|
||||
### Ver todas las ramas, incluidas las remotas
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git branch -a
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### Cambiar de una rama de cliente a otra rápidamente
|
||||
|
||||
|
||||
|
||||
```bash
|
||||
|
||||
git checkout cliente-globex
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
# 🎯 Resultado esperado
|
||||
|
||||
|
||||
Tu flujo ideal debería verse así:
|
||||
## 🎯 Resultado esperado
|
||||
|
||||
|
||||
|
||||
Tu flujo ideal, aplicado al caso de proyectos por cliente, debería verse así:
|
||||
|
||||
|
||||
|
||||
```text
|
||||
|
||||
main
|
||||
└── nueva-funcionalidad
|
||||
└── commits
|
||||
└── merge a main
|
||||
|
||||
├── cliente-acme
|
||||
|
||||
│ └── commits del proyecto Acme
|
||||
|
||||
│ └── merge a main
|
||||
|
||||
├── cliente-globex
|
||||
|
||||
│ └── commits del proyecto Globex
|
||||
|
||||
│ └── merge a main
|
||||
|
||||
└── cliente-initech
|
||||
|
||||
└── commits del proyecto Initech
|
||||
|
||||
└── merge a main
|
||||
|
||||
```
|
||||
|
||||
Un proceso ordenado.
|
||||
Casi sospechosamente profesional para estándares normales de desarrollo.
|
||||
|
||||
|
||||
Un proceso ordenado, con una rama independiente por cada cliente, y `main` siempre reflejando el estado estable y entregado del trabajo.
|
||||
Reference in new issue
Block a user