暂存与提交
#git
#add
#commit
#diff
暂存与提交#
工作区到暂存区#
暂存区是工作区和版本库之间的缓冲区域,允许你选择性地提交部分修改。
# ==================== 添加文件到暂存区 ====================
# 添加指定文件到暂存区
# <file> 是文件路径,可以添加多个文件:git add file1 file2
git add <file>
# 添加当前目录下的所有文件到暂存区
# 包括新增、修改、删除的文件
git add .
# ==================== 查看状态 ====================
# 查看工作区和暂存区之间的差异
# 显示已修改但未暂存的文件变更内容
git diff
# 查看当前工作区和暂存区的状态
# 显示哪些文件已暂存、哪些未暂存、哪些未跟踪
git status
✨ 技巧
git diff 的三种用法
| 命令 | 比较对象 | 使用场景 |
|---|---|---|
git diff | 工作区 vs 暂存区 | 查看未暂存的修改 |
git diff --cached | 暂存区 vs 最后一次提交 | 查看即将提交的内容 |
git diff HEAD | 工作区 vs 最后一次提交 | 查看所有未提交的修改 |
删除文件的处理#
在 Git 的眼中,删除文件 ≠ 文件消失,而是「该文件的新状态是:不存在」。这个「状态变更」和修改代码一样,必须经过暂存区才能被提交。
# ==================== 删除文件并暂存 ====================
# 删除工作区和暂存区中的文件
# 相当于 rm <file> + git add <file>
git rm <file>
# 仅从暂存区移除,保留工作区文件
# 常用于误提交敏感文件后的补救操作
git rm --cached <file>
# ==================== 手动删除后暂存 ====================
# 如果手动删除了文件(而非 git rm),需要手动暂存删除操作
# 方式一:指定文件
git add <被删除的文件名>
# 方式二:自动识别所有变更(包括删除)
git add .
⚠️ 注意
误提交敏感文件的处理
如果误将密码、密钥等敏感文件提交到了仓库,仅用 git rm 删除是不够的,因为历史记录中仍然存在。应该:
- 使用
git rm --cached从暂存区移除 - 将文件名添加到
.gitignore - 如果已推送到远程,需要清理历史记录(使用
git filter-branch或 BFG 工具)
暂存区到本地版本库#
使用 git commit 将暂存区的内容提交到本地版本库,创建一个新的提交记录。
# ==================== 提交暂存区内容 ====================
# 将暂存区的更改提交到本地版本库
# -m 后面跟提交信息,简要描述本次提交的内容
git commit -m "feat: 添加用户登录功能"
# ==================== 查看提交历史 ====================
# 查看提交历史,从最新到最早
git log
# 查看暂存区和最后一次提交之间的差异
# 确认即将提交的内容是否正确
git diff --cached
提交信息规范#
良好的提交信息有助于团队协作和版本管理。推荐使用 Conventional Commits 规范。
格式拆解#
一条规范的提交信息由三部分组成:
类型(影响范围): 简短描述
详细说明(可选)
备注(可选)
第一部分:类型 + 范围 + 描述(必填)
这一行告诉别人”你做了什么”,格式是 类型(范围): 描述:
- 类型:这次改动属于哪一类?(见下方表格)
- 范围:这次改动影响了哪个模块?(可选,用括号包裹)
- 描述:用一句话概括做了什么(不超过50个字)
第二部分:详细说明(可选)
如果改动比较复杂,可以在空一行后写更多细节,解释”为什么要做这个改动”。
第三部分:备注(可选)
如果有关联的 Issue 或其他信息,写在最后。
类型速查表#
| 类型 | 什么时候用 | 示例 |
|---|---|---|
feat | 添加了新功能 | feat: 添加用户注册功能 |
fix | 修复了 bug | fix: 修复登录验证失败问题 |
docs | 只改了文档 | docs: 更新 README 安装说明 |
style | 改了代码格式(不影响功能) | style: 格式化代码缩进 |
refactor | 重构代码(既不是新功能也不是修复) | refactor: 重构登录模块 |
perf | 优化了性能 | perf: 优化图片加载速度 |
test | 添加或修改测试 | test: 添加用户模块单元测试 |
chore | 改了构建工具、依赖等 | chore: 升级 webpack 到 v5 |
实际例子#
# 最简单的写法:类型 + 描述
git commit -m "fix: 修复空指针异常"
git commit -m "docs: 更新 API 文档"
# 加上影响范围(用括号包裹)
git commit -m "feat(auth): 添加 JWT 认证"
git commit -m "fix(login): 修复密码验证逻辑"
git commit -m "refactor(db): 重构数据库连接模块"
# 带详细说明的写法(空一行后写说明)
git commit -m "fix: 修复登录超时问题
将 session 过期时间从 30 分钟改为 2 小时,
解决了用户频繁需要重新登录的问题。"
✨ 技巧
跳过暂存区直接提交
# 将已跟踪文件的修改直接提交,跳过 git add 步骤
# 注意:新文件(未跟踪)不会被包含
git commit -am "commit message" 操作流程总结#
┌────────────────────────────────────────────────────────────┐
│ Git 暂存与提交流程 │
├────────────────────────────────────────────────────────────┤
│ │
│ 1. 修改文件 │
│ │ │
│ ▼ │
│ 2. git status ← 查看哪些文件被修改 │
│ │ │
│ ▼ │
│ 3. git diff ← 查看具体修改内容 │
│ │ │
│ ▼ │
│ 4. git add <file> ← 将修改添加到暂存区 │
│ │ │
│ ▼ │
│ 5. git diff --cached ← 确认暂存区内容 │
│ │ │
│ ▼ │
│ 6. git commit -m "..." ← 提交到本地版本库 │
│ │ │
│ ▼ │
│ 7. git log ← 查看提交历史 │
│ │
└────────────────────────────────────────────────────────────┘
相关笔记: