Flujo de trabajo Git para desarrolladores C#: cómo dejar de temer las fusiones y empezar a vivir
¿Alguna vez ha pasado medio día tratando de averiguar quién y cuándo reescribió su amado método CalculateOrderTotal()? ¿O quizás ha subido una "corrección urgente" directamente a master, y luego la producción falló con un error NullReferenceException? ¿Le suena familiar? Bienvenido al club de desarrolladores C# que intentan sobrevivir al caos de Git sin un flujo de trabajo claro.
Si cree que Git es solo git add . y git push, se está perdiendo lo esencial. Un flujo de trabajo Git correcto no es un debate religioso, sino una herramienta que ahorra nervios, tiempo y dinero. Especialmente en el mundo de C#, donde tenemos soluciones (.sln), proyectos (.csproj) y un montón de paquetes NuGet que tienden a entrar en conflicto.
En este artículo, le mostraré estrategias de ramificación funcionales, ejemplos de código reales para C# y le contaré cómo automatizar las tareas rutinarias. ¡Allá vamos!
¿Por qué los proyectos C# requieren un enfoque especial para Git?
Cuando trabaja con C#, no solo trata con archivos de texto. Tiene:
- Solución (.sln) — un archivo que hace referencia a todos los proyectos. Si dos desarrolladores agregan un nuevo proyecto al mismo tiempo, el conflicto de fusión está garantizado.
- Archivos .csproj — archivos XML que se actualizan al agregar paquetes NuGet o cambiar la plataforma de destino. Fusionar estos archivos manualmente es un dolor de cabeza.
- appsettings.json y web.config — archivos de configuración que a menudo contienen cadenas de conexión. No deben confirmarse, pero todos lo olvidan.
- Carpetas bin/ y obj/ — si las confirma una vez, sus colegas lo maldecirán para siempre.
Por lo tanto, su flujo de trabajo Git para C# debe estar meticulosamente planificado. Y comienza con un .gitignore correcto.
Paso 1: Configuración de .gitignore para C#
El .gitignore estándar para C# se puede descargar de GitHub/gitignore, pero agregaré algunas líneas importantes que a menudo se pasan por alto:
# Archivos de configuración con secretos (¡no confirmar!)appsettings.Development.jsonappsettings.Local.jsonsecrets.json
# Archivos generados por ReSharper o Rider*.DotSettings.user*.DotSettings
# Paquetes NuGet (caché)packages/*.nupkg
# Resultados de pruebasTestResults/*.trx
# Carpetas de Visual Studio.vs/*.suo*.user*.sln.docstates¿Por qué es importante esto? Imagine que confirma appsettings.Development.json con una cadena de conexión de base de datos local. Un colega lo descarga y su aplicación falla porque no tiene esa base de datos. Parece un descuido menor, pero le cuesta una hora de trabajo.
Elegir una estrategia de ramificación para el equipo C#
Existen varios flujos de trabajo Git populares. Para proyectos C#, recomiendo dos estrategias principales: Git Flow y Desarrollo basado en tronco. Analicémoslas con ejemplos.
Opción 1: Git Flow (clásico para proyectos grandes)
Git Flow es como SOLID para Git. Es ideal cuando tiene lanzamientos claros (por ejemplo, versión 2.1.0, 2.2.0). Las ramas se ven así:
main— solo código estable.develop— rama de integración.feature/XXX-123-add-new-api— funcionalidades desdedevelop.release/2.1.0— preparación del lanzamiento.hotfix/2.0.1-critical-bug— correcciones urgentes desdemain.
Ejemplo para C#: está trabajando en una nueva función "Cálculo de descuento por código promocional".
# Crear una funcionalidad desde developgit checkout developgit pullgit checkout -b feature/ABC-42-add-promo-discount
# Escribir código en C#// DiscountService.cspublic class DiscountService{ public decima