C#开发者的Git工作流:如何不再害怕合并并开始高效工作
您是否曾经花费半天时间来弄清楚是谁以及何时重写了您心爱的CalculateOrderTotal()方法?或者,您是否曾将“紧急修复”直接推送到master,然后生产环境因NullReferenceException错误而崩溃?熟悉吗?欢迎加入那些在没有清晰工作流的Git混乱中挣扎求生的C#开发者俱乐部。
如果您认为Git只是git add .和git push,那您就错过了重点。正确的Git工作流不是宗教争论,而是一个节省神经、时间和金钱的工具。尤其是在C#的世界里,我们有解决方案文件(.sln)、项目文件(.csproj)和大量容易冲突的NuGet包。
在本文中,我将向您展示实用的分支策略、C#的真实代码示例,并告诉您如何自动化日常任务。我们开始吧!
为什么C#项目需要特殊的Git处理方法?
当您使用C#时,您处理的不仅仅是文本文件。您会遇到:
- 解决方案文件 (.sln) — 一个引用所有项目的文件。如果两个开发者同时添加新项目,合并冲突是必然的。
- .csproj 文件 — 添加NuGet包或更改目标框架时会更新的XML文件。手动合并这些文件很痛苦。
- appsettings.json 和 web.config — 通常包含连接字符串的配置文件。它们不应该被提交,但每个人都会忘记。
- bin/ 和 obj/ 文件夹 — 如果您提交一次,同事们会永远诅咒您。
因此,您的C# Git工作流必须经过深思熟虑。而这一切都始于正确的.gitignore。
步骤 1:为C#配置 .gitignore
标准的C# .gitignore可以从GitHub/gitignore下载,但我会添加一些经常被遗漏的重要行:
# 包含机密的配置文件(不要提交!)appsettings.Development.jsonappsettings.Local.jsonsecrets.json
# ReSharper 或 Rider 生成的文件*.DotSettings.user*.DotSettings
# NuGet 包(缓存)packages/*.nupkg
# 测试结果TestResults/*.trx
# Visual Studio 文件夹.vs/*.suo*.user*.sln.docstates为什么这很重要?想象一下,您提交了包含本地数据库连接字符串的appsettings.Development.json。同事拉取后,他的应用程序崩溃了,因为他没有那个数据库。这看起来像一个小疏忽,但却浪费了一个小时的工作时间。
为C#团队选择分支策略
有几种流行的Git工作流。对于C#项目,我推荐两种主要策略:Git Flow 和 Trunk-Based Development。让我们通过示例来了解它们。
选项 1:Git Flow(大型项目的经典选择)
Git Flow之于Git就像SOLID原则之于编程。当您有明确的版本发布(例如版本2.1.0、2.2.0)时,它是理想的选择。分支看起来像这样:
main— 仅包含稳定代码。develop— 集成分支。feature/XXX-123-add-new-api— 从develop分支出的功能分支。release/2.1.0— 发布准备分支。hotfix/2.0.1-critical-bug— 从main分支出的紧急修复分支。
C#示例:您正在开发一个新功能“按促销码计算折扣”。
# 从develop创建功能分支git checkout developgit pullgit checkout -b feature/ABC-42-add-promo-discount
# 编写C#代码// DiscountService.cspublic class DiscountService{ public decima