Gitee 做了这么多年,我几乎是看着它从单纯的代码托管平台一步步长成今天这个样子的。很多团队把项目放在 GitHub 上,但只有真正在国内环境里跑过迭代、搞过协作的人才会明白——Gitee 的价值绝不只是“GitHub 的国内镜像”这么简单。它更像是嵌在中国开发者工作流里的一颗螺丝钉,承载着代码、需求、缺陷、文档、CI/CD,甚至还有 Pages 静态站点。这些年我经手过的项目里,凡是交付节奏快、协作链路长的团队,几乎都绕不开它。
这篇文章我不打算写成官方文档的复读机,而是从实际使用的角度,把 Gitee 这套项目管理软件里最核心的几个模块拆开来讲,包括仓库管理、分支策略、需求关联、代码评审、Pages 部署,以及我踩过的那些坑。如果你是刚接触 Gitee,或者想把团队协作从“微信传文件 + 本地备份”的原始状态拔高到正规军水平,这篇内容应该能省下你不少摸索时间。
1. 内容整体设计与思路拆解
1.1 Gitee 到底解决的是哪一类问题
先聊一个容易被忽略的底层逻辑:Gitee 本质上解决的是“协作距离”的问题。Git 本身只是一个版本控制工具,它管的是“代码的历史”,但管不了“人怎么一起干活”。Gitee 这类平台在 Git 之上加了一层协作协议——远端仓库、权限控制、Issue 跟踪、Pull Request 审查、里程碑规划、代码片段共享。这一整套东西拼在一起,才叫项目管理软件。
国内团队选择 Gitee,最直接的原因当然是访问速度和稳定性。GitHub 在国内的访问体验我不多说,大家心里有数。但除了“用得了”和“用不了”的区别之外,Gitee 还有一个很容易被低估的细节:它的产品设计更贴近国内团队的协作习惯。比如企业版里的任务分配、周报统计、需求池管理,这些模块的使用逻辑跟国内研发团队的日常节奏是匹配的,不需要你去适应一套海外的管理哲学。
从个人开发者的角度来看,Gitee 的私有仓库免费额度已经很够用了。我自己的习惯是:开源项目放 Gitee 作为主仓库或镜像,私人实验项目直接建私有仓库,反正是免费的,随便折腾。
1.2 选定 Gitee 做项目管理平台的四个理由
很多朋友问我,为什么不做纯 GitHub 或者 GitLab 方案?我自己的判断依据就四条:
- 速度与稳定性:国内访问、推送、克隆、Pages 访问都保持在可接受范围,这个对于日常开发体验是决定性的。
- 项目管理的完整性:需求、任务、缺陷、迭代(里程碑)、仓库、文档、CI 全部在一个平台上闭环,省去在多个工具之间跳来跳去的成本。
- 中文语境与合规成本:团队内部沟通、Issue 描述、权限配置的界面语言是母语,团队成员上手成本低。
- 免费额度与协作人数:个人版免费仓库数量足够,企业版起步门槛也不高,对小团队比较友好。
这四条里面,速度和稳定性是最容易被忽视的——很多人觉得“能访问就行”,但当你团队处于高强度迭代期,一天推送几十个 commit,每次 push 都要等十几秒,那种挫败感是实打实的。我曾经带过一个项目,前端团队成员分布在多个城市,统一使用 Gitee 之后,代码拉取和推送的体验才算正常,大家才愿意把“提交代码”当成一个高频动作来做。
1.3 核心使用场景:个人、团队、企业三层的需求差异
Gitee 的使用方式其实分三个层次,我之前带团队时就发现,不同人用的深度完全不一样:
- 个人场景:主要就是托管代码、备份项目、部署 Pages 博客、收藏别人的开源项目。这个阶段 Git 操作就那么几个——clone、add、commit、push、pull,配合 README 和许可证就够了。
- 团队场景:多成员协作、分支管理、Pull Request 审查、Issue 指派与里程碑规划。这个阶段的核心是“流程”,而不是“命令”。
- 企业场景:权限分级、代码审计、发布管理、项目集统计、成员绩效透视。企业版还支持 SVN 访问方式,对老团队挺友好。
这篇文章我重点讲个人和团队阶段,因为你把这些层次吃透了,企业版的绝大多数功能本质上就是这些基础能力的权限加固和统计增强。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 仓库创建与代码托管:从零到正规军的实操路径
2.1 创建仓库时的参数选择:不该随便跳过的几个选项
创建一个仓库看起来是点几个按钮的事,但有些参数是建完就不好改的,我建议你建仓时想清楚。
第一个是仓库名称。名称一旦被其他用户占用,你就只能换个名字。团队项目我建议用“项目代号-模块名”的格式,例如 erp-web、erp-api、open-api-gateway,这样后续配置权限、写 CI 脚本时看着一目了然。
第二个是开源许可证。这个问题被问得特别多——Gitee 创建仓库时有一个“选择开源许可证”的下拉框。很多新手直接选“无”,但如果你打算把项目公开给别人用,强烈建议选一个标准许可证。我个人的经验是:
- 希望别人随便用、随便改,只要求保留版权声明——选 MIT。
- 希望代码可以被使用,但任何修改版本也必须开源——选 GPL-3.0。
- 希望代码能被商业项目无差别使用,且不希望自己承担责任——选 Apache-2.0。
- 只想公开代码但不希望别人直接拿去商用——可以考虑 AGPL-3.0 或 SSPL,但要仔细读条款。
选好许可证后,Gitee 会自动生成对应的 LICENSE 文件,省得你手动写。
第三个参数是是否初始化仓库。我习惯是创建空仓库,不要勾选“初始化仓库”,这样第一次推送时能完整走一遍 Git 流程,对团队新人来说也是很好的入门训练。如果你勾选了初始化,Gitee 会自动生成 README、LICENSE、.gitignore 等文件,后面你要推送本地已有仓库时就得先 pull 合并,反而多一步操作。
第四个参数是分支模型。Gitee 支持你在创建仓库时设置默认分支,我建议默认分支用 main,然后根据团队情况建立 develop、release、feature/*。这个在后面的分支管理部分会展开讲。
2.2 首次推送代码到 Gitee 的完整流程
这个流程我演示过无数次,这里给出一个最稳妥的版本:
bash复制# 1. 在本地项目目录初始化 Git 仓库
git init
# 2. 添加远程仓库地址(注意换成你自己的地址)
git remote add origin https://gitee.com/yourname/project-name.git
# 3. 拉取远程仓库内容(如果远端已初始化,这一步很重要)
git pull origin main --allow-unrelated-histories
# 4. 添加所有文件到暂存区
git add .
# 5. 提交
git commit -m "init project"
# 6. 推送
git push -u origin main
第一次推送时,终端会要求输入 Gitee 的用户名和密码,这里的密码并不是你登录 Gitee 的账户密码,而是私人令牌(Personal Access Token)。很多新手在这里卡住,输入登录密码一直报错。你需要在 Gitee 的个人设置里找到“私人令牌”,生成一个,然后把这个令牌当密码输入。
提示:私人令牌相当于你账号的最高权限凭证,千万别提交到代码仓库里。建议生成令牌时只勾选你需要的权限,比如项目、代码、Issue,而不是全选。
2.3 配置免密推送:再也不用每次输入密码
我刚开始用 Gitee 时也傻傻地每次 push 都输密码,后来实在受不了了才去研究免密配置。其实原则很简单——把本地的公钥放到 Gitee 账号里,后面走 SSH 协议推送就自动认证了。
具体操作:
bash复制# 1. 生成密钥对,注意指定邮箱
ssh-keygen -t ed25519 -C "your_email@example.com"
# 一路回车即可,默认保存在 ~/.ssh/id_ed25519
# 2. 查看公钥内容
cat ~/.ssh/id_ed25519.pub
复制公钥内容,打开 Gitee 的“安全设置” -> “SSH 公钥”页面,粘贴保存。
然后你把仓库地址从 HTTPS 换成 SSH:
bash复制git remote set-url origin git@gitee.com:yourname/project-name.git
之后再 push 就不会再要密码了。这里有一个坑要提醒:如果你在电脑上同时用多个代码托管平台(比如 Gitee 和 GitHub),SSH 配置要做区分。方法是在 ~/.ssh/config 里指定不同的 Host 走不同的密钥:
code复制Host gitee.com
HostName gitee.com
User git
IdentityFile ~/.ssh/id_ed25519_gitee
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
这样两边互不干扰,体验很顺滑。
2.4 分支命名与分支策略:组内协作不打架的关键
我在带团队时最头疼的不是代码冲突本身,而是分支命名不规范导致的各种混乱——今天开个 test,明天开个 fix,后天来个 123,根本分不清哪个分支对应哪个需求。
后来我们总结了一套规则,现在推荐给你:
- 需求分支:
feature/需求编号-简短描述,比如feature/1024-user-login - 缺陷分支:
bugfix/缺陷编号-简短描述,比如bugfix/2048-order-timeout - 发布分支:
release/版本号,比如release/v1.2.0 - 主分支:
main,保持稳定可发布的代码 - 开发集成分支:
develop,所有功能分支都合入这里
这套命名看起来简单,但实际效果非常好。Gitee 的 Pull Request 页面在对比分支时会显示来源和目标分支,命名清晰的话,审查者一眼就能判断这次合并的目的。
另外提醒一点,分支数量不宜过多。我见过有些团队一个项目开了三十几个分支,其实很多都是死分支。建议定期清理已经合并的分支,Gitee 支持在分支管理页面一键删除远程分支,没啥心理负担。
3. 项目管理功能的深度使用:从“管代码”到“管项目”
3.1 Issue 的正确用法:不是留言板,是协作协议
Gitee 的 Issue 模块非常强大,但很多人只是把它当成“报 Bug 的地方”,这是很可惜的。在我眼里,Issue 是一个团队协作的协议层——它把需求、缺陷、改进、问题全部结构化,并且和代码关联起来。
首先,Issue 应该有明确的类型标签。我的建议是至少建立这几个标签:
需求:新功能或者功能变更缺陷:现有功能不正常优化:性能、体验、代码质量的改进文档:文档补充或修正求助:需要讨论或帮助的问题
其次,Issue 的内容应该遵循模板。比如缺陷类 Issue 必须包含:环境信息、复现步骤、期望行为、实际行为、截图/日志。Gitee 支持你自定义 Issue 模板,新建 .gitee/ISSUE_TEMPLATE.md 文件,团队内所有人提 Issue 时就会自动套用模板。这个功能我们当时上线后,Issue 的质量提升了一大截,再也没出现过“这个不行,你看一下”这种一句话缺陷。
第三,Issue 与提交记录要关联。你在 commit 消息里写 #123,Gitee 会自动把这条提交关联到编号为 123 的 Issue 上。如果 commit 消息里写 fix #123,那么当这个提交被合并到默认分支时,Gitee 还会自动关闭这个 Issue。这个机制非常实用,可以实现“提交代码即关闭问题”的自动化流转。
3.2 里程碑规划:把“deadline”变成看得见的进度
里程碑是我最喜欢的模块之一。它本质上是对 Issue 和 Pull Request 的时间维度聚合。你现在可以创建一个里程碑,命名“v1.2 版本迭代”,设置开始时间和截止时间,然后把相关的 Requirement 和 Bug Issue 都归到这个里程碑下。
这样做的好处是什么?
- 冲刺目标非常清晰,团队成员打开里程碑就能看到剩余工作量。
- 进度可视化,Gitee 会统计该里程碑下已完成/未完成的 Issue 数量,一眼就能判断是否延期。
- 发布时能自动生成版本说明——里程碑里合并进代码关联的 Issue 就是天然的 changelog。
创建里程碑的方式很简单:项目主页 -> 里程碑 -> 新建里程碑。建议每个迭代周期建一个,别贪多,一期一个就够了。
3.3 Pull Request 与代码评审:把“背锅”变成“把关”
Pull Request(简称 PR)在国内团队里的推行程度其实不如国外,尤其是小团队,经常是直接 push 到主分支。但我要说:如果你希望团队代码质量上一个台阶,代码评审是绕不开的一环。
Gitee 的 Pull Request 流程是这样的:开发者在自己的功能分支上完成代码,然后向目标分支(通常是 develop 或 main)发起 Pull Request,指定审查者。审查者可以在 Gitee 的页面里逐行评论、提出修改意见,开发者看到意见后继续在功能分支上提交代码,PR 会自动更新,直到审查者同意合并。
这里有几个实操建议:
- PR 描述里要写清楚“改了什么、为什么改、怎么测试”。不要只写一句“fix bug”。
- PR 尽量做小,一个 PR 解决一个问题,别攒一堆改动然后一次性提交。小 PR 审查效率高,冲突概率低,回滚也方便。
- 设置最低审查人数。Gitee 企业版支持最少一人审查通过才能合并,这能保证每次合并都有人看过。
- 开启“合并前需要 CI 通过”这个选项。哪怕你现在的 CI 只有一个链接检查,也比没有强。
3.4 热门问题:Gitee 创建 Issue 时验证码错误
这个问题在热词里出现过,我也遇到过,挺吊诡的一个 bug——你明明按照图片里的字符输对了,系统还是提示“验证码错误”。
我排查后的结论是:这多半是浏览器自动填充或者缓存干扰导致的。图片验证码往往是一次性的,当你点击提交后,验证码已经失效,再点一次提交就会报错。解决办法很简单——刷新验证码,重新输入,然后立刻点击提交,中间不要做其他操作。如果一直报错,换个浏览器清除缓存,或者用浏览器的无痕模式再试一次。
4. Gitee Pages 静态站点托管:个人博客与文档站的轻量方案
4.1 Pages 服务的定位:能干什么,不擅长什么
Gitee Pages 是 Gitee 提供的一个静态网站托管服务,支持从仓库直接部署,绑定自定义域名。对个人开发者来说,最经典的用途就是搭建个人博客、项目文档站、简历站。
但你需要先搞清楚它的边界:它只支持静态文件(HTML/CSS/JS),不支持服务端脚本,也不支持数据库。这意味着你没法部署一个需要后端逻辑的应用。不过,对于博客、文档、个人主页这种纯展示型站点来说,完全够用。
我个人建议配合 Hexo、Hugo 或者 VuePress 使用。本地生成静态文件,推送到一个专门建好的仓库,然后在 Pages 里一键部署,整个过程十分钟以内。
4.2 部署 Pages 的两种方式
Gitee Pages 的部署分为手动部署和自动部署两种。
手动部署流程:
- 新建一个仓库,仓库名建议和你的 Pages 域名保持一致,例如
username.gitee.io。 - 把本地构建好的静态文件推送到仓库的
main分支。 - 在仓库页面找到“服务” -> “Gitee Pages”。
- 选择部署分支为
main,点击启动。 - 等待几分钟,系统会分配一个
https://username.gitee.io的地址。
启动后发现页面没有更新?这种问题大多是部署没刷新。手动部署模式不会自动监听推送,你每次更新完代码后,需要回到 Pages 服务页面点击“更新”按钮。
自动部署的方式是:在仓库里配置 .workflow 流水线,在代码推送到指定分支后自动触发 Pages 构建。不过这个模式需要认真读一下官方文档,因为配置路径会调整。我的经验是:如果你只是搭建个人博客,手动部署也够了,自动部署更适合文档类站点频繁更新的场景。
4.3 关于“Gitee Pages 没有了吗”的热议
最近不少人在问“Gitee Pages 没有了吗”,我查了下情况——Pages 服务还在,但部署和更新机制经历了一些调整,尤其是“付费用户优先部署”的规则上线后,很多免费用户反映部署排队时间变长了,或者部署不能立即生效。
这里要澄清一下:服务本身仍然是开放的,免费用户也依然可以使用,但是会有排队等待或需要手动触发更新的情况。对于个人搭建博客的开发者来说,这个限制其实不影响核心使用——你部署完成后页面是稳定在线的,只是更新频率和时效变差了。
我的建议是:如果你是重度使用 Pages 的用户,并且不能接受排队部署,可以走一条双保险路线。主站部署到支持自动构建的平台,Gitee Pages 作为国内访问的加速/备份入口。或者直接给 Pages 绑定自己的域名,这样即使仓库地址有变化,对外访问地址不变。
5. 常见问题与高频故障排查
5.1 Git clone / push 时提示 “git did not exit cleanly”
这是我在帮助新人排查时遇到的高频问题之一。实际上这个报错是 Git 客户端对一系列底层错误的一个“笼统且没有营养”的封装,真正的错误信息往往在它上面几行。
排查步骤:
- 先看完整报错,找
fatal:开头的行,那才是真正的错误原因。 - 最常见的原因是网络/SSL 问题。你可以试着把远程地址中的
https://改成http://,或者换成 SSH 地址。 - 如果是认证失败,检查你是否输入了正确格式的私人令牌,而不是登录密码。
- 如果你使用 Gitee 桌面端或 IDE 集成插件(比如 VSCode 的 Git 插件)出现这个报错,先回终端里手动敲一遍 git 命令,能定位出到底是环境问题还是插件问题。
5.2 VSCode 里推送代码到 Gitee 总失败
很多人习惯在 VSCode 里面操作 Git,但遇到推送失败时,VSCode 返回的报错信息非常有限。我的建议是:不要把 VSCode 当成 Git 终端,而是把它当成可视化辅助。遇到报错时,在 VSCode 里打开内置终端,手动执行推送命令,看完整输出。
VSCode 推送失败的常见原因还有几个:远程仓库地址写错了、分支名不一致(本地是 master,远程是 main)、本地 commit 没有配置用户名和邮箱。一次性排查:
bash复制git remote -v
git branch -a
git config user.name
git config user.email
5.3 仓库里的文件夹能不能直接复制到另一个仓库
热词里有“gitee 文件夹可以复制到另外一个文件夹吗”,这个问题的答案分两种情况:
- 只是复制代码文件:直接拷贝文件夹,进去后删掉
.git目录,再git init并关联新仓库即可。 - 要保留完整提交历史:别手动拷贝,用
git clone --bare或者git remote add的方式同步。我在迁移项目时最常用的做法是:
bash复制# 旧仓库添加新远端
git remote add new-origin https://gitee.com/yourname/new-repo.git
# 推送所有分支到新仓库
git push new-origin --all
# 推送所有标签
git push new-origin --tags
这样新旧仓库之间不仅代码一致,提交历史也完整保留。
5.4 开源许可证到底选哪个:一张表说清楚
每个刚开始做开源项目的人都会纠结这个问题。这里我按“你希望别人怎么用你的代码”这个维度来分类,直接给结论:
| 许可证 | 允许商用 | 修改后必须开源 | 必须保留版权声明 | 适合场景 |
|---|---|---|---|---|
| MIT | 是 | 否 | 是 | 希望最大范围内被使用的工具库、模板 |
| Apache-2.0 | 是 | 否 | 是 | 需要明确专利授权的大项目 |
| GPL-3.0 | 是 | 是 | 是 | 希望代码衍生项目也保持开源 |
| AGPL-3.0 | 是 | 是(含网络服务) | 是 | 希望防止 SaaS 厂商白嫖代码 |
| BSD-3-Clause | 是 | 否 | 是 | 类似 MIT,但附带禁止署名背书条款 |
新人我一般推荐 MIT 或 Apache-2.0,条款少、限制少、也最不容易踩法律坑。GPL 系列虽然保护性强,但会“劝退”很多商业用户,如果你希望项目被公司采用,选宽松许可证更好。
5.5 克隆自己私有仓库时提示权限不足
这个问题的根源在于你使用的认证方式没有权限,或者凭据不对。如果项目是私有仓库,克隆时同样要使用 SSH 公钥或私人令牌。另外要注意:只有仓库成员或拥有者才能克隆私有仓库。如果你是一个组织里的成员,但组织管理员没有给你该仓库的读取权限,同样会报权限不足。
排查方式:在浏览器里登录 Gitee 打开该仓库看能不能正常访问;能访问,说明账号权限没问题,问题出在本地认证方式上;不能访问,就去找管理员开权限。
6. 团队落地 Gitee 的几点实战建议
6.1 别一口气上全套功能,循序渐进
我见过不少团队把 Gitee 企业版买下来后,要求所有人马上用全套功能,结果两周后大家又回到私下传代码的老路。原因很简单——流程复杂了,但没有让开发者切身体会到好处。
我的建议是分三个阶段落地:
- 第一个月:只要求代码全部推到 Gitee,分支模型统一,禁止直接 push 到 main。这个阶段先把代码托管习惯养成。
- 第二个月:要求所有功能迭代都通过 Pull Request 合入,指定固定审查人。先跑起来,不做强约束。
- 第三个月:开始建立 Issue 跟踪和里程碑规划,需求从提出到发布全部在 Gitee 上流转。
每一步都“落后一步”其实是最稳的节奏,因为开发者接受新工具的核心不是“学会操作”,而是“形成肌肉记忆”。
6.2 建议配置一份团队级 README
仓库里的 README 不只是给开源社区看的,也是团队沟通的最小文档单元。我建议每个仓库的 README 至少包含五块内容:
- 项目简介:一句话说清楚这个项目是干什么的。
- 技术栈:语言、框架、数据库、中间件版本。
- 本地开发步骤:克隆后怎么跑起来。
- 目录结构:核心模块在哪。
- 团队规范:分支命名、提交流程、代码风格。
团队里任何一个新人,拿到仓库先看 README,就能独立把项目跑起来,这个文档的杠杆效应会非常明显。
6.3 不要把秘密放进仓库
最后提醒一个硬性规定:任何环境变量、密钥、数据库连接串、云服务凭证都不允许提交到 Git 仓库里,哪怕是私有仓库也不行。仓库会被克隆、被分发、被导出,一旦密钥泄露,影响面会不可控。
建议做法是:代码里统一读取环境变量,本地环境变量放在 .env 文件里,并且确保 .gitignore 中忽略 .env。如果发现密钥已经提交上去了,不要只删除然后提交一次——密钥已经进入历史记录了,必须去平台侧重置密钥。该重置就重置,别嫌麻烦。
写在最后
说实话,Gitee 这些年给我的最大感受是“踏实”。它不像某些新工具那样三天两头刷存在感,但项目协作需要的核心能力它一样没落下——代码、需求、缺陷、评审、Pages、CI,全链路打通之后,团队协作的信息损耗会明显降下来。我自己带项目的习惯是:所有围绕代码的讨论,能落进 Issue 就不在聊天工具里说,因为聊天记录会沉底,Issue 永远留在那里可追溯。
如果你现在还在用“网盘同步代码”或者“导出压缩包 + 微信传输”这种方式做协作,我诚恳建议你花半小时在 Gitee 上建一个仓库,把项目推上去,再建一个里程碑试试。等同事问你“这个文件是谁改的”的时候,你直接甩一条提交记录过去——那种感觉,比解释半天有说服力多了。
