Gitee、GitHub、GitLab 代码托管平台选型与 Git 推送避坑指南 简介这份资源围绕 Gitee、GitHub 与 GitLab 三大主流代码托管平台展开面向刚接触 Git 版本控制、需要完成代码托管与团队协作的开发者与运维初学者。内容以实操为主线覆盖远端仓库新建、本地仓库推送、git clone 拉取、分支指定以及基于 SSH 密钥对的免密 push 配置流程帮助读者打通从本地提交到远端托管的完整链路。资源包共 1 个 docx 文档约 5.29MB以图文笔记形式整理命令与操作说明便于边看边练、随时查阅。目前已有 74 人学习关注适合作为 Git 入门与多平台托管对照的参考材料也可用于排查推送失败、认证异常等常见问题快速建立对代码托管工作流的整体认知。1. 从一次「推不上去」的深夜排查说起Gitee、GitHub、GitLab 到底怎么选上周帮同事看一个推送失败的问题现象很典型git push卡在Writing objects之后报403但git clone同一个仓库却一切正常。折腾半小时才定位到——他之前为了图省事把远端地址从 SSH 换成了 HTTPS而本地git config --global里缓存的是另一个账号的凭据。这类问题在 Gitee、GitHub、GitLab 三个平台之间来回切换时特别高频因为它们的认证模型、默认分支名、私有仓库策略都不一样。这份资源把三个主流代码托管平台放在一起讲核心价值不是「教你注册账号」而是把「本地仓库怎么和远端对上」「免密怎么配」「分支怎么合」这条链路走通。它适合两类人一是刚接触 Git、需要把本地代码托管到远端的开发者二是已经在用某个平台、但换平台或换认证方式时反复踩坑的熟手。下面我按「平台差异 → 本地到远端 → 免密与分支 → 避坑 → 进阶」的顺序拆开讲每一步都落到能直接抄的命令上。2. Gitee、GitHub、GitLab 的平台差异与选型别等推不上去才后悔2.1 三个平台的定位与私有仓库策略选平台这件事很多人是「别人用啥我用啥」结果到了要建私有仓库时才发现要付费。先把三者的基本盘摆清楚平台私有仓库典型场景认证方式Gitee免费版有数量限制超出需付费国内访问快个人项目、教学演示HTTPS 账号密码 / SSH 公钥GitHub免费版私有仓库数量不限开源生态最全CI/CD 集成成熟HTTPS Token / SSH 公钥GitLab自建社区版功能完整SaaS 版按席位企业内网部署、私有 CI/CDSSH 公钥 / 个人访问令牌Gitee 的优势在于国内网络环境下clone和push的响应速度适合做日常代码备份和课程作业托管。GitHub 的强项是生态大量开源项目和 Actions 工作流都默认跑在上面。GitLab 则是企业自建的首选尤其是需要把代码托管和 CI 流水线放在同一套系统里的团队。提示私有仓库的「免费」是有边界的。Gitee 免费版对私有仓库的成员数和仓库数有约束GitHub 免费版私有仓库不限制数量但协作者席位有限制GitLab 自建版则取决于你部署的版本和许可证。选之前先确认你的协作规模。2.2 本地仓库初始化与远端关联的完整链路不管选哪个平台本地到远端的链路是一样的初始化本地仓库 → 提交 → 关联远端 → 推送。以 Gitee 为例完整走一遍# 1. 初始化本地仓库 git init GitTest cd GitTest # 2. 创建第一个文件并提交 vim hello.py # 写入 print(hello world) git add hello.py git commit -m 提交 hello.py # 3. 关联远端仓库先在 Gitee 网页端新建一个空仓库 git remote add origin https://gitee.com/gyl_er/test.git # 4. 推送到远端主干分支 git push -u origin master这里有几个参数值得说清楚。git remote add origin里的origin是远端的默认别名你可以改成别的名字但后续所有命令都要跟着改所以一般不动它。git push -u origin master里的-u是--set-upstream的简写作用是把本地master分支和远端origin/master绑定绑定之后下次直接git push就行不用再写后面那一串。master是主干分支名GitHub 现在默认是main如果你在 GitHub 上建仓库时选了main这里就要改成git push -u origin main写错了会报src refspec master does not match any。2.3 从远端克隆到本地的两种方式克隆是把远端仓库完整拉到本地命令本身很简单# HTTPS 方式克隆 git clone https://gitee.com/gyl_er/testt.git # SSH 方式克隆需要先配好公钥 git clone gitgitee.com:gyl_er/testt.gitHTTPS 方式第一次执行会要求输入远端平台的用户名和密码之后凭据会被缓存取决于系统的 credential helper 配置。SSH 方式则依赖本地私钥和远端公钥的配对配好之后完全免密。克隆默认会创建一个和仓库同名的目录如果你想把内容放到指定目录可以在地址后面加目录名比如git clone https://gitee.com/gyl_er/testt.git myproject。克隆完成后ls一下能看到仓库里的文件已经全部落到本地。这时候git remote -v可以查看当前关联的远端地址确认是 HTTPS 还是 SSH这个习惯在排查推送问题时特别有用。3. SSH 免密配置与分支操作把「每次输密码」这件事彻底干掉3.1 生成密钥对并配置到远端平台免密 push 的本质是 SSH 免密登录本地生成一对密钥私钥自己留着公钥交给远端平台。第一步是生成密钥对# 配置全局用户名和邮箱提交记录里会显示这些信息 git config --global user.name your_name git config --global user.email your_emailexample.com # 生成 RSA 密钥对-C 后面跟的是注释一般填邮箱 ssh-keygen -t rsa -C your_emailexample.com执行ssh-keygen后会提示输入保存路径直接回车用默认的/root/.ssh/id_rsa或~/.ssh/id_rsa。如果该路径已有文件会问你是否覆盖输入y。接着会问passphrase直接回车两次留空这样后续使用就不需要再输密码。生成完成后私钥在id_rsa公钥在id_rsa.pub。第二步是把公钥内容复制出来cat ~/.ssh/id_rsa.pub输出的内容以ssh-rsa开头以邮箱结尾整行复制。然后到 Gitee 或 GitHub 的「设置 → SSH 公钥」页面粘贴进去保存。GitLab 在「用户设置 → SSH Keys」里。第三步是验证配置是否生效ssh -T gitgitee.com如果返回Hi xxx! Youve successfully authenticated说明公钥配置成功。这里有个细节Gitee 返回的提示里会带一句does not provide shell access这是正常的不代表配置失败只是平台不提供交互式 shell。3.2 切换远端地址实现免密推送公钥配好之后还需要把远端的关联地址从 HTTPS 换成 SSH否则推送时走的还是账号密码那条路。操作如下# 查看当前远端地址 git remote -v # 删除旧的 HTTPS 远端 git remote rm origin # 添加 SSH 远端 git remote add origin gitgitee.com:gyl_er/testt.git # 推送并绑定分支 git push -u origin master第一次用 SSH 地址克隆或推送时会看到一段The authenticity of host gitee.com cant be established的提示问你是否继续连接。输入yes回车即可之后这个主机指纹会被写入known_hosts不再重复询问。这一步的ECDSA key fingerprint是平台的服务端指纹确认地址无误后放心输入yes。3.3 分支创建、切换与推送到指定分支实际开发中很少直接在主分支上改代码常见做法是拉一个开发分支# 同步远端最新代码 git pull # 创建并切换到 dev 分支 git branch dev git checkout dev # 或者用一条命令完成创建加切换 git checkout -b dev # 在 dev 分支上开发 echo 新功能 new.py git add new.py git commit -m 增加了发红包功能 # 推送到远端 dev 分支 git push -u origin devgit branch dev只创建不切换git checkout dev才切换过去两步合起来就是git checkout -b dev。推送时git push -u origin dev会把本地dev和远端origin/dev绑定输出里会显示Branch dev set up to track remote branch dev from origin说明绑定成功。之后在这个分支上直接git push就会推到远端dev。3.4 通过 Pull Request 合并分支分支推上去之后需要把dev的改动合回master。Gitee 和 GitHub 都提供 Pull RequestGitLab 叫 Merge Request机制在仓库页面点击「Pull Requests」→「新建 Pull Request」源分支选dev目标分支选master填写标题和说明可以指定审查人员确认变更文件无误后点击「创建」进入 PR 详情页点击「合并」完成分支同步合并完成后master分支就包含了dev上的改动。如果合并时提示冲突说明两个分支改了同一处代码需要先在本地解决冲突再推送。常见做法是本地git checkout master、git pull、git merge dev手动解决冲突文件后提交再推送到远端。4. 避坑与排查那些让你怀疑人生的报错4.1 push 报 403 或认证失败现象git push时提示403 Forbidden或Authentication failed但git clone正常。原因远端地址是 HTTPS本地缓存的凭据是另一个账号的或者 GitHub 已经不支持密码认证必须用 Token。解决先git remote -v确认地址。如果是 HTTPS要么换成 SSH 地址git remote set-url origin git...要么清除凭据缓存后重新输入。GitHub 用户需要在设置里生成 Personal Access Token用它代替密码。4.2 SSH 验证报 Permission denied现象ssh -T gitgitee.com返回Permission denied (publickey)。原因公钥没有正确添加到平台或者本地私钥和平台上的公钥不匹配也可能是ssh-agent没有加载私钥。解决先cat ~/.ssh/id_rsa.pub确认公钥内容和平台上粘贴的是否一致。然后ssh-add ~/.ssh/id_rsa把私钥加入 agent。如果还不行用ssh -vT gitgitee.com看详细日志重点看Offering public key那几行。4.3 推送时提示分支不匹配现象git push -u origin master报src refspec master does not match any。原因本地分支名和远端默认分支名不一致。GitHub 现在默认main本地如果还是master就会对不上。解决先git branch看本地分支名再git branch -r看远端分支名。如果远端是main把推送命令改成git push -u origin main或者本地重命名分支git branch -m master main后再推。4.4 克隆时卡住或速度极慢现象git clone大仓库时进度条长时间不动或者Receiving objects卡在某个百分比。原因网络链路问题或者仓库体积过大导致单次传输超时。解决可以先用git clone --depth 1只拉最近一次提交减少传输量。如果只是某个平台慢换另一个平台的镜像地址试试。企业内网环境可以配置 GitLab 自建实例把仓库放在内网。4.5 合并分支时冲突处理不当现象Pull Request 显示This branch has conflicts that must be resolved无法自动合并。原因源分支和目标分支修改了同一文件的同一区域Git 无法自动决定保留哪个。解决本地切到目标分支git pull拉最新代码然后git merge 源分支手动编辑冲突文件文件里会有和标记保留需要的代码后git add再git commit最后推送。处理完再回到平台刷新 PR 页面冲突提示会消失。5. 进阶技巧用一条命令看清仓库状态以及我踩过的那些坑5.1 用 git remote -v 和 git branch -vv 快速定位问题排查推送问题时我习惯先跑这两条命令# 查看远端地址和别名 git remote -v # 查看本地分支与远端分支的追踪关系 git branch -vvgit remote -v会列出所有远端别名和对应的地址一眼就能看出当前用的是 HTTPS 还是 SSH。git branch -vv会显示每个本地分支追踪的远端分支以及本地是否领先或落后。比如输出里[origin/dev: ahead 2]表示本地dev比远端多两个提交还没推[origin/master: behind 3]表示远端有 3 个提交本地还没拉。这两条命令配合使用大部分「推不上去」和「拉不下来」的问题都能在 10 秒内定位方向。5.2 多平台共存时的配置隔离同时用 Gitee、GitHub、GitLab 的人会遇到一个问题全局user.name和user.email只能配一套但不同平台可能想用不同的身份。解决办法是在单个仓库里覆盖全局配置# 进入某个仓库后单独配置这个仓库的用户信息 git config user.name work_name git config user.email work_emailcompany.com # 查看当前生效的配置 git config --listgit config不加--global时只对当前仓库生效加了--global才是全局。这样你可以全局配个人邮箱在公司的 GitLab 仓库里单独配工作邮箱提交记录就不会串。5.3 SSH 多密钥管理如果你在 Gitee 和 GitHub 上用了不同的密钥对需要在~/.ssh/config里做区分# ~/.ssh/config 文件内容 Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_rsa_gitee Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa_github这样ssh -T gitgitee.com会自动用id_rsa_giteessh -T gitgithub.com用id_rsa_github互不干扰。配置完之后用ssh -T分别验证两个平台都返回成功就说明隔离生效了。5.4 一个我反复踩过的坑早期我图省事所有平台都用同一个密钥对结果有一次在 GitHub 上删了旧公钥重新生成忘了同步更新 Gitee 上的公钥导致 Gitee 推送一直报Permission denied。排查了半天才想起来是密钥换了但平台没更新。从那以后我每次重新生成密钥都会强制走一遍ssh -T验证三个平台确认每个都返回successfully authenticated才继续干活。这个习惯帮我省了不少深夜排查的时间。希望这些内容帮到你少走几个弯路。本文还有配套的精品资源点击获取