git stashgit add 和 git commit 是 Git 中三个不同用途的命令,分别用于处理工作区、暂存区和版本库的代码状态,核心区别如下:

1. git add:将工作区修改添加到暂存区

  • 作用:把工作区中修改的文件(新增、修改、删除)添加到 暂存区(Stage),让 Git 跟踪这些变更,为后续提交做准备。
  • 场景:当你完成一部分修改,想将这些变更标记为 “待提交” 状态时使用。
  • 示例
    git add filename.txt  # 添加单个文件
    git add .             # 添加当前目录所有变更(新增、修改,不包括删除)
    git add -A            # 添加所有变更(包括删除的文件)
    
  • 特点
    • 暂存区是工作区和版本库之间的 “过渡区”,可以分批添加不同文件的变更。
    • 执行后,git status 会显示这些文件处于 “已暂存” 状态(绿色)。

2. git commit:将暂存区变更提交到版本库

  • 作用:把暂存区中的所有变更(即 git add 后的内容)提交到 本地版本库(Repository),生成一个新的版本快照,并附带提交信息。
  • 场景:当你完成一个完整功能或修复,确认暂存区的变更无误后,将其 “固化” 为一个版本。
  • 示例
    git commit -m "feat: 新增登录功能"  # 提交并添加说明信息
    
  • 特点
    • 每个提交会生成一个唯一的哈希值(如 a1b2c3d),用于标识这个版本,方便后续回溯。
    • 提交后,暂存区的变更会被清空,工作区若没有新修改,git status 会显示 “工作区干净”。

3. git stash:暂存工作区未提交的变更(临时保存)

  • 作用:将工作区中 未提交的变更(包括已 add 到暂存区和未 add 的修改) 临时 “储藏” 起来,让工作区回到干净状态(与最近一次提交一致),方便切换分支或处理其他任务。
  • 场景
    • 正在当前分支开发,突然需要切换到其他分支修复紧急 bug,但当前修改还没完成,不想提交(避免产生无效版本)。
    • 想拉取远程最新代码,但本地有未提交的修改,可能冲突时,先暂存再拉取。
  • 示例
    git stash                # 暂存当前所有未提交变更
    git stash save "备注信息" # 暂存时添加备注(方便后续区分)
    git stash pop            # 恢复最近一次暂存的变更,并删除暂存记录
    git stash apply          # 恢复最近一次暂存的变更,保留暂存记录
    git stash list           # 查看所有暂存记录
    
  • 特点
    • 暂存的内容保存在 Git 的 “储藏区”,不属于任何分支,切换分支后仍可恢复。
    • 暂存后,工作区和暂存区都会回到最近一次提交的状态(git status 显示干净)。

三者核心区别总结

命令 操作对象 目的 典型场景
git add 工作区 → 暂存区 标记待提交的变更 准备提交前,分批选择要提交的文件
git commit 暂存区 → 本地版本库 生成版本快照,固化变更 完成功能 / 修复后,提交一个有意义的版本
git stash 工作区 + 暂存区 → 储藏区 临时保存未完成的变更,清空工作区 需切换分支或处理其他任务,暂不想提交变更

简单说:add 是 “选中要提交的内容”,commit 是 “确认提交到版本库”,stash 是 “先把没完成的工作藏起来,稍后再继续”。

在 Git 中,工作区、暂存区、储藏区和本地版本库是四个核心概念,它们共同构成了 Git 管理代码变更的流程,理解这些区域的作用和关系是掌握 Git 的关键。

1. 工作区(Working Directory)

  • 定义:你当前正在编辑代码的目录(即项目文件夹),是你能直观看到和修改文件的地方。
  • 作用:存放项目的实际文件,所有新增、修改、删除的操作都先在这里发生。
  • 特点
    • 工作区的文件状态分为两种:
      • 未跟踪(Untracked):新创建的文件,Git 尚未记录其存在(git status 中显示红色)。
      • 已跟踪(Tracked):Git 已记录的文件(曾被 git add 或 git commit 处理过),包括 “未修改”“已修改”“已暂存” 三种细分状态。
    • 工作区的修改不会自动被 Git 记录,需要手动通过命令(如 git add)让 Git 关注。

2. 暂存区(Staging Area / Index)

  • 定义:位于 .git 目录内的一个临时区域(可理解为 “待提交缓冲区”),用于存放 “准备提交到版本库” 的变更。
  • 作用:筛选和暂存工作区中需要提交的内容,让你可以分批、有选择地提交修改(而非一次性提交所有变更)。
  • 特点
    • 通过 git add <文件> 将工作区的修改添加到暂存区(git status 中显示绿色 “已暂存”)。
    • 暂存区的内容是 “预提交版本”,可以再次修改工作区文件后,用 git add 更新暂存区(覆盖之前的暂存内容)。
    • 只有暂存区的内容会被 git commit 提交到本地版本库。

3. 储藏区(Stash Area)

  • 定义:Git 用于临时保存 “未完成变更” 的区域,存放的是工作区和暂存区中未提交的修改(可理解为 “草稿箱”)。
  • 作用:当你需要暂时搁置当前未完成的工作(如切换分支处理紧急任务),但又不想提交一个不完整的版本时,可将变更暂存到储藏区,让工作区回到干净状态。
  • 特点
    • 通过 git stash 命令将当前工作区和暂存区的未提交变更(包括已 add 和未 add 的内容)存入储藏区。
    • 储藏区的内容独立于分支,切换分支后仍可通过 git stash pop 或 git stash apply 恢复到任意分支。
    • 可通过 git stash list 查看所有储藏记录,每条记录有唯一标识(如 stash@{0}),方便管理多个暂存内容。

