第8章 Git入门与协作
记录代码的每一次修改,多人协作的基础
作者:zyyc-0336 | 日期:2026-06-12
8.1 什么是版本控制
版本控制就是给代码拍照。每次你保存一个版本,就像给项目拍了一张快照。任何时候都可以回到过去的某个快照。
没有版本控制的日子:
作业v1.doc
作业v2.doc
作业v3_最终版.doc
作业v3_最终版_改.doc
作业v3_最终版_改_真的是最终版.doc ← 你是不是也这样?
Git 帮你彻底告别这种混乱。
Git 的核心概念
| 概念 | 大白话 |
|---|---|
| 工作区 | 你正在编辑的文件(就是你看到的项目文件夹) |
| 暂存区 | "准备提交"的缓冲区,告诉 Git "这些改动我要保存" |
| 仓库(Repository) | 所有历史版本的"数据库",存在 .git 文件夹里 |
三个区域的关系
工作区(你编辑的文件)
→ git add →
暂存区(准备好的改动)
→ git commit →
本地仓库(历史版本)
→ git push →
远程仓库(GitHub 上的备份)
💡 记忆口诀:编辑 → add 暂存 → commit 提交 → push 推送。四步走,步步为营。
8.2 安装与配置
安装 Git
| 系统 | 安装方式 |
|---|---|
| Windows | 去 git-scm.com 下载安装包,一路 Next |
| macOS | 安装 Xcode Command Line Tools:终端输入 xcode-select --install |
| Linux | sudo apt install git(Ubuntu)或 sudo yum install git(CentOS) |
检查是否安装成功
git --version
# 输出:git version 2.xx.x(版本号无所谓,有输出就是装好了)
基础配置(安装后必须做一次)
# 配置你的名字(会出现在每次提交记录里)
git config --global user.name "你的名字"
# 配置你的邮箱(最好和 GitHub 注册邮箱一致)
git config --global user.email "你的邮箱@example.com"
# 查看配置
git config --list
💡
--global 表示全局配置,电脑上所有项目都用这个。也可以在某个项目里单独配置(不加 --global)。8.2.1 SSH 密钥配置
用 HTTPS 推送代码到 GitHub 每次都要输入用户名和密码,很麻烦。配置 SSH 密钥后,可以免密推送。
第一步:生成 SSH 密钥
# 生成密钥对(一路回车用默认值即可)
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
# 提示输入文件位置:直接回车(默认 ~/.ssh/id_ed25519)
# 提示输入密码:直接回车(不设密码)
# 提示再输入密码:直接回车
第二步:复制公钥内容
# 查看公钥内容,复制输出的全部文字
cat ~/.ssh/id_ed25519.pub
# 输出类似:ssh-ed25519 AAAAC3Nza...你的邮箱@example.com
第三步:添加公钥到 GitHub
- 打开 GitHub → 右上角头像 → Settings
- 左侧栏点 SSH and GPG keys
- 点 New SSH key
- Title 随便写(如"我的电脑"),Key 里粘贴刚才复制的公钥
- 点 Add SSH key
第四步:测试连接
ssh -T git@github.com
# 成功会显示:Hi 你的用户名! You've successfully authenticated...
HTTPS vs SSH 对比
| 对比 | HTTPS | SSH |
|---|---|---|
| 克隆地址 | https://github.com/用户/项目.git | git@github.com:用户/项目.git |
| 推送认证 | 每次要输用户名密码(或 Token) | 免密(用密钥认证) |
| 设置难度 | 简单 | 需要生成密钥并添加到 GitHub |
| 推荐场景 | 临时使用、公司网络限制 SSH | 个人电脑长期开发(推荐) |
git clone git@github.com:你的用户名/my-blog.git
💡 记忆口诀:
ssh-keygen 生成钥匙,cat 看公钥,GitHub 加公钥,ssh -T 验证通。⚠️ 新手易错:私钥(
id_ed25519)绝对不能分享给别人!公钥(id_ed25519.pub)才是给 GitHub 的。8.3 基本操作
用一个博客项目的完整流程来演示 Git 的基本操作。
第一步:创建仓库
# 创建项目文件夹并进入
mkdir my-blog && cd my-blog
# 初始化 Git 仓库(会在文件夹里创建 .git 隐藏目录)
git init
# 输出:Initialized empty Git repository in .../my-blog/.git/
第二步:创建文件并提交
# 创建项目文件
echo "# 我的博客" > README.md
echo "<h1>我的博客</h1>" > index.html
# 查看状态(红色=未跟踪/已修改)
git status
# 会显示 README.md 和 index.html 是 "Untracked files"(未跟踪)
# 把文件添加到暂存区
git add README.md index.html
# 再看状态(绿色=已暂存,准备提交)
git status
# 会显示 "Changes to be committed"
# 提交到本地仓库
git commit -m "初始化博客项目:添加 README 和首页"
# 输出:[main (root-commit) xxxx] 初始化博客项目...
第三步:修改并再次提交
# 修改文件
echo "<h1>我的博客</h1><p>欢迎来到我的博客</p>" > index.html
# 查看修改了什么
git diff
# 会显示具体改了哪些行
# 添加并提交
git add index.html
git commit -m "feat: 首页添加欢迎语"
第四步:推送到 GitHub
首先在 GitHub 上创建一个新仓库(网页操作),然后:
# 关联远程仓库(把下面的 URL 换成你自己的)
git remote add origin https://github.com/你的用户名/my-blog.git
# 第一次推送(-u 设置默认关联)
git push -u origin main
# 以后直接用
git push
第五步:拉取更新
如果别人(或你在另一台电脑上)推送了新代码:
# 拉取远程的最新代码
git pull
常用命令速查表
| 命令 | 作用 | 记忆口诀 |
|---|---|---|
git init | 初始化仓库 | "开张" |
git status | 查看当前状态 | "看看改了啥" |
git diff | 查看具体修改 | "看看怎么改的" |
git add . | 添加所有改动到暂存区 | "准备提交" |
git add 文件名 | 添加指定文件 | "选中提交" |
git commit -m "消息" | 提交到本地仓库 | "保存快照" |
git log | 查看提交历史 | "翻看相册" |
git push | 推送到远程仓库 | "上传备份" |
git pull | 拉取远程更新 | "同步最新" |
git clone URL | 克隆远程仓库 | "下载项目" |
commit 消息规范(推荐)
| 前缀 | 含义 | 示例 |
|---|---|---|
feat: | 新功能 | feat: 添加文章搜索功能 |
fix: | 修复 bug | fix: 修复首页图片不显示 |
docs: | 文档修改 | docs: 更新 README |
style: | 样式修改 | style: 调整导航栏颜色 |
refactor: | 重构代码 | refactor: 拆分工具函数 |
⚠️ 新手易错:
⚠️ 新手易错:
git add . 会添加所有修改过的文件,包括你不想提交的。提交前先 git status 看看。⚠️ 新手易错:
git commit 不带 -m 会打开编辑器让你写消息,新手容易搞不清楚怎么退出。永远用 -m 直接写消息。
8.4 分支管理
分支就是代码的"平行宇宙"。你在分支上随便改,不影响主分支。改好了再合并回去。
你想给博客加一个"暗色模式"功能,但又怕改坏了原来的代码。分支让你在"副本"上开发,搞定了再合回来。
# 查看当前分支
git branch
# * main(星号表示当前分支)
# 创建新分支
git branch feature/dark-mode
# 切换到新分支
git checkout feature/dark-mode
# 或者用新命令(推荐):
git switch feature/dark-mode
# 创建并切换(一步到位)
git checkout -b feature/dark-mode
# 或:
git switch -c feature/dark-mode
# 在新分支上开发
echo "body { background: #222; color: #fff; }" > dark.css
git add dark.css
git commit -m "feat: 添加暗色模式样式"
# 切回主分支
git switch main
# 合并新分支到主分支
git merge feature/dark-mode
# 删除已合并的分支(可选,保持整洁)
git branch -d feature/dark-mode
分支工作流程
main ─────●─────●─────●─────● (合并)──→
\ /
feature/dark-mode ●─────●─────●
常用分支操作
| 命令 | 作用 |
|---|---|
git branch | 查看所有分支 |
git branch 名称 | 创建分支 |
git switch 名称 | 切换分支 |
git switch -c 名称 | 创建并切换 |
git merge 名称 | 合并指定分支到当前分支 |
git branch -d 名称 | 删除已合并的分支 |
💡 分支命名习惯:
feature/功能名(新功能)、fix/问题名(修 bug)、docs/内容名(文档)。8.4.1 git stash 暂存工作
git stash 可以把当前工作区的修改临时"藏起来",让你的工作区变干净。等你做完别的事(比如切分支修 bug),再把藏起来的修改恢复回来。
典型使用场景:你正在 feature/login 分支写登录功能,写到一半还没法 commit。这时 main 分支有一个紧急 bug 要修。你不想 commit 半成品代码,也不想丢掉修改——用 git stash 暂存起来。
常用命令
| 命令 | 作用 |
|---|---|
git stash | 把当前修改暂存起来,工作区变干净 |
git stash list | 查看所有暂存的记录 |
git stash pop | 恢复最近一次暂存并删除该记录 |
git stash apply | 恢复最近一次暂存(不删除记录) |
git stash drop | 删除最近一次暂存记录 |
git stash clear | 清空所有暂存记录 |
# 场景:正在写功能,突然要切分支修 bug
# 1. 暂存当前修改
git stash
# 输出:Saved working directory and index state WIP on feature/login: xxxxx
# 2. 工作区变干净了,可以安全切分支
git switch main
# 3. 修完 bug,提交
git add .
git commit -m "fix: 修复紧急 bug"
# 4. 切回原来的分支
git switch feature/login
# 5. 恢复之前的修改
git stash pop
# 之前写到一半的代码又回来了!
# 6. 查看暂存列表(可能有多条记录)
git stash list
# stash@{0}: WIP on feature/login: xxxxx
# stash@{1}: WIP on feature/login: yyyyy
💡 记忆口诀:
stash 藏起来,pop 拿回来,list 看一看,clear 全删掉。⚠️ 新手易错:
stash pop 恢复后,如果和当前代码有冲突,Git 会提示冲突,需要手动解决。如果不确定会不会冲突,先用 stash apply(不会删记录),确认没问题后再 stash drop。8.5 冲突解决与 .gitignore
8.5.1 冲突解决
当两个人(或两个分支)修改了同一个文件的同一行,合并时就会产生冲突。Git 不知道该用谁的,需要你手动解决。
# 模拟冲突:两个分支都修改了 index.html
# 分支 A:<h1>版本A</h1>
# 分支 B:<h1>版本B</h1>
# 合并时 Git 会提示冲突
git merge feature/branch-b
# CONFLICT (content): Merge conflict in index.html
打开冲突文件,会看到类似这样的内容:
<<<<<<< HEAD
<h1>版本A</h1>
=======
<h1>版本B</h1>
>>>>>>> feature/branch-b
解决步骤
- 打开冲突文件,找到
<<<<<<<标记 - 决定保留哪个版本(或两个都保留),删掉标记符号
git add+git commit
# 手动修改后:
<h1>最终版本</h1>
# 标记为已解决
git add index.html
# 提交合并
git commit -m "merge: 合并 feature/branch-b,解决 index.html 冲突"
8.5.2 .gitignore 文件
.gitignore 告诉 Git "这些文件不要跟踪"。在项目根目录创建一个 .gitignore 文件:
touch .gitignore
# .gitignore 文件内容
# 依赖文件夹(npm 自动生成,不用提交)
node_modules/
# 构建输出
dist/
build/
# 环境变量(可能包含密码)
.env
# 操作系统文件
.DS_Store # macOS
Thumbs.db # Windows
# 编辑器配置
.vscode/
.idea/
# 日志文件
*.log
常用规则
| 规则 | 含义 | 示例 |
|---|---|---|
文件名 | 忽略指定文件 | .env |
文件夹/ | 忽略整个文件夹 | node_modules/ |
*.后缀 | 忽略某类文件 | *.log |
!文件名 | 不忽略(取反) | !important.log |
⚠️ 新手易错:
⚠️ 新手易错:
.gitignore 只能忽略还没被 Git 跟踪的文件。如果 node_modules 已经被提交过了,你需要先 git rm -r --cached node_modules 再提交。⚠️ 新手易错:
.env 文件包含 API 密钥等敏感信息,绝对不能提交到 GitHub。一定要加到 .gitignore。
8.6 GitHub 协作:Pull Request 工作流
Pull Request(简称 PR)是 GitHub 上多人协作的核心方式。你不能直接改别人的仓库,而是先"复制"一份(Fork),改好了再请求原作者"合并"你的修改。
完整 PR 工作流(六步)
第一步:Fork 仓库
在 GitHub 上打开你想贡献的项目,点右上角的 Fork 按钮。这会在你的账号下创建一份该项目的副本。
原始仓库:https://github.com/原作者/awesome-project
你的副本:https://github.com/你的用户名/awesome-project
第二步:克隆你的 Fork 到本地
git clone git@github.com:你的用户名/awesome-project.git
cd awesome-project
第三步:创建新分支并修改
# 创建并切换到新分支
git switch -c fix/typo-in-readme
# 修改文件(比如修了个错别字)
# ...编辑 README.md ...
# 提交修改
git add README.md
git commit -m "docs: 修复 README 中的错别字"
第四步:推送到你的 Fork
git push origin fix/typo-in-readme
第五步:创建 Pull Request
- 打开你的 Fork 页面(
github.com/你的用户名/awesome-project) - GitHub 会自动提示"你刚推送了新分支,要不要创建 PR?"点 Compare & pull request
- 填写 PR 标题和描述(说明你改了什么、为什么改)
- 点 Create pull request
第六步:等待 Code Review 和合并
- 项目维护者会审查你的代码(Code Review)
- 可能会要求你修改(在同一个分支继续提交就行)
- 审核通过后,维护者点 Merge pull request 合入主分支
PR 工作流图示
原始仓库 main ─────●─────●─────●─────● (合并 PR)
\\ /
你的 Fork / fix 分支 ●─────●─────●
1. Fork → 2. Clone → 3. Branch → 4. 修改 → 5. Push → 6. 创建 PR
PR 常用术语
| 术语 | 含义 |
|---|---|
| Fork | 在你的账号下复制一份别人的仓库 |
| PR(Pull Request) | 请求原作者合并你的修改 |
| Code Review | 项目维护者审查你的代码 |
| Merge | 把你的分支合入主分支 |
| Review comment | 审查者在代码行上留的评论 |
| Resolve conversation | 标记审查意见已处理 |
💡 记忆口诀:Fork 复制到我家,Branch 分支改代码,Push 推送建 PR,Review 审查再 Merge。
⚠️ 新手易错:创建 PR 前,先
git pull origin main 同步一下原始仓库的最新代码,避免冲突。如果 Fork 后原始仓库有更新,可以用 GitHub 网页上的 Sync fork 按钮同步。本章复盘——Git 核心要点
| 要点 | 说明 |
|---|---|
| 三大区域 | 工作区 → 暂存区(add)→ 仓库(commit) |
| git init | 初始化仓库 |
| git add | 添加到暂存区,add . 添加全部 |
| git commit -m "消息" | 提交到本地仓库 |
| git push | 推送到远程仓库 |
| git pull | 拉取远程更新 |
| git branch / switch / merge | 创建、切换、合并分支 |
| 冲突解决 | 手动编辑冲突文件,删掉标记,add + commit |
| .gitignore | 排除不需要跟踪的文件(node_modules、.env 等) |
下一章预告(第8章):我们将学习Node.js 基础——JavaScript 服务端运行环境、npm 包管理和常用模块。
本文档由 zyyc-0336 编写,最后更新:2026-06-14