外观
Git 使用手册
Git 基础概念
1. Git 工作流程

Git 有三个主要的工作区域:
- 工作区 (Working Directory):存放项目文件的目录,用户直接编辑文件的地方
- 暂存区 (Staging Area/Index):临时存放即将提交到本地仓库的文件变更
- 本地仓库 (Local Repository):存放项目版本历史记录的地方
2. Git 文件状态流转
Git 中的文件有四种状态,理解这些状态对于掌握 Git 工作流程至关重要:

文件状态详解
| 状态 | 中文名称 | 英文名称 | 说明 |
|---|---|---|---|
| 🔵 | 未跟踪 | Untrack | 新创建的文件,Git 还未开始跟踪 |
| 🟣 | 未修改 | Unmodified | 文件已被 Git 跟踪,但没有修改 |
| 🟡 | 已修改 | Modified | 文件已被修改,但还未添加到暂存区 |
| 🟢 | 已暂存 | Staged | 文件已添加到暂存区,准备提交 |
状态转换命令
bash
# 未跟踪 → 已暂存
git add <文件名>
# 未修改 → 已修改
# (直接编辑文件即可)
# 已修改 → 已暂存
git add <文件名>
# 已暂存 → 已提交(变为未修改)
git commit -m "提交信息"
# 已暂存 → 已修改
git reset <文件名>
# 已修改 → 未修改(撤销工作区修改)
git checkout -- <文件名>
# 或使用新命令
git restore <文件名>
# 已跟踪 → 未跟踪
git rm --cached <文件名>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3. Git 配置
首次使用 Git 需要配置用户信息:
bash
# 设置用户信息
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
# 设置远程仓库,并且添加github令牌(一般用于私有仓库拉取推送)
git remote set-url origin https://<新令牌>@github.com/fangyuan2357/vitepress.git
# 查看配置
git config --list1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
4. Git 基础命令
查看状态
bash
git status # 查看仓库的状态1
添加文件到暂存区
bash
git add <文件名> # 添加指定文件
git add . # 添加所有文件
git add *.js # 添加所有 js 文件1
2
3
2
3
提交更改
bash
git commit -m "提交说明" # 提交暂存区的文件
git commit -am "提交说明" # 添加并提交(仅限已跟踪的文件)
git commit --amend -m "修改提交说明" # 修改当前版本库的提交说明1
2
3
4
2
3
4
查看提交历史
bash
git log # 查看详细提交历史
git log --oneline # 查看简洁提交历史
git log --graph --oneline # 查看分支图形化历史1
2
3
2
3
Git 分支管理
1. 创建和切换分支
bash
# 创建分支
git branch <分支名>
# 切换分支
git checkout <分支名> # 传统方式
git switch <分支名> # 推荐使用(Git 2.23+)
# 创建并切换分支
git checkout -b <分支名> # 传统方式
git switch -c <分支名> # 推荐使用1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
2. 查看分支
bash
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支1
2
3
2
3
3. 合并分支
bash
# 切换到目标分支(通常是 main 或 master)
git switch main
# 合并指定分支
git merge <分支名>1
2
3
4
5
2
3
4
5
4. 删除分支
bash
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除未合并的分支1
2
2
Git 远程仓库
1. 添加远程仓库
bash
# 添加远程仓库
git remote add <远程仓库别名> <远程仓库地址>
# 示例
git remote add origin https://github.com/username/repository.git1
2
3
4
5
2
3
4
5
2. 查看远程仓库
bash
git remote -v # 查看远程仓库详细信息
git remote # 查看远程仓库别名1
2
2
3. 推送到远程仓库
bash
# 首次推送(设置上游分支)
git push -u <远程仓库名> <分支名>
# 后续推送
git push
# 推送所有分支
git push --all1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
4. 拉取远程仓库内容
| 命令形式 | 含义 | 是否自动合并 | 本地分支必须存在吗? | 备注 |
|---|---|---|---|---|
git pull <远程仓库名> <远程分支名> | 把 <远程仓库名>/<远程分支名> 拉取到当前分支并立即合并 | 是 | 否,但会直接合并到当前分支 | 最常用,相当于 git fetch + git merge |
git fetch <远程仓库名> | 把 <远程仓库名> 的所有分支更新同步到本地的远程跟踪分支(如 origin/master),不合并 | 否 | - | 需要后续手动 merge 或 rebase |
git pull <远程仓库名> <远程分支名>:<本地分支名> | 把 <远程分支名> 拉取到指定本地分支 <本地分支名>,并立即合并 | 是 | 本地分支可不存在,不存在则创建;存在则快进或合并 | 很少用,等价于 git fetch + git checkout <本地分支名> + git merge |
bash
# 拉取并合并
git pull <远程仓库名> <远程分支名>
# 仅拉取不合并
git fetch <远程仓库名>
# 指定本地分支
git pull <远程仓库名> <远程分支名>:<本地分支名>1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Git 撤销操作

