要搞懂 git add、git commit、git push 的区别和联系,核心是先理解 Git 的四个核心区域,这三个命令本质是把代码在不同区域间「传递」的工具。我用「仓库发货」的比喻讲清楚,新手也能秒懂:
一、先吃透 Git 的 4 个核心区域(关键基础)
| 区域名称 | 通俗比喻 | 核心作用 | 对应状态(git status 显示) |
|---|---|---|---|
| 工作区(Workspace) | 你的办公桌 | 日常写代码、改文件的地方(本地电脑文件夹) | Changes not staged for commit(未暂存) |
| 暂存区(Staging/Index) | 发货打包区 | 临时存放「准备提交」的文件(待确认的修改) | Changes to be committed(已暂存) |
| 本地版本库(Local Repo) | 公司本地仓库 | 保存已确认的提交记录(历史版本) | 提交后 nothing to commit |
| 远程版本库(Remote Repo) | 公司云端仓库 | 同步到服务器的代码(多人协作共享) | 推送到远程后和本地版本库一致 |
区域间的核心逻辑:工作区(写代码)→ 暂存区(选要提交的文件)→ 本地版本库(确认提交)→ 远程版本库(推送给团队)
二、git add / git commit / git push 的区别 & 联系
1. git add:工作区 → 暂存区(打包待发货)
作用:把工作区中修改 / 新增的文件「加入暂存区」,标记为「准备提交」;
通俗理解:你在办公桌上改好了文件,把它放进「打包区」,准备交给仓库;
常用命令:
bash
git add 文件名 # 单个文件加入暂存区
git add . # 所有修改的文件加入暂存区(谨慎用)
git add 目录/ # 整个目录加入暂存区
关键特点:
仅改变暂存区,不影响工作区和版本库;
可多次执行(比如分批次把文件加入暂存区);
用 git reset HEAD 文件名 可把文件从暂存区退回工作区。
2. git commit:暂存区 → 本地版本库(确认入库)
作用:把暂存区的所有文件「提交」到本地版本库,生成一条不可篡改的提交记录(含版本号、提交信息、修改内容);
通俗理解:打包区的文件确认无误,正式存入公司本地仓库,生成入库记录;
常用命令:
bash
git commit -m "feat: 新增用户登录功能" # 带提交信息的提交(推荐)
git commit --amend # 修改最后一次提交(未推远程时用)
关键特点:
提交后暂存区被清空,工作区修改仍保留;
提交记录仅保存在本地,团队看不到;
用 git log 可查看所有本地提交记录。
3. git push:本地版本库 → 远程版本库(同步到云端)
作用:把本地版本库的提交记录「推送」到远程服务器(如 GitHub/GitLab/Gitee);
通俗理解:把本地仓库的入库记录同步到云端仓库,让团队成员能获取你的修改;
常用命令:
bash
git push origin 分支名 # 推送到指定远程分支(如 git push origin main)
git push -u origin 分支名 # 第一次推送时绑定本地和远程分支(后续可直接 git push)
关键特点:
推送前需确保本地分支和远程分支无冲突(有冲突需先 git pull 合并);
推送后团队成员可通过 git pull 获取你的修改;
用 git push --force 可强制推送(覆盖远程版本,生产环境慎用)。
三者的核心联系(完整流程)
bash
# 1. 工作区写代码
# 2. git add 把修改加入暂存区
git add src/user.js
# 3. git commit 把暂存区提交到本地版本库
git commit -m "feat: 新增用户信息接口"
# 4. git push 把本地提交推送到远程版本库
git push origin main
三、直观对比表(快速查阅)
| 命令 | 数据流向 | 核心目的 | 是否影响远程 | 可撤回性 |
|---|---|---|---|---|
git add |
工作区 → 暂存区 | 选择要提交的文件 | ❌ 否 | ✅ 可(git reset HEAD) |
git commit |
暂存区 → 本地版本库 | 生成本地版本记录 | ❌ 否 | ✅ 可(git reset) |
git push |
本地版本库 → 远程版本库 | 同步代码到团队云端 | ✅ 是 | ⚠️ 谨慎(需 git revert) |
四、常见误区(避坑)
❌ 认为 git commit 后代码就同步给团队了:错!commit 仅保存在本地,必须 push 后远程才会更新;
❌ 直接执行 git push 而不 add/commit:错!push 只能推送本地版本库的提交记录,未 add/commit 的修改不会被推送;
❌ 用 git add . 无脑添加所有文件:易把无关文件(如日志、缓存、IDE 配置)加入暂存区,建议按需 git add 文件名。
总结
**区域核心逻辑:**工作区(写代码)→ 暂存区(选文件)→ 本地版本库(确认提交)→ 远程版本库(共享);
**命令核心作用:**git add 选文件、git commit 存本地、git push 推远程;
**关键原则:**先本地确认(add+commit),再远程共享(push),有冲突先合并(pull)。
记住这个流程:「改代码 → add 选文件 → commit 存本地 → push 给团队」,就能搞定 90% 的日常 Git 操作。