Git 速通与首次推送
从本地一行 commit 到把代码送上 GitHub——建立「本地 ↔ 远程」的心智模型
五分钟内,让你的项目出现在 github.com 上代码只在本地
你的项目跑得挺好,但它只活在你这台电脑上
换台电脑就没了
你在宿舍写完作业,第二天去机房想接着干——代码不在那台机器上。U 盘拷来拷去,版本乱了套。
没法给别人看
老师让你交一个「项目链接」,你只能把文件夹打包成 zip 发邮件。没有历史,没有结构,也不专业。
不知道怎么传上去
你注册了 GitHub,点 New repository 卡住了——SSH 是什么?PAT 又是什么?认证这一关就把人劝退。
Git 的基本操作(你已会)快速过,重点解决「怎么连上远程」和「认证怎么配」。
开始之前
适合谁
- 已经在本地用过
git add/git commit,但没往远程推过 - 注册了 GitHub 账号,却不知道下一步该干嘛
- 被 SSH key、PAT、
remote这些词绕晕了的人
你将学会
- 用两条命令把本地仓库连上 GitHub
- 在 SSH key 和 PAT 之间做选择并配置好
- 完成第一次
git push - 看懂 push 失败的常见报错并修复
本章暂不覆盖
- 分支与合并(第 03 章 Pull Request)
- clone 别人的仓库(第 02 章)
- 团队协作工作流(第 05 章)
两个仓库
理解 Git 的核心:本地仓库与远程仓库是两份独立的副本

