第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

系统安装方式
Windowsgit-scm.com 下载安装包,一路 Next
macOS安装 Xcode Command Line Tools:终端输入 xcode-select --install
Linuxsudo 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

  1. 打开 GitHub → 右上角头像 → Settings
  2. 左侧栏点 SSH and GPG keys
  3. New SSH key
  4. Title 随便写(如"我的电脑"),Key 里粘贴刚才复制的公钥
  5. Add SSH key

第四步:测试连接

ssh -T git@github.com
# 成功会显示:Hi 你的用户名! You've successfully authenticated...

HTTPS vs SSH 对比

对比HTTPSSSH
克隆地址https://github.com/用户/项目.gitgit@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:修复 bugfix: 修复首页图片不显示
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

解决步骤

  1. 打开冲突文件,找到 <<<<<<< 标记
  2. 决定保留哪个版本(或两个都保留),删掉标记符号
  3. 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

  1. 打开你的 Fork 页面(github.com/你的用户名/awesome-project
  2. GitHub 会自动提示"你刚推送了新分支,要不要创建 PR?"点 Compare & pull request
  3. 填写 PR 标题和描述(说明你改了什么、为什么改)
  4. Create pull request

第六步:等待 Code Review 和合并

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