万字长文 |超详细的 GitHub 教程,从入门到精通

GitHub 是全世界程序员放代码的地方,也是你能白嫖别人代码的地方。
先说清楚一件事,不然后面很多话会读不懂:Git 和 GitHub 是两个东西。
很多新手把它们当同一个词用。然后在第一次提交代码的时候,卡在一个我根本没想到的地方——他以为装完 Git 就能直接 push 了。
这篇按顺序讲,跟着走完,你能建仓库、能提 PR、能看懂一个陌生项目的源码、还能白嫖一个网站和一台服务器!
目录
一、Git ≠ GitHub
两者说明:Git 是装在你电脑上的版本管理工具,GitHub 是托管 Git 仓库的网站。
这个区别很关键。搞混了,后面每一步都会拧巴。
| Git | GitHub | |
|---|---|---|
| 是什么 | 一个命令行工具 | 一个网站、大型代码平台 |
| 装在哪 | 你的电脑上 | 官方服务器上 |
| 断网能用吗 | 能。全部操作都在本地 | 不能 |
| 谁做的 | Linus Torvalds,2005 年 | 微软,2018 年花 75 亿美元买的 |
| 要钱吗 | 免费,开源 | 免费档够个人用 |
把 Git 想成记账本,GitHub 想成银行。 记账本在你自己抽屉里,银行帮你保管和共享。
没有 GitHub 仓库,Git 命令工具照样用。没有 GitGit 命令工具,GitHub 仓库就是个空壳。
开始学的时候,不要有想法在github 网页上或者github app上 点来点去"提交"一个文件,在本地用git命令就行,github 网页和app 百分九十九就都是用来浏览或者star !
三个必学理由
第一,代码需要备份,而且是带历史的备份。吃过的亏——本地一个项目文件夹被我误删过,回收站里也没有,因为我是用命令行删的。三天的工作没了。Git 就是防这个的。
第二,找工作和找人合作,GitHub 就是简历。招聘的人会点进你的主页看提交记录。空白的账号,比没有账号还尴尬。
第三,也是最重要的:全世界最好的代码都在这儿。你想学的任何东西——从一个小工具到一个完整的框架——源码都摊开放在那里,免费看。
这一篇的重点其实是第三条,前面那些是门票。
二、注册账号·把 Git 装上
注册
官网 github.com,右上角 Sign up。
三件事值得注意:
安装 Git
macOS:
brew install git #装了 Homebrew 的话
git --version #验证,能看到版本号就成Windows:去 git-scm.com 下载安装包,一路下一步。
装完打开「Git Bash」——后面所有命令都在这个窗口里敲,不建议在 cmd 或 PowerShell 里敲。
装完第一件事,配置身份:
git config --global user.name "你的名字" #这会出现在每条提交记录上
git config --global user.email "你的邮箱" #建议和 GitHub 注册邮箱一致配完验证一下:
git config --list #能看到刚配的两行就对了注意:邮箱一定要和 GitHub 账号对得上。对不上,你的提交记录在 GitHub 上就不算你的,头像是个灰方块,贡献的绿格子也不亮。
三、四个概念就够
Git 的命令有几十个。入门只要四个。剩下的用到再查。
3.1 仓库(Repository)
初始化项目:一个被 Git 管起来的文件夹。
本地建一个:
mkdir my-project #建文件夹
cd my-project #进去
git init #把这个文件夹变成 Git 仓库跑完 git init,文件夹里会多一个隐藏的 .git 目录。
这个目录就是记账本本身。 所有历史都在里面。删了它,你的项目就退回成普通文件夹,历史全没。
有人干过骚操作:为了"清理项目",把 .git 当缓存目录删了。那个项目 200 多次提交,一次没剩。 如果其他分支也没有记录 ,项目记录就没了!
3.2 提交(Commit)
记录项目:给当前的文件状态拍一张快照,附一句说明。
流程固定三步:
git status #先看现在什么情况
git add . #把所有改动放进暂存区
git add /xxx/ok.text #把某个文件提交
git commit -m "说明这次改了什么" #拍快照git add 和 git commit 分开,是新手最容易烦的地方。为什么要两步?
因为你可以只提交一部分改动。比如你同时改了三个文件,其中两个还没写完,那就 git add 只加写完的那个。
提交说明怎么写?我的规矩是当成给三个月后的自己留纸条。
反例:更新、修改、fix。 过于简洁,回头看不知所以。
正例:修复登录页在 Safari 下按钮点不动的问题。
做细点就是一条提交只做一件事,别把"改样式 + 加功能 + 升依赖"塞进一条。vibe conding 时代急着上线,可能也不会管那么多!
3.3 分支(Branch)
项目分支:从主线分出去的一条平行时间线,用来试错。
git branch #看有哪些分支
git checkout -b feature-x #新建并切到 feature-x
git checkout main #切回主线
git merge feature-x #把 feature-x 合进当前分支主分支和新分支在 在最初新分支创建那一刻是一模一样的! 类比一下:main 分支是正式出版的版本,分支是你的草稿纸。草稿写废了,撕掉就行,书不受影响。
还有个细节值得知道:Git 的分支不是拷贝文件,是一个指针。建一个新分支瞬间完成,不占空间,你改的始终是同一份文件,Git 只记录差异。
我一开始不敢建分支,以为每建一个就复制一份代码,硬盘要炸。知道是指针之后,我建分支就再没犹豫过。
分支真正的价值是"可以推倒重来"。在 main 上改,改崩了只能硬着头皮往前修;在分支上改,删掉重建,两秒钟的事。
新手常见的错误是在 main 上直接改。改崩了没有退路。
3.4 远程(Remote)
远程仓库:把本地的仓库和 GitHub 上的仓库接起来。
git remote add origin https://github.com/你的用户名/仓库名.git
git push -u origin main #第一次推,-u 记住这个对应关系之后每次就三行:
git add .
git commit -m "说明"
git push记住这三行,你就已经能干活了。下面都是在这三行上加东西。
3.5 推送验证配置
推送这里的配置很重要。具体流程如下:
plain text
本地 ssh-keygen → ~/.ssh/id_ed25519.pub → 复制内容 → GitHub Settings 粘贴 → ssh -T git@github.com 验证
SSH key 生成
选ed25519算法 (默认选这个)
plain text
ssh-keygen -t ed25519 -C "you@example.com"
选 rsa 算法 常规个人项目选这个 本人用的这个 ,下面接着以这个为演示:
ssh-keygen -t rsa -b 3072 -C "你的邮箱"明确不推荐使用 ECDSA 算法
执行命令,一路回车生成密钥后,找到下面这个公钥文件
~/.ssh/id_rsa.pub # ~ 用户家目录|用户根目录 .ssh目录 id_rsa.pub打开文件 id_rsa.pub 黏贴到下图 SSH keys 所在位置
验证配置使用是否成功 在终端执行命令 ssh -T git@github.com 如下所示则为成功
~ ssh -T git@github.com
Hi xaiwind! You've successfully authenticated, but GitHub does not provide shell access.个人使用经验回顾,有二:
第一,第一次 push 让你输密码,但密码是错的。GitHub 早就不让用账号密码推代码了,我有次卡在这儿,输了 好几遍密码,一直以为自己记错了。它不会提示"不能用密码",它只说认证失败。这个报错信息把我坑了一晚上。
第二,`origin` 只是个名字,不是关键字。叫它 github、backup、随便什么都行,origin 只是约定俗成的默认叫法。同一份本地仓库可以接好几个远程——这也是坑 ,也是upstream 能存在的原因。
3.6 可选验证方式 PAT (Personal Access Token 个人访问令牌)
这一步可选跳过学习直接到第四节, 小白可能会晕,后期用到再学!
同时 github 还是支持 PAT 验证, 如何设置获取: Personal Access Token → Settings → Developer settings → Personal access tokens 生成一个,勾上 repo 权限,点击生成。
两者全程、长相
| 全称 | 页面位置 | 前缀长相 |
|---|---|---|
| Personal Access Token (classic) | Tokens (classic) | ghp_xxxxxxxx |
| Fine-grained personal access token | Fine-grained tokens | github_pat_xxxxxxxx |
关键点:token 只显示一次,GitHub 只存它的哈希,没法再查看,丢了只能删掉重建。
所以正确顺序是:
填名字 → 设有效期 → 勾权限 → Generate → 【立刻复制】→ 离开页面PAT复制之后怎么用
方式一:push 时当密码输入(最省事)
git push
Username: xaiwind
Password: <粘贴 token>macOS 上因为有 osxkeychain(你刚确认过生效的那个),粘一次就会自动存进钥匙串,之后永不提示。这就是"复制一次"的全部成本。
方式二:直接写进 remote URL(脚本/CI 常用)
git remote set-url origin https://xaiwind:<token>@github.com/xaiwind/仓库.git⚠️ 这种写法会让 token 明文躺在 `.git/config` 里,别在共享机器上用,也别让这个仓库被 push 出去。
两个容易踩的坑
Classic vs Fine-grained 都一样是只显示一次。区别只在权限怎么勾:
| TOKEN | 勾什么 |
|---|---|
| Classic | 勾顶层 repo 一整个 |
| Fine-grained | 不用找 repo,勾 Contents: Read and write + Metadata: Read,并选仓库范围 |
3.7 总结SSH Key 与 PAT 的区别
四、看懂一个开源项目
打开任何一个知名项目的首页,你会看到五个东西,挨个说。
Star(收藏)
别人点了收藏。数字大不代表代码好,只代表知道的人多。拿它选项目的参考价值有限。一个 3 万星的项目可能已经两年没人维护了。
不过 Star 有一个角度看是对的:看趋势,不看绝对值。半年涨了 5000 星的,说明它正被人需要;3 万星但曲线平了两年的,多半是吃过一波红利、现在没什么人推了。
看趋势不用装工具,star-history.com 能把几个项目的星数曲线叠在一张图上,免费。我选技术方案之前会去瞄一眼。
Watch(关注)
点了之后,这个项目的所有动态会推给你。
建议只对你在用的项目开。开多了,通知栏会变成垃圾场,择优watch
Fork(复刻)
复刻仓库:把别人的仓库整个复制一份到你自己的账号下。
之后你改的是你那份,原项目不受影响。想给原项目贡献代码时,先 fork。
新手最容易混的就是这个——fork 完在自己那份上改了,然后找不到怎么让原作者看到。答案是提 PR,第七节讲。
Issue(问题单)
别人提的 bug、需求、讨论。一个项目的 Issue 区就是它的病历本。
对新手来说,Issue 区是最好的学习材料。看别人怎么描述问题,看维护者怎么排查。比读教程真实得多。
顺便说:提 Issue 前先搜有没有人提过。重复提不太友好。
Issue 区还有一层用法:看 Label(标签)。维护者会给 Issue 打标签,其中两个对新手特别重要——good first issue 是专门标出来留给新人的,help wanted 是欢迎外部帮忙的。
用第五节学的语法直接搜:
is:open label:"good first issue" language:markdown**这个搜索把 "想给开源做点事但不知道从哪下手" 变成了一个下拉列表。
Pull Request(PR)
推送请求:「我改了东西,请你看看要不要合进去」的正式请求。
这是 GitHub 的核心动作。所有对开源项目的贡献,都是通过 PR 完成的。
PR 区还是个学写代码的地方,这个用法知道的人不多。
点进一个已经合并的 PR,切到 Files changed 标签页。能看到一次真实改动长什么样:动了几个文件、加了多少行删了多少行、review 里维护者提了什么意见。
这比读最终代码有用,最终代码是结果,PR 是过程——看别人怎么被 review,就知道维护者真正在乎什么。
五、搜索:怎么找到你要的东西
这节是最具价值的学习,大部分人用 GitHub 只用搜索框打一个词,然后在一堆结果里翻。
GitHub 的搜索有语法,会几个就够了。
5.1 常用限定符
| 语法 | 作用 | 例子 |
|---|---|---|
in:name | 只搜仓库名 | blog in:name |
in:readme | 只搜 README 内容 | obsidian in:readme |
language: | 限定语言 | language:go |
stars:>1000 | 星数大于 | stars:>1000 |
pushed:>2026-01-01 | 最近还在更新 | pushed:>2026-01-01 |
topic: | 按标签搜 | topic:self-hosted |
user: | 搜某人的仓库 | user:torvalds |
is:issue | 搜 Issue 而不是仓库 | is:issue is:open |
组合起来威力很大,比如我想找一个 还在维护的 Go 写的自建聊天室:
chat language:go stars:>500 pushed:>2026-01-01`pushed:` 这个限定符是我用得最多的。它直接过滤掉死项目。GitHub 上大部分搜索结果都是坟,这个能帮你绕过去。
5.2 搜代码,不是搜仓库
切到 Code 标签页,搜的是代码本身。这个更强。
比如我想看别人怎么用 cloudflared 做隧道,直接搜代码:
cloudflared language:yaml出来的每一条都是真实项目的实际配置。这比看文档快。
不过要注意:代码搜索需要登录。没登录只能用仓库搜索。
5.3 找"我该用什么"
按 topic 逛比搜索更适合这个场景:
topic:self-hosted #自建服务
topic:awesome #各种 awesome 合集`awesome` 系列是宝藏。awesome-python、awesome-selfhosted 这类仓库,是有人替你整理好的清单。想学什么先搜 awesome 关键词。
六、读懂源码:从哪一行开始看
好,标题的正题来了。一个小提醒 ,AI 时代可选不读源代码或不死磕源码,毕竟 vibe coding, 可选跳过直接第七节,了解基本架构亦可!
把一个陌生项目的源码看懂,固定走五步。不是从第一行开始读——那是新手最容易死的做法,一个项目几万行,读到天亮也读不出东西。
第一步:只读 README
五分钟,不写代码。
搞清楚三件事:这东西解决什么问题、怎么跑起来、有没有 Quick Start。
README 写得烂的项目,直接放弃。这不是偏见,这是止损。文档烂的项目,代码通常也烂,而你没有义务替作者考古。
第二步:跑起来
这一步不能跳。静态读代码的效率,比跑起来调试低十倍。
按 README 装依赖、起服务,然后随便点几下。
目的是建立手感:这东西跑起来长什么样,点这个按钮会发生什么。
第三步:找入口
任何程序都有一个"从头开始执行"的地方。找到它:
| 语言 | 入口通常是 |
|---|---|
| Go | main.go 里的 func main() |
| Python | __main__.py、app.py、manage.py |
| Node | package.json 里的 "main" 或 "scripts" |
| PHP | public/index.php |
| Rust | src/main.rs |
在 GitHub 网页上按 t 键,会打开文件跳转器。这个快捷键很多人不知道,用一次就回不去了。
第四步:顺着一个功能走完整条链路
不要按文件读,按功能读。
选一个最小的功能——比如"点登录按钮"。然后从入口一路跟下去:路由在哪、处理函数在哪、数据库怎么查的、返回什么。
链路走通一次,整个项目的骨架你就摸到了,剩下的都是在这个骨架上挂东西。
目标定小,才走得远。看懂源码不等于看懂全部代码。如果一开始给自己定的目标是"读完整个项目",然后每每都在坚持几次放弃就没劲。先"只搞懂我要改的那一个功能",效率完全不一样。
第五步:看提交历史和 PR
这一步最容易被忽略,但信息量最大。
点开 Commits,看最近改了什么。点开 Blame(在文件页面右上角),能看到每一行是谁、什么时候、因为哪次提交写的。
Blame 是用得最多的功能。一行看不懂的代码,点开 Blame,往往能看到提交说明里写着"临时方案,等 XX 上线后删掉"。
这一下就把"这段代码为什么这么怪"变成"这段代码是欠债"。读代码最怕的就是猜作者的意图,Blame 直接给你答案。
网页上读代码的几个快捷键
读代码不一定用编辑器。GitHub 网页本身就是个阅读器,我大部分时间是在浏览器里读完的。
| 按键 | 作用 |
|---|---|
t | 打开文件跳转器,输入文件名直接跳 |
. | 把当前仓库变成网页版 VS Code |
s | 在仓库内搜索 |
b | 看某一行是谁写的,等同于点 Blame |
y | 把当前文件地址变成永久链接 |
`t` 和 `.` 这两个是我用得最多的。t 跳文件;. 直接进网页编辑器——进去之后按 Cmd+P 还能继续跳文件,跟本地开发没差别,而且不用克隆到本地。
大项目一般先按 . 逛十分钟,摸清目录结构,更新记录,star数,编写语言,再决定要不要 clone 下来。
读源码时可能踩的三个坑
坑一:想一次读懂。可能第一次读一个 Go 框架,给自己排了五天的计划,第一天读了 800 行就放弃了。后来才知道那个项目一共 4 万行。读懂一个项目的正确目标,是读懂我要改的那 500 行。
坑二:跳过测试用例。测试文件通常最枯燥,但它其实是作者写得最认真的文档。一个函数该传什么、会返回什么、边界在哪,测试里全写着。我现在读陌生项目,先翻 _test.go 或者 test/ 目录。
坑三:只读不跑。可能花一个下午静态推演一个异步流程,越推越乱。后来起了本地服务,在关键函数里加了一行 print,三分钟就清楚了。调试器一分钟,胜过读代码一小时。
七、提第一个 PR
流程走一遍。以给别人的项目修一个错别字为例——这是新手最合适的第一个 PR。
7.1 Fork
在项目首页右上角点 Fork。你账号下会多一份一模一样的仓库。
fork 完,你仓库名下面会多出一行小字 forked from 原作者/项目名。这行字就是标记,告诉所有人这是复刻来的。它也决定了后面 PR 往哪儿提。
7.2 克隆到本地
用git clone 加https 方式 或者直接下载,自己下载的方式,如果没有fork,需建仓库推送储存
git clone https://github.com/你的用户名/项目名.git #注意这里是你自己的
cd 项目名注意是克隆你 fork 的那份,不是原项目。这一步新手经常搞错,然后在原项目上改,推不上去。
大仓库 clone 会等很久。如果只是想把代码弄下来看,不打算推东西,加 `--depth 1`:
git clone --depth 1 https://github.com/你的用户名/项目名.git #只拉最新一次提交这个参数只下载最新快照,不要完整历史,快好几倍,我读源码时基本都用它。但要提 PR 的仓库别用——历史不全,后面同步原项目容易出岔子。
7.3 建分支
git checkout -b fix-typo #分支名说明你要干什么不要在 main 上直接改。这是规矩,也是给自己留后路。
分支名有惯例,不强制,但跟着写维护者看着舒服:
| 写法 | 什么时候用 | 例子 |
|---|---|---|
fix/xxx | 修 bug | fix/safari-button |
feat/xxx | 加功能 | feat/dark-mode |
docs/xxx | 改文档 | docs/fix-dead-link |
别用 `patch-1`、`update`、`test` 这种名字。在 GitHub 网页上直接编辑文件时,它会自动给生成 patch-1。一看到这个分支名,维护者就知道没在本地建分支。
7.4 改完,提交
git add .
git commit -m "修正 README 中的拼写错误"
git push origin fix-typo #推到你自己 fork 的那份提交说明只写"改了什么",不用写"为什么"。为什么放在 PR 描述里讲。提交说明是留给以后 git log 翻的,越短越好。
7.5 回到 GitHub 提 PR
推完之后回到你 fork 的仓库页面,会看到一条黄色提示条,点 Compare & pull request。
标题写清楚改了什么,正文里说清楚为什么改。如果是修 Issue,在正文里写 `Closes #123`,PR 被合并后那个 Issue 会自动关闭。
不熟悉怎么写的话,直接套这个:
## 改了什么
把 README 里指向 xxx 的链接更正为 yyy。
## 为什么
原链接已经 404,点进去会跳到 GitHub 首页。
## 怎么验证
点开新链接能正常打开,本地跑了一遍没报错。
Closes #123三段就够,别写长。维护者每天要看几十个 PR,短文比长文更容易被读完。
最后提交,等维护者 review。
7.6 维护者让你改怎么办
直接在同一个分支上继续改,再 push 一次。PR 会自动更新,不用重新提。
git add .
git commit -m "按 review 意见调整"
git push origin fix-typo不要重开一个新 PR。这是新手常犯的错——以为原来那个废了,重新提一个,结果维护者面前多出一份重复的,观感很差。
还有两种结果,提前有心理准备:
维护者可能一直不理你,开源是免费义务劳动。一个 PR 挂几周很正常,两周后可以在 PR 下面礼貌留一句。
PR 被直接关掉,常见原因是改动超出了那个 Issue 的范围,或者已经有人在做同一件事。被关掉之后我会去读 review 里写了什么——大部分时候理由写得很清楚,那是一次免费的代码评审。
7.7 全流程连着敲一遍
上面是一步步讲的,这里压缩成一条序列。真提 PR 的时候照着走就行:
# 1. 克隆你自己 fork 的那份
git clone https://github.com/你的用户名/项目名.git
cd 项目名
# 2. 把原项目加为上游,方便以后同步。这步最多人漏,它当下不产生任何效果,
# 但等你提第二个 PR 的时候,没有它就得重新 clone 一遍。
git remote add upstream https://github.com/原作者/项目名.git
# 3. 建分支
git checkout -b docs/fix-dead-link
# 4. 改文件(用编辑器改,这步没有命令) vscode 或者 vim
# 5. 提交
git add .
git commit -m "修正 README 中的死链"
# 6. 推到自己那份
git push origin docs/fix-dead-link推完回网页点 Compare & pull request,填描述,提交。
三个让 PR 更容易被合并的习惯
八、GitHub Actions:让机器人替你干活
仓库自动化:你在仓库里放一个配置文件,GitHub 就会在你指定的时机自动跑命令。
这是 GitHub 最值钱的免费功能。 但配置需要经验,有门槛,小白或者个人项目可先不用或用来测试!
最小例子
在仓库里建一个文件,路径必须是 .github/workflows/xxx.yml:
name: 每次推送就跑测试
on:
push: #触发条件:推代码的时候
branches: [main]
jobs:
test:
runs-on: ubuntu-latest #跑在 GitHub 提供的虚拟机上
steps:
- uses: actions/checkout@v4 #第一步:把代码拉下来
- uses: actions/setup-node@v4 #第二步:装 Node
with:
node-version: '20'
- run: npm install #第三步:装依赖
- run: npm test #第四步:跑测试推上去,去仓库的 Actions 标签页,就能看到它在跑。
免费额度
这部分要算账,不然会烧钱。
| 类型 | 免费额度 |
|---|---|
| 公开仓库 | 基本不限量 |
| 私有仓库 | 每月 2000 分钟 |
计费倍率是最坑的地方:
| 系统 | 倍率 | 实际消耗 |
|---|---|---|
| Linux | 1x | 跑 10 分钟算 10 分钟 |
| Windows | 2x | 跑 10 分钟算 20 分钟 |
| macOS | 10x | 跑 10 分钟算 100 分钟 |
我吃过亏——给一个 iOS 项目配了 macOS runner,每次构建 8 分钟。跑了 23 次,2300 分钟,当月额度直接爆了。收到邮件才知道 macOS 是 10 倍。
新手建议:能用 ubuntu-latest 就别用别的。
什么值得自动化
怎么读 Actions 的报错
Actions 挂了,报错不在最显眼的地方。
点进那次运行,左边是流程树,红色叉号那一步点开,才有真正的日志。新手经常只看最上面那句摘要,而那一行通常只有 Process completed with exit code 1,等于什么都没说。
`exit code 1` 不是错误信息,是"某条命令返回了失败"。真正的原因在上面几十行,往上翻。
使用经验:本地跑得好好的,Actions 里就是不过。翻了半天日志才看明白——本地有 .env,仓库里没有(也不该有,见坑 1)。Actions 里要用密钥,得去 `Settings` → `Secrets and variables` 配,然后在 yml 里用 `${{ secrets.你的名字 }}` 引用。
绕回来还是那句话:密钥只能放 Secrets,不能放仓库。这两件事是同一件事。
九、GitHub Pages:白嫖一个网站
仓库静态页面:把仓库里的静态文件直接变成网站,免费,还送 HTTPS。
三种做法,从快到慢
最快:新建仓库时名字写成 你的用户名.github.io,往里放一个 index.html,访问 https://你的用户名.github.io。
最常用:随便一个仓库,进 Settings → Pages,Source 选 Deploy from a branch,分支选 main,目录选 /root 或 /docs。
最灵活:用 Actions 构建后再发布,适合 Hexo、Hugo、VitePress 这类需要编译的。
三个坑
想绑自己的域名,在 Settings → Pages → Custom domain 里填。填完还得去域名服务商那边加一条 CNAME 记录,指向你的用户名.github.io。
加完别急着高兴——勾上 `Enforce HTTPS` 之后,证书签发要等几分钟到几小时。改完域名当天访问一直是"不安全"提示,以为配错了,来回改了三遍 CNAME,第二天自己好了。
国内访问 *.github.io 的速度看运气。给国内用户看的话,套一层 Cloudflare 会稳一些。
十、常见错误
坑 1:把 .env 提交上去了
这是最严重的一个,也是最常见的。
.env 里是密钥、数据库密码、API key。提交上去,等于公开发布。
而且删掉文件再提交是没用的,历史里还在。别人 git log 一翻就有。
正确做法:在项目根目录建 .gitignore,第一行就写:
.env
node_modules/
.DS_Store
*.log如果已经提交了,光删文件不够,得清历史(git filter-repo 或 BFG)。更省事的做法是直接把那个 key 作废重申请。我选后者——改历史的成本比换 key 高。
坑 2:文件超过 100MB 推不上去
GitHub 单文件上限 100MB,仓库建议不超过 1GB。
推的时候报错,而且报错信息不告诉你是哪个文件,只给一串 hash。
查哪个文件超标:
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
sort -k3 -n | tail -5 #列出最大的 5 个文件真要放大文件,用 Git LFS:
git lfs install
git lfs track "*.psd"坑 3:提交时邮箱和账号对不上
第二节提过,这里再说一次,因为这个坑不自查发现不了。
git config user.email #看看现在配的是什么和 GitHub 账号邮箱不一致的话,贡献格子不会亮。
坑 4:在 main 上改崩了
git checkout -- . #丢弃所有未提交的改动
git reset --hard HEAD~1 #退回上一个提交(危险,改动会没)git reset --hard 之前先 git stash 存一下,后悔了还能捞回来。
坑 5:fork 之后原项目更新了,自己那份是旧的
git remote add upstream https://github.com/原作者/项目名.git #把原项目加为上游
git fetch upstream
git checkout main
git merge upstream/main
git push origin mainFork 完过了两周才动手,原项目早就变了,PR 里全是无关的 diff,被维护者关掉了。
坑 6:两步验证的恢复码没存
开 2FA 的时候,GitHub 会给你一组恢复码。那组码只显示一次,关掉页面就再也看不到了。
我没存。然后换了手机,账号锁了两天,最后是走邮箱验证加等 24 小时才找回来的。
存哪儿?密码管理器里,或者打印出来夹本子里。别截图放相册——相册会跟着手机一起丢。
可以选择用 Github 安卓和IOS APP ,常用来验证操作!
坑 7:原仓库转私有,你的 fork 会脱离
一个公开仓库被你 fork 之后,如果原作者把它改成私有,你的 fork 会被独立出来,和原项目的关联断掉。
之后你 git fetch upstream 会报 404,怎么试都不对。
处理办法:重新 fork 一份,或者把 upstream 指向原仓库的新地址。
十一、白嫖清单:GitHub 上不要钱的东西
免费清单:GitHub 免费档给的东西,比大部分人以为的多。
| 东西 | 免费额度 | 用来干什么 |
|---|---|---|
| 仓库 | 公开、私有都不限量 | 放代码 |
| 私有仓库协作者 | 3 人(含自己) | 两三个人的小项目 |
| Actions | 公开仓库基本不限;私有仓库 2000 分钟/月 | 跑测试、构建、部署 |
| Pages | 静态站点,送 HTTPS | 博客、文档、demo |
| Codespaces | 120 核心小时/月 + 15 GB 存储 | 云端开发环境 |
| Copilot | 每月 2000 次代码补全 | 写代码 |
三句提醒:
常用用法:Actions 跑测试,Pages 放文档,Codespaces 只在换电脑应急时开——它太容易忘记删了。
十二、把主页变成简历
主页简历:建一个和用户名同名的仓库,里面的 README 会显示在你主页顶部。
这个功能知道的人不多,但性价比极高。别人点进主页第一眼看到的就是它。
建仓库,名字必须完全等于你的用户名。比如用户名是 xaiwind,仓库名就叫 xaiwind。
在仓库根目录建 README.md,内容会直接渲染在你主页最上面。
一个最小可用的模板:
## Hi there 👋
### 你好,我是XaiWind 想风
后端工程师,写 PHP 和 Go,最近在做 AI Agent 和 AIGC 方向的东西。
**正在做**
- 一个出海 SaaS 工具(Go + Postgres)
- 用 Claude Code / Codex 重做我的内容工作流
**技术栈**
PHP、Go、Python、MySQL、Redis、Docker
**找我**
- 博客:https://shoptofly.com/doc
- X:https://x.com/xaiwind三条经验:
十三、多人协作:分支策略
团队协作:约定好谁往哪个分支推代码,比用什么工具重要。
一个人写代码,怎么都行。两个人以上,就要有规矩。
最常见的三层:
| 分支 | 作用 | 谁能推 |
|---|---|---|
main | 随时可发布的稳定版 | 谁都不能直接推 |
dev | 集成测试 | 只能通过 PR 合入 |
feature/xxx | 单个功能 | 开发者自己 |
流程:从 dev 切出 feature/xxx → 开发 → 提 PR 合回 dev → 测试通过后 dev 合进 main → 打 tag 发布。
保护分支是必须开的。在 Settings → Branches 里给 main 加规则:禁止直接推送、必须走 PR、必须有人 review 通过才能合。
github.com → 进你的仓库
→ 顶部 Settings(最右那个齿轮)
→ 左侧栏 "Code and automation" 分组 → Branches
→ 右侧 "Branch protection rules" → Add branch protection rule
(如果是第一次,按钮可能是 "Add rule")或可以这样配置
仓库 → Settings → 左侧 "Rules" → Rulesets → New ruleset → New branch ruleset
Ruleset Name:protect-main
Enforcement status:Active (务必选 Active,默认可能是 Disabled)
Target branches|Add target → Include by pattern → `main`接着在Rules 里勾
☑ Require a pull request before merging
→ Required approvals: 1
→ ☑ Dismiss stale approvals when new commits are pushed
→ ☑ Require approval of the most recent reviewable push
☑ Block force pushes
☑ Restrict deletions一个团队合作的三人项目如果没开保护分支,在 main 上直接推了一个没测的改动,可能就会把线上打挂。开保护分支只花两分钟,挡住的就是这种故障问题。
十四、速查表
每天真正会用到的那几条,抄下来贴在手边。
# 日常三行
git add . #把改动放进暂存区
git commit -m "说明" #提交
git push #推到 GitHub
git push origin 分支名 #推送到某个分支
# 看状态
git status #现在什么情况
git log --oneline -10 #最近 10 条提交
git diff #还没 add 的改动
# 分支
git branch #列出分支
git checkout -b 新分支名 #新建并切过去
git checkout 分支名 #切分支
#merge 保留真相,rebase 制造整洁,rebase 是"重写历史",merge 是"记录历史"。
#分支合并技巧: 先子分支合并主分支 再用主分支合并子分支
git merge 分支名 #常用命令 把某分支合进当前分支,适用公共分支、已推送的分支
git rebase 分支名 #进阶命令、慎重使用,适用本地未推送的私有分支
#以下参与开源、Fork 场景 用到
git push origin main #推到我的 fork
git fetch upstream #拉原版最新(只读,不能 push)
git rebase upstream/main #把我的分支接到原版最新上
# 撤销
git checkout -- 文件名 #丢弃某个文件的未提交改动
git stash #把改动暂存起来,工作区变干净
git stash pop #把暂存的改动拿回来
git reset --hard HEAD~1 #退回上一个提交(危险)
# 和远端打交道
git clone 地址 #克隆
git fetch upstream #拉原项目的更新
git remote -v #看远端配了哪些`git status` 是你最好的朋友。不知道下一步干什么的时候,先敲它。
十五、GIT、SVN、GitLab、Gitee 对比
SVN 不用学了,中心式版本管理工具 。GitLab、Gitee 都是 Github 类的商业化探索版本,使用上都是用GIT工具,你会Github 就会他们
| 平台 | Git | SVN | GitLab | Gitee |
|---|---|---|---|---|
| 是什么 | 版本控制工具 | 版本控制工具 | 托管平台 | 托管平台 |
| 装在哪 | 本地 | 本地+服务端 | 云 / 自建 | 云 / 私有部署 |
| 底层版本控制 | — | — | Git | Git |
| 开源 | ✅ | ✅ | ✅(CE 版) | 部分 |
| 免费 | ✅ | ✅ | ✅ 有免费层 | ✅ 有免费层 |
| 核心卖点 | 分布式、分支 | 简单、目录级权限 | CI/CD + 自建 | 国内速度 + 合规 |
最后
新建仓库位置, 添加 Repository name、Description ,接着配置public或者private权限、README.md说明文件、.gitignore忽视文件、开源协议(通常MIT),最后点击创建仓库!
好在现在有AI 了,用claude、codex等智能体,github安装好,配置好key, 新建好仓库,基本上都不用你手动敲命令了。
直接用大白话和智能体说就好了,智能体会帮你创建分支,提交修改,推送到远程仓库,门槛降低了很多。
AI时代无程序员,只有vibe coding ,但需要了解一点原理,然后大白话实践!
以下几条,记下来就够:
GitHub 不是一个需要"学完"的东西,是一个你用得越多、发现越多的地方。 比如这个新功能,上周才发现, Blame 可以点某一行看那次提交的完整 diff——用了多年才知道。篇幅有限,还有很多没有讲到的地方,有任何问题,可以评论区或者私聊我!~
我是想风 @xaiwind,一个关注出海与 AI 、AIGC的创作者。如果文章对你有帮助,欢迎点赞、收藏、关注。每天进步一点,我们终会到达目的地!
#GitHub
往期优质文章:
超详细Codex上手教程,从入门到精通
超简单 Grok Bot ,入门到一键构建机器人团



















