在现代软件开发中,Git 已成为开发者必备的基础设施。无论是个人项目还是大型团队协作,Git 都能帮你高效管理代码历史、追踪变更、协同开发。本文将基于你提供的笔记,系统讲解 如何正确初始化 Git 仓库(创仓) ,并掌握 git status、add、commit、diff、版本回退等核心操作,助你迈出版本控制的第一步。
一、为什么一个项目只能有一个 Git 仓库?
✅ 同一个项目目录下,不应存在多个
.git仓库。
Git 通过在项目根目录创建一个隐藏文件夹 .git 来管理整个项目的版本历史。如果你在一个已有 Git 仓库的目录下再次运行 git init,会覆盖或嵌套仓库,导致状态混乱、提交记录错乱。
正确做法:
- 每个项目独立一个目录;
- 在项目根目录执行一次
git init; - 所有源代码、文档都放在该目录下统一管理。
🌰 例如:你的项目结构应为
my-project/
├── .git/ ← 仓库元数据(自动生成)
├── src/ ← 源代码
├── README.md ← 文档
└── package.json ← 配置文件
二、初始化仓库:git init
当你开始一个新项目时,第一步是将其纳入 Git 管理:
# 进入项目目录
cd my-project
# 初始化 Git 仓库
git init
执行后:
- Git 会在当前目录创建
.git隐藏文件夹; - 自动创建默认分支(旧版为
master,新版多为main); - 此时仓库是“空”的——没有任何文件被跟踪。
💡 提示:
.git目录包含所有提交历史、分支信息、配置等,切勿手动修改。
三、理解 Git 的三大区域
Git 的工作流程围绕三个核心区域展开:
| 区域 | 说明 |
|---|---|
| 工作区(Working Directory) | 你正在编辑的文件(如 VS Code 中打开的代码) |
| 暂存区(Staging Area) | 用 git add 挑选要提交的变更 |
| 仓库(Repository) | 用 git commit 将暂存区内容永久保存为版本 |
🔄 流程:
工作区 → git add → 暂存区 → git commit → 仓库
四、查看状态:git status —— 你的导航仪
在任何操作前,务必先运行 git status:
git status
它会清晰告诉你:
- 哪些文件是 未跟踪的(Untracked) ;
- 哪些文件已修改但 未暂存(Changes not staged) ;
- 哪些文件已 加入暂存区(Changes to be committed) 。
✅ 示例输出:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present
这表示 README.md 是新文件,尚未被 Git 跟踪。
五、添加与提交:git add + git commit
1. 将文件加入暂存区
git add README.md # 或添加所有文件
git add .
此时 git status 会显示:
Changes to be committed:
new file: README.md
2. 提交到仓库
git commit -m "Add project README"
📝 提交信息规范:
- 用动词开头(Add / Fix / Update / Remove);
- 简洁描述变更内容;
- 避免模糊词汇如 “update”、“fix bug”。
3. 提交的本质
- Git 并不存储“完整文件”,而是存储文件的差异(delta) ;
- 每次提交生成一个 唯一 SHA-1 哈希 ID(如
6eb466a),而非自增数字; - 为什么用哈希?
→ 支持分布式协作(无中心服务器也能保证唯一性)
→ 防篡改(任何修改都会改变哈希值)
六、查看差异:git diff —— 提交前的质量检查
在 git add 前,用 git diff 查看工作区与仓库的差异:
git diff
输出类似:
diff --git a/README.md
b/README.md
index e69de29..d00491f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# My First Project
✅ 好习惯:重大提交前先
git diff,确认只包含预期变更。
若已 add 到暂存区,想看暂存区 vs 仓库的差异:
git diff --cached
七、撤销与回退:安全网机制
场景 1:撤销工作区的修改
# 丢弃 readme.txt 的所有本地修改
git checkout HEAD -- readme.txt
⚠️ 此操作不可逆!确保你不需要这些更改。
场景 2:取消暂存(从暂存区移回工作区)
此时文件仍在工作区,可重新编辑或选择性添加。
# 将 readme.txt 从暂存区撤回
git reset HEAD readme.txt
场景 3:版本回退(慎用!)
# 回退到上一个版本
git reset --hard HEAD^
# 回退到指定版本(替换为实际 commit ID)
git reset --hard 6eb466a
🔒 注意:
--hard会永久删除后续提交和修改,仅用于本地未推送的提交。
八、理解 HEAD 与提交历史
HEAD是一个指针,始终指向当前分支的最新提交;- 每次
commit,HEAD 会向前移动; - 你可以通过
git log查看历史:
git log --oneline
# 输出:
# 6eb466a (HEAD -> master) add distribute
# a1b2c3d first commit
通过移动 HEAD(如 reset、checkout),你可以“穿越”到任意历史版本。
九、最佳实践总结
| 操作 | 命令 | 建议 |
|---|---|---|
| 初始化 | git init | 项目根目录执行一次 |
| 查看状态 | git status | 每次操作前必做 |
| 添加文件 | git add file | 按功能分批添加 |
| 提交变更 | git commit -m "msg" | 信息清晰、原子化 |
| 检查差异 | git diff | 提交前质量保证 |
| 撤销修改 | git checkout HEAD -- file | 仅限未暂存文件 |
| 取消暂存 | git reset HEAD file | 安全退回暂存区 |
| 版本回退 | git reset --hard | 仅限本地未推送提交 |
十、结语:Git 是你的代码时光机
掌握 git init 到 commit 的完整流程,是你迈向专业开发的第一步。Git 不仅是一个工具,更是一种工程思维——它教会你:
- 如何结构化地管理变更;
- 如何为代码编写清晰的历史注释;
- 如何在出错时安全回滚。
记住:频繁提交、小步快跑、信息明确,是使用 Git 的黄金法则。
现在,打开你的终端,创建第一个仓库吧!