😕 没有找到匹配的内容,请尝试其他关键词(如 "rebase", "ssh", "actions")。
一、Git 与 GitHub 核心原理
Git 的四大工作区域
理解工作区、暂存区、本地仓库与远程仓库的数据流转
▶
要真正掌握 Git,必须理解代码在四个区域之间的流转过程。这是所有 Git 命令的底层逻辑。
- Workspace (工作区):你电脑里能直接看到的目录,你在这里编写、修改代码。
- Index / Stage (暂存区):一个临时保存修改的地方。相当于“购物车”,你把要提交的修改先放进去。
- Repository / Local (本地仓库):Git 的安全数据库,保存了所有的版本历史。只有进入这里,修改才算真正被“版本化”。
- Remote (远程仓库):如 GitHub 上的仓库,用于团队协作和云端备份。
数据流转命令映射:
| 动作 | 流转方向 | 对应命令 |
|---|---|---|
| 添加到购物车 | 工作区 ➔ 暂存区 | git add |
| 结账/提交 | 暂存区 ➔ 本地仓库 | git commit |
| 推送到云端 | 本地仓库 ➔ 远程仓库 | git push |
| 拉取云端更新 | 远程仓库 ➔ 本地仓库 | git fetch |
| 合并到工作区 | 本地仓库 ➔ 工作区 | git merge / git checkout |
分布式 vs 集中式版本控制
为什么 Git 淘汰了 SVN?
▶
集中式 (如 SVN):版本库集中存放在中央服务器。工作时必须联网,一旦中央服务器宕机或硬盘损坏,所有历史记录全部丢失。
分布式 (Git):每个人的电脑上都是一个完整的版本库。即使断网,你依然可以查看历史、提交代码、创建分支。当联网后,只需互相 push / pull 即可同步。这极大地提高了安全性和离线工作效率。
二、环境搭建与安全配置
配置 SSH 密钥 (免密且安全)
一劳永逸解决每次 Push 都要输密码的问题
▶
1. 生成 Ed25519 算法密钥 (推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车即可。这会在 ~/.ssh/ 目录下生成私钥和公钥。
2. 启动 ssh-agent 并添加私钥 (macOS/Linux)
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
3. 将公钥配置到 GitHub
- 复制公钥:
cat ~/.ssh/id_ed25519.pub(Windows 用type或记事本打开) - 登录 GitHub ➔ Settings ➔ SSH and GPG keys ➔ New SSH key。
- GitHub ➔ Settings ➔ Developer settings ➔ Personal access tokens ➔ Tokens (classic)。
- Generate new token,勾选
repo权限(如果是操作 Gist 或 Workflow 需要勾选对应权限)。 - 生成后立即复制保存(网页只会显示一次)。
- 在终端 Push 提示输入密码时,粘贴这个 Token,而不是你的登录密码。
y:暂存这块修改n:不暂存这块修改s:把当前块拆成更小的两块e:手动编辑当前块- Require a pull request before merging:禁止直接 push,必须走 PR 流程。
- Require approvals:至少需要 1 名或 2 名同事 Code Review 批准后才能合并。
- Require status checks to pass before merging:必须等 CI/CD (如 GitHub Actions 的自动化测试) 跑通绿灯,才允许合并。
- Do not allow bypassing the above settings:连管理员也不能强行绕过规则。
- 在仓库 Settings ➔ Secrets and variables ➔ Actions 中添加 Secret(如
DB_PASSWORD)。 - 在 workflow 文件中通过环境变量注入:
- 自定义字段:除了默认的 Assignee, Labels,你可以添加 "Priority" (单选), "Sprint" (迭代), "Estimate" (数字) 等自定义字段。
- 自动化工作流:内置自动化规则。例如:当 PR 被合并时,自动将关联的 Issue 卡片移动到 "Done" 列。
- 图表视图:一键生成燃尽图 (Burnup chart) 或柱状图,向老板汇报进度极其方便。
- 注释驱动开发:先写清晰的注释,再让 Copilot 生成代码。
- 生成测试用例:选中一个复杂的函数,在 Copilot Chat 中输入
/tests,它会自动生成覆盖各种边缘情况的单元测试代码。 - 解释遗留代码:接手祖传代码看不懂?选中代码块,在 Chat 中输入
/explain,AI 会逐行为你拆解逻辑。 - 修复 Bug:终端报错后,点击 Copilot 的 "Debug with Copilot",它能直接分析堆栈并给出修复补丁。
💡 提示:多账号配置
如果你同时有公司和个人的 GitHub 账号,可以在 ~/.ssh/config 文件中配置别名,让不同的仓库使用不同的密钥。
HTTPS 推送与 Personal Access Token (PAT)
GitHub 已废弃密码验证,必须使用 PAT
▶
如果你使用 HTTPS 地址 clone 仓库(而不是 SSH),在 push 时 GitHub 不再接受你的账号密码。你必须生成一个 Personal Access Token (PAT) 作为密码使用。
生成步骤:
⚠️ 警告:Token 安全
Token 等同于密码,千万不要将其硬编码在代码中或提交到公开仓库!如果不慎泄露,请立即在 GitHub Settings 中 Revoke (撤销) 并重新生成。
.gitignore 文件编写规范
告诉 Git 哪些文件绝对不要追踪
▶
项目中的编译产物、环境变量、依赖包目录都不应该提交到 Git。我们需要在项目根目录创建一个名为 .gitignore 的文件。
常见语法与模板:
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略环境变量文件 (极其重要!)
.env
.env.local
# 忽略 build 目录下的所有内容,但保留 build/.gitkeep
build/*
!build/.gitkeep
# 忽略所有目录下的 .DS_Store (macOS 系统文件)
**/.DS_Store
💡 懒人福音
访问 gitignore.io,输入你的技术栈(如 Java, Node, Python, VSCode),它会自动为你生成一份完美的 .gitignore 文件。
三、Git 核心命令字典与实战
暂存区的艺术:部分提交与交互式 Add
如何在一个文件中只提交部分修改?
▶
有时候你修改了一个文件的多个地方,但只想把“修复 Bug”的部分提交,把“开发新功能”的部分留到下次提交。这时 git add . 就不管用了。
1. 交互式添加 (Interactive Add)
git add -p <文件名>
Git 会把你的修改分成一个个 "hunk" (块),并询问你:
2. 使用 VS Code 等编辑器
现代编辑器在源代码管理面板中,允许你选中某几行代码,右键选择 "Stage Selected Ranges" (暂存选定的行),这比命令行更加直观。
时光倒流:撤销与回退的终极指南
reset, revert, restore 到底该用哪个?
▶
写错代码不可怕,可怕的是不知道如何安全地撤销。请根据你代码所处的区域选择命令:
场景 1:刚写完,还没 git add (工作区)
# 丢弃工作区的修改,恢复到上一次 commit 的状态
git restore <文件名> # 新语法推荐
# 或 git checkout -- <文件名> # 老语法
场景 2:已经 git add,还没 git commit (暂存区)
# 将文件从暂存区移出,但保留工作区的修改
git restore --staged <文件名>
# 或 git reset HEAD <文件名>
场景 3:已经 git commit,但还没 push 到远程 (本地仓库)
# 软重置:撤销 commit,但保留代码在暂存区 (适合重新组织 commit)
git reset --soft HEAD~1
# 混合重置 (默认):撤销 commit,代码退回到工作区
git reset HEAD~1
# 硬重置:彻底销毁!撤销 commit 并丢弃所有代码修改 (危险⚠️)
git reset --hard HEAD~1
场景 4:已经 push 到远程仓库 (公共历史)
🚨 绝对不要使用 git reset --hard 然后 force push!
这会篡改公共历史,导致其他同事的本地仓库与远程冲突。正确的做法是使用 git revert。
# 生成一个新的 commit,其内容刚好与你要撤销的那个 commit 相反
git revert <commit-hash>
git push
代码藏匿术:Git Stash 进阶
紧急切分支修 Bug,但当前代码还没写完怎么办?
▶
当你正在 feature-A 分支疯狂写代码,老板突然让你切到 main 分支修一个线上紧急 Bug。此时你的代码乱七八糟,无法 commit。使用 Stash!
# 1. 将当前工作区和暂存区的修改“藏”起来,工作区瞬间变干净
git stash save "正在开发登录接口,未完成"
# 2. 切换分支去修 Bug
git checkout main
# ... 修复、提交、推送 ...
# 3. 切回原分支
git checkout feature-A
# 4. 查看藏起来的列表
git stash list
# 5. 恢复最近一次藏匿的代码,并从列表中删除
git stash pop
# (或者只恢复不删除)
git stash apply
💡 包含未追踪的新文件
默认 git stash 不会藏起你新建但还没 git add 的文件。加上 -u 参数即可:git stash -u。
四、团队协作与分支策略
Merge vs Rebase:世纪之争
如何保持提交历史的整洁?
▶
当你的功能分支开发完毕,准备合并到 main 分支时,你有两种选择:
1. Git Merge (合并)
git checkout main
git merge feature-A
特点:保留真实的开发历史,会生成一个额外的 "Merge commit"。历史线呈分叉状。 适用场景:公共分支(如 main, develop),保留完整的协作痕迹。
2. Git Rebase (变基)
git checkout feature-A
git rebase main
git checkout main
git merge feature-A
特点:把你分支上的 commit “拔”下来,重新“接”到 main 分支的最新节点上。历史线是一条完美的直线。 适用场景:个人开发的功能分支,用于在发起 PR 前整理自己的提交记录。
🚨 Rebase 黄金法则
绝对不要 rebase 已经推送到远程的公共分支! Rebase 会改变 commit 的 hash 值,如果别人已经拉取了旧的历史,你 rebase 后强推会导致整个团队的 Git 历史崩溃。
分支保护规则 (Branch Protection Rules)
如何防止猪队友直接 Push 代码到 main 分支?
▶
在团队项目中,必须对 main 或 master 分支开启保护规则。
配置路径:
GitHub 仓库 ➔ Settings ➔ Branches ➔ Add branch protection rule
强烈建议勾选的选项:
编写高质量的 Pull Request (PR)
如何让同事心甘情愿地为你 Approve?
▶
一个优秀的 PR 描述能大幅降低沟通成本和 Review 时间。建议采用以下 Markdown 模板:
## 📝 变更类型 (Type of Change)
- [ ] 🐛 Bug 修复
- [x] ✨ 新功能
- [ ] ♻️ 代码重构
## 🔗 关联 Issue
Closes #123
## 📸 截图/录屏 (如果是 UI 变更)
(拖拽图片到这里)
## 🧪 测试计划
1. 打开登录页
2. 输入错误密码,验证是否提示红字
3. 检查控制台是否有报错
## 📌 注意事项
本次修改重构了鉴权中间件,请后端同事重点 Review `auth.js` 文件。
五、GitHub 平台高级特性
GitHub Actions 进阶:Secrets 与矩阵构建
安全地注入密码,并在多个环境下并发测试
▶
1. 使用 Secrets 保护敏感信息
千万不要把数据库密码、AWS 密钥写在代码里!
steps:
- name: Run tests
env:
DATABASE_URL: ${{ secrets.DB_PASSWORD }}
run: npm run test
2. 矩阵构建 (Matrix Strategy)
你想测试代码在 Node 16, 18, 20 以及 Ubuntu, Windows 下是否都能正常运行?不需要写 6 个 job,使用 Matrix!
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16.x, 18.x, 20.x]
steps:
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
这会自动并发运行 2 x 3 = 6 个独立的 Job,极大节省时间。
GitHub Projects (V2) 看板管理
取代 Trello,在 GitHub 内完成敏捷开发管理
▶
新版 GitHub Projects 提供了类似 Notion 和 Trello 的强大表格/看板视图。
GitHub Copilot 与 AI 辅助编程
如何高效利用 AI 结对编程助手?
▶
Copilot 不仅仅是代码补全,掌握以下技巧能让它变成超级外脑:
六、常见疑难杂症与急救指南
🚨 救命!我不小心把密码/密钥 Push 上去了
即使删除了文件,历史记录里依然有!怎么彻底抹除?
▶
🚨 第一步:立即作废泄露的密钥!
无论你怎么清理 Git 历史,只要 Push 到了公开的 GitHub,爬虫机器人通常在几秒钟内就已经把密钥抓走了。必须先去云服务商后台删除/轮换该密钥!
第二步:从 Git 历史中彻底抹除文件
千万不要用 git rm,那只会产生一个新的 commit,旧文件依然藏在 .git 文件夹的历史里。你需要使用官方推荐的工具 git-filter-repo (或老工具 BFG)。
# 安装 git-filter-repo (需要 Python 环境)
pip install git-filter-repo
# 彻底从所有历史记录中删除 config/secrets.json 文件
git filter-repo --invert-paths --path config/secrets.json
清理完成后,你需要强制推送到远程(注意:这会重写历史,需通知团队所有人重新 clone 仓库):
git push origin --force --all
Commit 信息写错了怎么改?
修改最近一次或历史多次的提交说明
▶
1. 修改最近一次的 Commit 信息
git commit --amend
这会打开编辑器让你重新输入。如果只想改一句话,不想进编辑器:
git commit --amend -m "新的、正确的提交信息"
注意:如果这个 commit 已经 push,你需要 git push -f 强推。如果是公共分支,请谨慎使用。
2. 修改更早的历史 Commit 信息 (Interactive Rebase)
# 假设你要修改倒数第 3 个 commit
git rebase -i HEAD~3
编辑器会列出最近的 3 个 commit。将你要修改的那一行前面的 pick 改为 reword (或 r),保存退出。Git 会依次暂停,让你重新编写每个标记为 reword 的 commit 信息。
什么是 "detached HEAD" 状态?
游离状态的产生原因与自救方法
▶
当你执行 git checkout <某个具体的commit-hash> 而不是分支名时,你就会进入 "detached HEAD" (游离) 状态。
此时你处于一个“没有名字的时空”,你做的任何 commit 都不属于任何分支。一旦你切回其他分支,这些 commit 就会变成孤儿,随时可能被 Git 的垃圾回收机制清理掉。
自救方案:
如果你在这个状态下写了代码并 commit 了,千万不要直接切走!立刻为当前状态创建一个新分支:
git switch -c my-rescue-branch
这样你的代码就安全地保存在 my-rescue-branch 分支上了,之后你可以慢慢决定是合并它还是丢弃它。