背景与动机
Git 常用命令不要只按“背命令”来学,更应该先理解一条主线:
工作区 -> 暂存区 -> 本地仓库 -> 远程仓库日常大多数命令都围绕这四个位置流转:
- 工作区:你正在编辑的文件。
- 暂存区:准备放进下一次提交的变更。
- 本地仓库:已经提交到本机 Git 历史里的版本。
- 远程仓库:GitHub、GitLab、Gitee 等平台上的共享仓库。
理解这条链路后,很多命令就不再是零散记忆,而是“把变更从一个位置移动到另一个位置”。
核心原理拆解
1. Git 记录的是快照,不只是文件差异
Git 每次提交保存的是一组文件状态快照。多个提交通过父子关系串起来,形成项目历史。
因此一个提交通常代表一次完整的意图,例如:
- 初始化项目。
- 添加登录表单。
- 修复部署脚本。
- 移除不该提交的环境文件。
好的提交不是“今天所有改动打包”,而是“一个可理解、可回退的变更单元”。
2. 工作区、暂存区、本地仓库、远程仓库
这四个位置的职责不同:
- 工作区保存当前文件内容。
- 暂存区保存下一次提交要包含的内容。
- 本地仓库保存已经提交的历史。
- 远程仓库用于团队共享和备份。
常见命令和位置关系:
git add 工作区 -> 暂存区git commit 暂存区 -> 本地仓库git push 本地仓库 -> 远程仓库git pull 远程仓库 -> 本地仓库和工作区3. Git 配置分层
Git 配置常见有三层:
- 系统级:对当前机器所有用户生效。
- 用户级:对当前系统用户生效。
- 仓库级:只对当前仓库生效。
查看当前生效配置:
git config --list设置全局用户名和邮箱:
git config --global user.name "your-name"git config --global user.email "your-email@example.com"用户名和邮箱会写入 commit 作者信息。它们不是 Git 平台账号登录凭证,而是提交记录里展示的身份信息。
如果只想在当前仓库单独设置,去掉 --global:
git config user.name "project-name"git config user.email "project-email@example.com"4. git init:把普通目录变成 Git 仓库
git init 用来初始化仓库:
git init执行后,当前目录下会生成 .git 目录。这个目录保存 Git 的元数据,例如对象数据库、分支引用、当前 HEAD 指针、配置和操作日志。
日常使用时不需要手动修改 .git 目录。误删或误改它,可能导致仓库历史损坏。
5. git clone:复制远程仓库到本地
git clone 用来把远程仓库复制到本地:
git clone <remote-url>例如:
git clone https://github.com/user/project.git克隆完成后,Git 会默认创建一个名为 origin 的远程仓库别名。后续 pull、push 通常都会通过这个别名和远程仓库交互。
如果想指定本地目录名:
git clone https://github.com/user/project.git my-project常见陷阱
1. 把 .git 当成普通目录清理
.git 是仓库历史和配置的核心目录。删除它之后,当前目录就不再是 Git 仓库。
2. 混淆 Git 用户信息和平台账号
user.name 和 user.email 只是提交作者信息,不等于 GitHub、GitLab 的登录账号或 token。
3. 没弄清当前位置就执行命令
执行 add、commit、push、pull 前,先确认变更现在在哪一层:工作区、暂存区、本地仓库,还是远程仓库。
一句话总结
Git 的基础主线是:先判断变更在哪一层,再选择命令把它移动到目标位置。