暂存与提交

#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 删除是不够的,因为历史记录中仍然存在。应该:

  1. 使用 git rm --cached 从暂存区移除
  2. 将文件名添加到 .gitignore
  3. 如果已推送到远程,需要清理历史记录(使用 git filter-branch 或 BFG 工具)

暂存区到本地版本库#

使用 git commit 将暂存区的内容提交到本地版本库,创建一个新的提交记录。

# ==================== 提交暂存区内容 ====================
# 将暂存区的更改提交到本地版本库
# -m 后面跟提交信息,简要描述本次提交的内容
git commit -m "feat: 添加用户登录功能"

# ==================== 查看提交历史 ====================
# 查看提交历史,从最新到最早
git log

# 查看暂存区和最后一次提交之间的差异
# 确认即将提交的内容是否正确
git diff --cached

提交信息规范#

良好的提交信息有助于团队协作和版本管理。推荐使用 Conventional Commits 规范。

格式拆解#

一条规范的提交信息由三部分组成:

类型(影响范围): 简短描述

详细说明(可选)

备注(可选)

第一部分:类型 + 范围 + 描述(必填)

这一行告诉别人”你做了什么”,格式是 类型(范围): 描述

  • 类型:这次改动属于哪一类?(见下方表格)
  • 范围:这次改动影响了哪个模块?(可选,用括号包裹)
  • 描述:用一句话概括做了什么(不超过50个字)

第二部分:详细说明(可选)

如果改动比较复杂,可以在空一行后写更多细节,解释”为什么要做这个改动”。

第三部分:备注(可选)

如果有关联的 Issue 或其他信息,写在最后。

类型速查表#

类型什么时候用示例
feat添加了新功能feat: 添加用户注册功能
fix修复了 bugfix: 修复登录验证失败问题
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             ← 查看提交历史                      │
│                                                            │
└────────────────────────────────────────────────────────────┘

相关笔记