前言
之前一直手动将代码推送到cnb上,有点麻烦,所以就想着用git的方式推送,今天就尝试一下,并且记录。
整个过程踩了两个坑:一个是凭据权限不够报 403,一个是本地与远程历史不一致被拒绝推送,最后用 --force 解决。下面把完整流程记录下来。
准备工作
1. 安装 Git
去 git-scm.com 下载安装 Git,安装时保持默认选项即可。装好后打开终端验证:
git --version
能输出版本号就说明安装成功。
2. 在 cnb 上创建仓库
登录 cnb.cool,点击新建仓库,填好仓库名(比如 astro-blog),创建完成后会得到一个仓库地址,类似:
https://cnb.cool/你的用户名/仓库名.git
这个地址就是等下要关联的远程仓库。
3. 配置身份信息(可选但建议)
首次使用 Git 建议先设置用户名和邮箱,这样提交记录里才会显示正确的作者:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
步骤
1. 本地仓库关联远程
在项目根目录打开终端,先初始化本地仓库(如果项目还没有的话):
git init
然后把本地仓库和远程仓库关联起来:
git remote add origin https://cnb.cool/你的用户名/仓库名.git
关联后可以用 git remote -v 查看是否成功,会输出 fetch 和 push 两个地址。
2. 提交本地代码
git add .
git commit -m "首次提交"
3. 推送代码
git push -u origin main
-u 的意思是设置上游分支,以后在本地直接 git push / git pull 就行,不用再写 origin main。
踩坑记录
坑一:推送报 403 权限不足
第一次执行 git push 时,终端直接报错:
remote: Your token does not have repo-code:rw permission to push this repository.
fatal: unable to access 'https://cnb.cool/xxx/astro-blog.git/': The requested URL returned error: 403
意思是当前使用的凭据没有该仓库的 repo-code:rw(代码读写)权限。
排查思路:
- 确认你的 cnb 账号是仓库的成员,而不是只有访客权限
- 如果用的是访问令牌(Access Token),去 cnb 平台检查 token 是否勾选了代码读写权限
- 如果之前登录过其他账号,Windows 会缓存旧凭据,需要在凭据管理器里删除重新登录
Windows 凭据管理器打开方式:控制面板 → 凭据管理器 → Windows 凭据,找到
git:https://cnb.cool相关的条目删掉即可。
删掉凭据后重新推送,会弹出登录窗口,用有权限的账号登录就能通过了。
坑二:推送被拒绝 (fetch first)
权限解决后再次推送,又报错:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://cnb.cool/xxx/astro-blog.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally.
这是因为远程仓库有本地没有的提交(比如网页端初始化自动生成的 README,或者之前推送过其他内容)。Git 为了安全,不允许直接覆盖远程历史。
解决方式有两种:
方式一:正常合并(推荐)
git pull origin main --rebase
git push -u origin main
先把远程的提交拉下来接到本地提交后面,再推送。
方式二:强制覆盖(慎用!)
git push -u origin main --force
--force 会用本地内容直接覆盖远程,远程上原有而本地没有的提交会永久丢失。只有在确认远程的提交都没价值时才建议使用。
我当时确认远程只有初始化时自动生成的无用文件,所以直接用了方式二。
总结
整个流程其实很简单,核心就三步:关联远程、本地提交、推送。真正花时间的是两个坑:
- 403 权限问题:检查凭据和 token 权限,必要时清理 Windows 凭据管理器重新登录
- fetch first 拒绝:远程与本地历史不一致,
--force能解决但会丢远程数据,能合并就尽量合并
学会之后,以后在 VS Code 里写完代码,直接在源代码管理面板点一下提交和推送,就不用再手动上传了。