1. git reset 的三种模式
bash
# --soft:保留工作区和暂存区的内容
git reset --soft <提交ID>
# --mixed(默认):保留工作区,重置暂存区
git reset --mixed <提交ID>
git reset <提交ID> # 等同于上面
# --hard:重置工作区和暂存区(危险操作)
git reset --hard <提交ID>1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
使用场景:
--soft:撤销提交,但保留所有文件更改--mixed:默认参数,撤销提交和暂存,但保留文件更改--hard:完全撤销,
2. 删除文件
bash
# 方式一:先删除工作区文件,再暂存删除操作
rm <文件名>
git add <文件名>
# 方式二:同时从工作区和暂存区删除
git rm <文件名>
# 方式三:仅从暂存区删除,保留工作区文件
git rm --cached <文件名>
# 递归删除目录
git rm -r <目录名>1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
3. 撤销操作详解
撤销工作区修改
bash
# 撤销工作区中单个文件的修改(回到最后一次提交的状态)
git checkout -- <文件名>
git restore <文件名> # Git 2.23+ 推荐使用
# 撤销工作区中所有文件的修改
git checkout -- .
git restore . # Git 2.23+ 推荐使用
# 从指定提交恢复文件到工作区
git checkout <提交ID> -- <文件名>
git restore --source=<提交ID> <文件名> # Git 2.23+ 推荐使用1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
撤销暂存区操作
bash
# 撤销暂存区的单个文件(文件回到已修改状态)
git reset <文件名>
git restore --staged <文件名> # Git 2.23+ 推荐使用
# 撤销暂存区的所有文件
git reset
git restore --staged . # Git 2.23+ 推荐使用1
2
3
4
5
6
7
2
3
4
5
6
7
撤销仓库提交
bash
# 撤销最近一次提交,保留工作区和暂存区
git reset --soft HEAD~1
# 撤销最近一次提交,保留工作区,清空暂存区
git reset --mixed HEAD~1 # 或者 git reset HEAD~1
# 撤销最近一次提交,同时清空工作区和暂存区(危险操作)
git reset --hard HEAD~1
# 撤销多个提交(回到指定提交)
git reset --hard <提交ID>
# 使用--hard是只会将工作区和暂存区已经跟踪的文件退回到指定提交状态
# 它不会、也不能删除「工作区中未被 Git 跟踪」的文件或目录(.gitignore 里的、或者你后来新建但还没 git add 的),所以未了目录的清晰,可以使用git clean清理未被跟踪的文件/目录
git clean -fdxn
-f 强制
-d 连同目录一起删
-x 把 .gitignore 里的也一起清掉(慎用,确认没重要文件)
-n 只列出将被删除的文件,不会真删
# 创建一个新提交来撤销指定提交(推荐用于已推送的提交)
git revert <提交ID>
git revert HEAD # 撤销最近一次提交1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
撤销操作对比表
| 操作目标 | 命令 | 工作区 | 暂存区 | 仓库 | 安全性 |
|---|---|---|---|---|---|
| 撤销工作区修改 | git restore <文件> | ✅ 恢复 | ❌ 不变 | ❌ 不变 | 🟢 安全 |
| 撤销暂存区 | git restore --staged <文件> | ❌ 不变 | ✅ 清空 | ❌ 不变 | 🟢 安全 |
| 软撤销提交 | git reset --soft HEAD~1 | ❌ 不变 | ❌ 不变 | ✅ 撤销 | 🟢 安全 |
| 混合撤销提交 | git reset --mixed HEAD~1 | ❌ 不变 | ✅ 清空 | ✅ 撤销 | 🟡 中等 |
| 硬撤销提交 | git reset --hard HEAD~1 | ✅ 清空 | ✅ 清空 | ✅ 撤销 | 🔴 危险 |
| 安全撤销提交 | git revert HEAD | ✅ 新提交 | ❌ 不变 | ✅ 新提交 | 🟢 安全 |
撤销操作使用场景
工作区撤销(用于未暂存的修改):
bash
# 场景:修改了文件但还未 git add,想要撤销修改
git restore README.md # 撤销 README.md 的修改
git restore . # 撤销所有文件的修改1
2
3
2
3
暂存区撤销(用于已暂存但未提交的修改):
bash
# 场景:已经 git add 但还未 git commit,想要取消暂存
git restore --staged src/main.js # 取消 main.js 的暂存
git restore --staged . # 取消所有文件的暂存1
2
3
2
3
仓库撤销(用于已提交的修改):
bash
# 场景1:刚刚提交但发现有问题,还未推送到远程
git reset --soft HEAD~1 # 撤销提交,保留所有修改
# 修改后重新提交
git add .
git commit -m "修正后的提交"
# 场景2:已推送到远程,需要安全撤销
git revert HEAD # 创建一个新提交来撤销
git push origin main # 推送撤销提交1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
⚠️ 危险操作警告
谨慎使用以下命令:
bash
# 这些命令会永久删除数据,使用前请确保已备份
git reset --hard HEAD~1 # 会永久丢失最近一次未提交的工作区和暂存区的修改
git clean -fd # 会删除未跟踪的文件和目录1
2
3
2
3
安全检查步骤:
bash
# 使用危险命令前,先检查状态
git status # 查看当前状态
git stash # 暂存当前修改(可选)
git log --oneline -5 # 查看最近几次提交
# 确认无误后再执行撤销命令1
2
3
4
5
6
2
3
4
5
6
4. Git Stash 临时保存
Git stash 可以临时将当前工作目录和暂存区的改动保存到一个栈中,然后恢复工作目录和暂存区到最近一次 commit 的状态。在需要快速切换分支或处理紧急任务时非常有用。
未跟踪(untracked) 和 忽略(ignored) 的文件(可选,使用 -u 或 -a)
基本 Stash 操作
bash
# 保存当前工作区和暂存区的修改
git stash # 使用默认消息
git stash save "描述信息" # 添加描述信息(已废弃,推荐下面的命令)
git stash push -m "描述信息" # Git 2.13+ 推荐语法
# 保存包括未跟踪的文件
git stash -u # 或 git stash --include-untracked
git stash push -u -m "包含未跟踪文件"
# 保存所有文件(包括被忽略的文件)
git stash -a # 或 git stash --all1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
查看 Stash 列表
bash
# 查看所有 stash
git stash list
# 查看指定 stash 的详细信息
git stash show # 显示最新 stash 的统计信息
git stash show -p # 显示最新 stash 的具体差异
git stash show stash@{1} # 显示指定 stash 的统计信息
git stash show -p stash@{1} # 显示指定 stash 的具体差异1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
恢复 Stash
bash
# 恢复最新的 stash(保留 stash 记录)
git stash apply
# 恢复指定的 stash
git stash apply stash@{1}
# 恢复最新的 stash 并删除 stash 记录
git stash pop
# 恢复指定的 stash 并删除记录
git stash pop stash@{1}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
删除 Stash
bash
# 删除最新的 stash
git stash drop
# 删除指定的 stash
git stash drop stash@{1}
# 删除所有 stash
git stash clear1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
高级 Stash 操作
bash
# 仅 stash 暂存区的内容
git stash --staged # Git 2.35+
# 仅 stash 工作区的内容(保留暂存区)
git stash --keep-index
# 交互式选择要 stash 的内容
git stash -p # 或 git stash --patch
# 从 stash 创建新分支
git stash branch <新分支名> stash@{1}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Stash 使用场景
场景 1:紧急切换分支
bash
# 正在 feature 分支开发,突然需要切换到 main 分支修复 bug
git stash push -m "功能开发进行中" # 保存当前进度
git switch main # 切换到主分支
# ... 修复 bug 并提交 ...
git switch feature # 切换回开发分支
git stash pop # 恢复之前的工作进度1
2
3
4
5
6
2
3
4
5
6
场景 2:临时保存未完成的实验性修改
bash
# 尝试了一些修改,但不确定是否要保留
git stash push -m "实验性修改"
# ... 做其他工作 ...
git stash list # 查看保存的修改
git stash show -p # 查看修改内容
git stash apply # 决定保留时应用修改
# 或者
git stash drop # 决定丢弃时删除修改1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
场景 3:部分文件 stash
bash
# 只想 stash 某些文件的修改
git stash -p # 交互式选择
# 或者先暂存想要保留的文件
git add 想要保留的文件.js
git stash --keep-index # 只 stash 未暂存的内容1
2
3
4
5
2
3
4
5
Stash 对比表
| 命令 | 作用 | 工作区 | 暂存区 | 是否删除 stash |
|---|---|---|---|---|
git stash | 保存修改 | ✅ 清空 | ✅ 清空 | ❌ 保留 |
git stash apply | 恢复修改 | ✅ 恢复 | ✅ 恢复 | ❌ 保留 |
git stash pop | 恢复并删除 | ✅ 恢复 | ✅ 恢复 | ✅ 删除 |
git stash drop | 仅删除 | ❌ 不变 | ❌ 不变 | ✅ 删除 |
实用技巧
给 stash 添加有意义的描述:
bash
# 好的 stash 描述
git stash push -m "添加用户登录功能-前端验证部分"
git stash push -m "修复购物车计算bug-临时方案"
# 避免无意义的描述
git stash push -m "临时保存"
git stash push -m "修改"1
2
3
4
5
6
7
2
3
4
5
6
7
定期清理 stash:
bash
# 查看所有 stash
git stash list
# 删除不需要的 stash
git stash drop stash@{3}
# 谨慎使用清空所有 stash
git stash clear1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
stash 冲突处理:
bash
# 如果 stash apply 时发生冲突
git stash apply
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
# 手动解决冲突后
git add file.txt # 标记冲突已解决
# 注意:apply 不会自动删除 stash,需要手动删除
git stash drop # 删除已应用的 stash1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Git 差异比较
1. git diff 命令详解
bash
# 查看工作区和暂存区之间的差异
git diff
# 查看暂存区和本地仓库之间的差异
git diff --cached
git diff --staged # 等同于上面
# 查看工作区、暂存区和本地仓库之间的差异
git diff HEAD
# 比较两个提交之间的差异
git diff <提交ID1> <提交ID2>
git diff HEAD~ HEAD # 比较最近两次提交
# 比较分支之间的差异
git diff <分支名1> <分支名2>
# 比较特定文件的差异
git diff <文件名>
git diff HEAD <文件名>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2. 差异输出说明
diff
- 红色(-):删除的内容
+ 绿色(+):添加的内容1
2
2
Git 忽略文件
1. .gitignore 文件
在项目根目录创建 .gitignore 文件,指定 Git 应该忽略的文件和目录。
2. 匹配规则
gitignore
# 注释:以 # 开头的行会被忽略
# 空行也会被忽略
# 忽略所有 .log 文件
*.log
# 忽略所有 .tmp 文件
*.tmp
# 忽略 node_modules 目录
node_modules/
# 忽略所有 .env 文件
.env
.env.local
.env.*.local
# 但不忽略 .env.example
!.env.example
# 忽略任意目录下的 .DS_Store 文件
**/.DS_Store
# 忽略 dist 目录下的所有内容
dist/
# 匹配单个字符
?.txt
# 匹配任意一位数字
file[0-9].txt
# 匹配任意一位小写字母
temp[a-z].log1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
3. 常用规则
| 规则 | 说明 |
|---|---|
* | 匹配任意个字符 |
? | 匹配单个字符 |
[abc] | 匹配列表中的单个字符 |
** | 匹配任意的中间目录 |
[0-9] | 匹配任意一位数字 |
[a-z] | 匹配任意一位小写字母 |
! | 取反(不忽略) |
Git 合并冲突
1. 冲突产生的原因
- 自动合并:两个分支未修改同一个文件的同一处位置
- 产生冲突:两个分支修改了同一个文件的同一处位置
2. 解决冲突步骤
Step 1:识别冲突文件
bash
git status # 查看哪些文件存在冲突1
Step 2:手动编辑冲突文件
冲突标记说明:
diff
<<<<<<< HEAD
当前分支的内容
=======
合并分支的内容
>>>>>>> branch-name1
2
3
4
5
2
3
4
5
Step 3:解决冲突并提交
bash
# 编辑完成后,添加到暂存区
git add <冲突文件>
# 提交合并结果
git commit -m "解决合并冲突"1
2
3
4
5
2
3
4
5
Step 4:中止合并(可选)
bash
# 如果想放弃合并
git merge --abort1
2
2
3. 预防冲突的最佳实践
- 经常同步主分支的最新内容
- 保持功能分支小而专注
- 团队成员之间及时沟通修改范围
Git Rebase 操作
1. Rebase 基本概念
Rebase(变基)是将一系列提交移动到新的基础提交上,使提交历史更加线性和整洁。
2. Rebase 操作步骤
bash
# 假设要将 dev 分支变基到 main 分支
# 1. 切换到开发分支
git switch dev
# 2. 执行 rebase
git rebase main
# 3. 切换到主分支
git switch main
# 4. 快进合并
git merge dev1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
3. Rebase vs Merge
| 操作 | 优点 | 缺点 |
|---|---|---|
| Merge | 保留完整的提交历史 | 提交历史可能复杂 |
| Rebase | 提交历史线性整洁 | 重写了提交历史 |
4. 交互式 Rebase
bash
# 交互式 rebase 最近 3 次提交
git rebase -i HEAD~31
2
2
可用操作:
pick:使用提交reword:使用提交,但修改提交信息edit:使用提交,但停下来修改squash:使用提交,但合并到前一个提交drop:删除提交
总结
Git 核心概念回顾
- 三个工作区域:工作区、暂存区、本地仓库
- 基础操作流程:add → commit → push
- 分支管理:创建、切换、合并、删除分支
- 远程协作:push、pull、fetch 操作
- 撤销操作:reset 的三种模式
- 冲突解决:手动编辑冲突文件