4. 本地版本库(Local Repository)

  • 定义:位于项目根目录下的 .git 隐藏文件夹,是 Git 真正存储代码历史版本的核心区域,包含所有分支、提交记录、标签等元数据。
  • 作用:永久保存代码的完整历史快照,每个提交(commit)都是一个不可修改的版本,可随时回溯到任意历史状态。
  • 特点
    • 通过 git commit 命令将暂存区的内容提交到本地版本库,生成一个新的版本(包含唯一哈希值、提交信息、作者等)。
    • 本地版本库的内容仅存在于本地电脑,如需同步到团队共享服务器,需通过 git push 推送到远程版本库(如 GitHub、GitLab)。
    • 支持分支管理,不同分支的版本历史独立存储,可通过 git checkout 切换分支查看不同版本的代码。

四者关系与工作流程

  1. 修改代码:在 工作区 编辑文件(新增、修改、删除)。
  2. 暂存变更:用 git add 将工作区中需要提交的修改放到 暂存区
  3. 提交版本:用 git commit 将暂存区的内容提交到 本地版本库,生成历史记录。
  4. 临时搁置:若修改未完成需中断,用 git stash 将工作区 + 暂存区的变更存到 储藏区,后续用 git stash pop 恢复继续工作。

简单来说:

  • 工作区是 “草稿纸”,暂存区是 “待提交清单”,本地版本库是 “档案柜”,储藏区是 “临时抽屉”。
  • 代码变更的流向通常是:工作区 → 暂存区 → 本地版本库,而储藏区是临时偏离这个流程时的 “中转站”。

在 Git 中,工作区、暂存区、储藏区和本地版本库是四个核心概念,它们共同构成了 Git 管理代码变更的流程,理解这些区域的作用和关系是掌握 Git 的关键。

1. 工作区(Working Directory)

  • 定义:你当前正在编辑代码的目录(即项目文件夹),是你能直观看到和修改文件的地方。
  • 作用:存放项目的实际文件,所有新增、修改、删除的操作都先在这里发生。
  • 特点
    • 工作区的文件状态分为两种:
      • 未跟踪(Untracked):新创建的文件,Git 尚未记录其存在(git status 中显示红色)。
      • 已跟踪(Tracked):Git 已记录的文件(曾被 git add 或 git commit 处理过),包括 “未修改”“已修改”“已暂存” 三种细分状态。
    • 工作区的修改不会自动被 Git 记录,需要手动通过命令(如 git add)让 Git 关注。

2. 暂存区(Staging Area / Index)

  • 定义:位于 .git 目录内的一个临时区域(可理解为 “待提交缓冲区”),用于存放 “准备提交到版本库” 的变更。
  • 作用:筛选和暂存工作区中需要提交的内容,让你可以分批、有选择地提交修改(而非一次性提交所有变更)。
  • 特点
    • 通过 git add <文件> 将工作区的修改添加到暂存区(git status 中显示绿色 “已暂存”)。
    • 暂存区的内容是 “预提交版本”,可以再次修改工作区文件后,用 git add 更新暂存区(覆盖之前的暂存内容)。
    • 只有暂存区的内容会被 git commit 提交到本地版本库。

3. 储藏区(Stash Area)

  • 定义:Git 用于临时保存 “未完成变更” 的区域,存放的是工作区和暂存区中未提交的修改(可理解为 “草稿箱”)。
  • 作用:当你需要暂时搁置当前未完成的工作(如切换分支处理紧急任务),但又不想提交一个不完整的版本时,可将变更暂存到储藏区,让工作区回到干净状态。
  • 特点
    • 通过 git stash 命令将当前工作区和暂存区的未提交变更(包括已 add 和未 add 的内容)存入储藏区。
    • 储藏区的内容独立于分支,切换分支后仍可通过 git stash pop 或 git stash apply 恢复到任意分支。
    • 可通过 git stash list 查看所有储藏记录,每条记录有唯一标识(如 stash@{0}),方便管理多个暂存内容。

4. 本地版本库(Local Repository)

  • 定义:位于项目根目录下的 .git 隐藏文件夹,是 Git 真正存储代码历史版本的核心区域,包含所有分支、提交记录、标签等元数据。
  • 作用:永久保存代码的完整历史快照,每个提交(commit)都是一个不可修改的版本,可随时回溯到任意历史状态。
  • 特点
    • 通过 git commit 命令将暂存区的内容提交到本地版本库,生成一个新的版本(包含唯一哈希值、提交信息、作者等)。
    • 本地版本库的内容仅存在于本地电脑,如需同步到团队共享服务器,需通过 git push 推送到远程版本库(如 GitHub、GitLab)。
    • 支持分支管理,不同分支的版本历史独立存储,可通过 git checkout 切换分支查看不同版本的代码。

四者关系与工作流程

  1. 修改代码:在 工作区 编辑文件(新增、修改、删除)。
  2. 暂存变更:用 git add 将工作区中需要提交的修改放到 暂存区
  3. 提交版本:用 git commit 将暂存区的内容提交到 本地版本库,生成历史记录。
  4. 临时搁置:若修改未完成需中断,用 git stash 将工作区 + 暂存区的变更存到 储藏区,后续用 git stash pop 恢复继续工作。

简单来说:

  • 工作区是 “草稿纸”,暂存区是 “待提交清单”,本地版本库是 “档案柜”,储藏区是 “临时抽屉”。
  • 代码变更的流向通常是:工作区 → 暂存区 → 本地版本库,而储藏区是临时偏离这个流程时的 “中转站”。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