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

IT 技术 52 阅读 更新于 2026-09-05 09:19

😕 没有找到匹配的内容,请尝试其他关键词(如 "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。
  3. 💡 提示:多账号配置

    如果你同时有公司和个人的 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,而不是你的登录密码。
    5. ⚠️ 警告: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 分支?

      在团队项目中,必须对 mainmaster 分支开启保护规则。

      配置路径:

      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 文件中通过环境变量注入:
      3. 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