什么是 git?
I’m ready to translate the article for you, but I don’t have the text of the post. Could you please paste the content you’d like translated (excluding the source line you’ve already provided)? Once I have the text, I’ll translate it into Simplified Chinese while preserving all formatting, markdown, and technical terms.
为什么你需要 Git
对于许多开发者来说,U 盘只是存放和检索旧项目或文件的地方。
但当你拥有太多文件夹、冗余文件,以及几乎满载的 U 盘时,你会开始删除最旧的文件夹,只保留项目的最近 1‑2 个版本。
随后,在添加新功能和删除旧功能后,你可能会发现缺少了一段基本功能的代码,却没有旧版本的记录。
这时,Git 就像救世主一样出现。
Git 为你提供的功能
- 每次 stage 或(稍后)push 一个已测试的更改时,Git 会在隐藏的
.git目录中保存一个快照。 - 如果出现错误,你可以 backtrack 到之前的版本,从而保持应用运行。
- Git 只 compresses 更改(增量),而不是每次都存储完整代码,因此相较于把整个文件夹拷贝到 U 盘,仓库体积更小。
- 快照以 compressed format 存储,并包含项目文件结构的完整历史。
Git 提交内部
当你提交时,Git 会在 .git/objects/ 中创建对象:
| 文件夹 | 它包含的内容 |
|---|---|
blob | 实际的文件内容(更改)。 |
tree | 该提交的目录结构。 |
commit | 元数据(作者、日期、信息)以及标识提交的 SHA‑1 哈希。 |
每个提交都有一个 唯一的 SHA‑1 哈希。
当你请求查看之前的版本时,Git:
- 查找提交对象(元数据)。
- 读取关联的 tree,以重建目录结构。
- 获取所需的 blob(文件内容)。
- 将重建的文件写入工作目录。
简单的开发者工作流
1. 初始化仓库
git init
创建 .git 文件夹并告诉 Git 开始跟踪项目。
2. 暂存文件
git add # add specific files
# or
git add .
将文件标记为准备提交。
3. 提交
git commit -m "Your commit message here"
创建带唯一哈希的快照。这对于以后检索特定功能或 bug‑fix 至关重要。
4. 推送(可选)
git push origin <branch-name>
将你的提交上传到远程仓库(例如 GitHub、GitLab),以便项目在站点外部被跟踪。
分支 – 在多条开发线路上工作
分支 简单来说就是指向一次提交的指针。
Git 会创建默认的 master(或 main)分支,但你应该为以下情况创建额外的分支:
- 功能开发 – 在不影响稳定代码的情况下开发新功能。
- 测试 – 在将更改合并到主线之前进行验证。
- 协作 – 每个开发者可以拥有自己的分支,降低冲突的可能性。
示例:
如果你和朋友正在构建一个 Todo 应用,可能会有三个分支:
dev‑alice– 你的工作dev‑bob– 朋友的工作test– 在合并到main之前进行集成测试
欲了解更多细节,请参阅官方文档。
查看历史
-
完整日志 – 显示所有元数据和哈希
git log -
单行摘要 – 仅显示短哈希和提交信息
git log --oneline
复制您想要重新查看的提交哈希(例如,01xyz2)。
检出旧版本
分离的 HEAD(临时视图)
git checkout 01xyz2
显示项目在该提交时的状态,但此时处于 分离的 HEAD 状态(不在任何分支上)。
从该提交创建新分支
git checkout -b 01xyz2
- 检出旧版本 并且 创建指向它的新分支,使你保持在一个正常的分支上,而不是分离的 HEAD。
永久回退
在检查了旧代码后,你有两种选择:
-
保持仓库原样 – 仅将旧代码用作参考。
-
将当前分支重置 到该提交(危险 – 会重写历史)。
# 将当前分支指针移动到旧的提交 git reset --hard 01xyz2仅在确定要丢弃所有更新的提交时才使用
--hard。
TL;DR
- Git 只存储更改本身,以压缩格式保存,使历史记录保持轻量。
- 每次提交都是一个由 SHA‑1 哈希标识的快照。
- 使用
git init、git add、git commit和git push开始跟踪。 - 分支让多个开发者并行工作而不会相互冲突。
git log和git checkout让你可以浏览并恢复到任意之前的版本。
编码愉快! 🚀
Git reset 选项 – 快速概览
| Command | 功能说明 | 对工作树和暂存区的影响 |
|---|---|---|
git reset --soft <commit> | 将 HEAD 移动到指定的提交,但 保留在该提交之后所做的所有更改,并保持已暂存(在 index 中)。 | 如果此时提交,新提交将包含 最新提交中的所有更改 加上你已暂存的更改。 |
git reset --mixed <commit> (或直接使用 git reset <commit>) | 将 HEAD 移动到指定的提交,并 取消暂存 在此之后已暂存的更改。 | 工作目录保持不变,但这些更改不再处于暂存状态。你可以自行编辑、重新暂存并提交。 |
git reset --hard <commit> | 将 HEAD 移动到指定的提交 并丢弃 该提交之后的所有更改(包括已暂存和未暂存的)。 | 所有 未包含在提交中的修改都会永久从工作树中移除。请谨慎使用! |
安全回退的步骤
- 确定要返回的提交(例如使用
git log或可视化工具)。 - 选择合适的 reset 模式:
- 想要保留所有已暂存内容以便重新提交,使用
--soft。 - 想要保留更改但让暂存区恢复干净,使用
--mixed。 - 只有在确定可以丢弃后续工作时才使用
--hard。
- 想要保留所有已暂存内容以便重新提交,使用
- 执行选定的命令。
协作提示
在与他人协作(例如在共享的 “Todo” 仓库)时,避免重写公共历史:
- 绝不要 对已经推送到共享分支的提交使用
git reset --hard。 - 如果需要撤销公共提交,考虑使用
git revert;它会创建一个新提交来逆转更改,而不会重写历史。
理解这三种 reset 模式后,你就能在代码的不同版本之间自如切换,同时将意外数据丢失或合并冲突的风险降到最低。