GitHub & Git 终极完全指南 | 从入门到精通

IT 技术 79 阅读 更新于 2026-09-25 17:37

😕 没有找到匹配的内容,请尝试其他关键词(如 "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

  1. 复制公钥:cat ~/.ssh/id_ed25519.pub (Windows 用 type 或记事本打开)
  2. 登录 GitHub ➔ Settings ➔ SSH and GPG keys ➔ New SSH key。

💡 提示:多账号配置

如果你同时有公司和个人的 GitHub 账号,可以在 ~/.ssh/config 文件中配置别名,让不同的仓库使用不同的密钥。

HTTPS 推送与 Personal Access Token (PAT)

GitHub 已废弃密码验证,必须使用 PAT

▶

如果你使用 HTTPS 地址 clone 仓库(而不是 SSH),在 push 时 GitHub 不再接受你的账号密码。你必须生成一个 Personal Access Token (PAT) 作为密码使用。

生成步骤:

  1. GitHub ➔ Settings ➔ Developer settings ➔ Personal access tokens ➔ Tokens (classic)。
  2. Generate new token,勾选 repo 权限(如果是操作 Gist 或 Workflow 需要勾选对应权限)。
  3. 生成后立即复制保存(网页只会显示一次)。
  4. 在终端 Push 提示输入密码时,粘贴这个 Token,而不是你的登录密码。

⚠️ 警告: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" (块),并询问你:

  • y:暂存这块修改
  • n:不暂存这块修改
  • s:把当前块拆成更小的两块
  • e:手动编辑当前块

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

强烈建议勾选的选项:

  • 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:连管理员也不能强行绕过规则。

编写高质量的 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 密钥写在代码里!

  1. 在仓库 Settings ➔ Secrets and variables ➔ Actions 中添加 Secret(如 DB_PASSWORD)。
  2. 在 workflow 文件中通过环境变量注入:
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 的强大表格/看板视图。

  • 自定义字段:除了默认的 Assignee, Labels,你可以添加 "Priority" (单选), "Sprint" (迭代), "Estimate" (数字) 等自定义字段。
  • 自动化工作流:内置自动化规则。例如:当 PR 被合并时,自动将关联的 Issue 卡片移动到 "Done" 列。
  • 图表视图:一键生成燃尽图 (Burnup chart) 或柱状图,向老板汇报进度极其方便。

GitHub Copilot 与 AI 辅助编程

如何高效利用 AI 结对编程助手?

▶

Copilot 不仅仅是代码补全,掌握以下技巧能让它变成超级外脑:

  • 注释驱动开发:先写清晰的注释,再让 Copilot 生成代码。
  • 生成测试用例:选中一个复杂的函数,在 Copilot Chat 中输入 /tests,它会自动生成覆盖各种边缘情况的单元测试代码。
  • 解释遗留代码:接手祖传代码看不懂?选中代码块,在 Chat 中输入 /explain,AI 会逐行为你拆解逻辑。
  • 修复 Bug:终端报错后,点击 Copilot 的 "Debug with 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 分支上了,之后你可以慢慢决定是合并它还是丢弃它。

← 返回IT 技术 yicool 百科 · GitHub & Git 终极完全指南 | 从入门到精通

评论 0