图:本地仓库与远程仓库的关系
【AI 生图提示词】请生成一张中文技术示意图,风格简洁、配色柔和、适合教学: - 画面主体:左侧一台笔记本电脑(标注「本地仓库 .git」),右侧一朵云(标注「远程仓库 GitHub」) - 各元素关系:两个图标之间有两条箭头,上方箭头从左到右标「push 推送」,下方箭头从右到左标「pull 拉取」 - 关键标注:本地笔记本下方标「git commit 在这里发生」,云端下方标「github.com/你的用户名/仓库」 - 配色建议:浅灰背景,笔记本用深蓝,云用橙色描边,箭头用深色,文字清晰 - 画面比例:16:9 - 避免:3D 效果、过度装饰、复杂图标
git commit,改动只存在本地。git push 才是把本地的提交同步到 GitHub。所以——commit 了但没 push,换台电脑一样看不到。这是新手最常踩的坑。
Git 三件套
你已经会了,这里只做 30 秒回顾,对齐术语
| 命令 | 作用 | 大白话 |
|---|---|---|
git init |
初始化仓库 | 在这个文件夹里开启 Git 管理,生成隐藏的 .git |
git add |
把改动加入暂存区 | 把要提交的文件「装进盒子」 |
git commit |
创建一次提交 | 把盒子封口、贴标签,存进本地历史 |
$ git init
$ git add .
$ git commit -m "第一次提交"
在 GitHub 建仓库
登录 github.com,右上角 + → New repository
必填项
- Repository name:用小写英文+连字符,如
my-first-project - Public / Private:Public 任何人可见,Private 只有你和协作者
先不要勾这些
- ❌ Add a README file
- ❌ Add .gitignore
- ❌ Choose a license
因为你的本地仓库已经有内容了。勾选这些会在远程生成初始提交,导致首次 push 时历史冲突。空仓库最好对接。
failed to push some refs。新手在这里卡很久。记住:本地有内容,远程就留空。
拿到仓库地址
建好后,GitHub 会给你一个地址,长这样
HTTPS 地址
https://github.com/用户名/仓库名.git
用 PAT(个人访问令牌)认证。新手友好,跨平台无配置。
SSH 地址
git@github.com:用户名/仓库名.git
用 SSH key 认证。配好后免密,长期最省心。
Code 按钮 → 弹出框顶部两个标签 HTTPS / SSH 切换 → 右侧复制按钮。把地址记下来,下一步要用。
认证二选一
GitHub 早就不允许密码推送了,必须用 PAT 或 SSH key
| 方式 | 配置难度 | 日常体验 | 推荐场景 |
|---|---|---|---|
| PAT (HTTPS) | 简单,网页生成 | 首次要粘贴令牌 | 新手、临时用、多机器 |
| SSH key | 中等,命令行生成 | 一次配好永久免密 | 长期主力开发 |
等你确定会长期用 Git,再花十分钟配 SSH key(第 10 章安全实践会系统讲)。
生成 PAT
Personal Access Token,本质是一串代替密码的令牌
在哪生成
GitHub 右上角头像 → Settings → 左侧最下方 Developer settings → Personal access tokens → Tokens (classic) → Generate new token (classic)
关键设置
- Note:写用途,如「我的笔记本」
- Expiration:选 90 天或自定义
- Scopes:勾选
repo(完整仓库读写)
不要把令牌写进代码或截图发给别人——它等同于你的密码。
关联并推送
在本地仓库目录下,依次执行这三步
# 1. 关联远程仓库(把 GitHub 地址记作 origin)
$ git remote add origin https://github.com/用户名/仓库名.git
# 2. 重命名默认分支为 main(GitHub 现在默认用 main)
$ git branch -M main
# 3. 首次推送,-u 把本地 main 和远程 main 绑定
$ git push -u origin main
认证通过后,凭证会被系统记住,之后 push 不用再输。
在 GitHub 上确认
刷新仓库页面,你的文件应该出现了
检查清单
- 文件列表与本地一致
- 能看到刚才的 commit 消息和时间
- 分支名显示为
main
后续推送简化
因为 -u 已经绑定了上游,之后提交只需:
$ git add .
$ git commit -m "改动说明"
$ git push
不用再写 origin main。
排错:认证失败
推送时报 Authentication failed 或 403
原因一:用了登录密码
GitHub 2021 年起禁止密码推送。修复:改用 PAT 粘贴到密码栏。
原因二:PAT scope 不够
生成时没勾 repo。修复:重新生成令牌,勾上 repo 全选。
原因三:令牌过期
有过期时间的令牌到期了。修复:重新生成并更新系统凭证。
git:https://github.com 删除;macOS 用 git credential-osxkeychain erase。下次 push 会重新弹出认证窗口。
排错:被拒推送
报 non-fast-forward 或 rejected
典型原因
远程有你本地没有的提交——最常见是建仓库时勾了 README,远程多了一个初始 commit。
Git 出于安全,拒绝你的 push,怕覆盖别人的工作。
修复方法
先把远程的拉下来合并,再 push:
$ git pull origin main --allow-unrelated-histories
$ git push
--allow-unrelated-histories 允许合并两条没有共同起点的历史。
SSH 免密方案
如果你打算长期用 Git,花十分钟配一次,之后永久免密
# 1. 生成密钥对(一路回车用默认值)
$ ssh-keygen -t ed25519 -C "你的邮箱@example.com"
# 2. 复制公钥内容
$ cat ~/.ssh/id_ed25519.pub
# 3. 到 GitHub → Settings → SSH and GPG keys → New SSH key 粘贴
# 4. 测试连接
$ ssh -T git@github.com
git remote set-url origin git@github.com:用户名/仓库名.git之后 push/pull 全部走 SSH,不再需要 PAT。
两种方式怎么选
不存在谁更高级,只看你的使用场景
| 场景 | 推荐 | 理由 |
|---|---|---|
| 第一次跑通流程 | PAT | 网页点几下就能用,不用碰命令行 |
| 自己长期开发 | SSH | 一次配置,多台机器复用,最省心 |
| 在别人电脑临时用 | PAT | 用完可在 GitHub 一键撤销令牌 |
| CI/CD 自动化 | PAT 或 deploy key | 令牌可限定权限和有效期 |
两种方式可以随时切换,不冲突。详细的安全考量见第 10 章。
动手试一试
把一个本地小项目推上 GitHub
你的任务
任务:在本地建一个文件夹,写一个 hello.txt,把它推送到 GitHub 上的新仓库。
要求:
- 本地
git init并完成首次 commit - 在 GitHub 建空仓库(不勾 README)
- 用 PAT 或 SSH 完成首次 push
- 刷新 GitHub 页面确认文件出现
提示
- 忘了命令?回头看第 10 张幻灯片的三步
- 认证失败?回第 12 张幻灯片对照排查
小结
你已经把本地代码推上了 GitHub——最难的第一步跨过去了
本章要点
- 本地仓库与远程仓库是两份副本,
commit在本地,push才同步 - 认证二选一:PAT(新手友好)或 SSH key(长期省心)
- 首次推送三步:
remote add→branch -M main→push -u - 本地有内容时,远程仓库留空,避免历史冲突