前言

之前一直手动将代码推送到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(代码读写)权限

排查思路:

  1. 确认你的 cnb 账号是仓库的成员,而不是只有访客权限
  2. 如果用的是访问令牌(Access Token),去 cnb 平台检查 token 是否勾选了代码读写权限
  3. 如果之前登录过其他账号,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 里写完代码,直接在源代码管理面板点一下提交和推送,就不用再手动上传了。