什么是 git?

发布: (2026年1月20日 GMT+8 01:10)
8 min read
原文: Dev.to

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:

  1. 查找提交对象(元数据)。
  2. 读取关联的 tree,以重建目录结构。
  3. 获取所需的 blob(文件内容)。
  4. 将重建的文件写入工作目录。

简单的开发者工作流

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。

永久回退

在检查了旧代码后,你有两种选择:

  1. 保持仓库原样 – 仅将旧代码用作参考。

  2. 将当前分支重置 到该提交(危险 – 会重写历史)。

    # 将当前分支指针移动到旧的提交
    git reset --hard 01xyz2

    仅在确定要丢弃所有更新的提交时才使用 --hard

TL;DR

  • Git 只存储更改本身,以压缩格式保存,使历史记录保持轻量。
  • 每次提交都是一个由 SHA‑1 哈希标识的快照。
  • 使用 git initgit addgit commitgit push 开始跟踪。
  • 分支让多个开发者并行工作而不会相互冲突。
  • git loggit checkout 让你可以浏览并恢复到任意之前的版本。

编码愉快! 🚀

Git reset 选项 – 快速概览

Command功能说明对工作树和暂存区的影响
git reset --soft <commit>HEAD 移动到指定的提交,但 保留在该提交之后所做的所有更改,并保持已暂存(在 index 中)。如果此时提交,新提交将包含 最新提交中的所有更改 加上你已暂存的更改。
git reset --mixed <commit>
(或直接使用 git reset <commit>)
HEAD 移动到指定的提交,并 取消暂存 在此之后已暂存的更改。工作目录保持不变,但这些更改不再处于暂存状态。你可以自行编辑、重新暂存并提交。
git reset --hard <commit>HEAD 移动到指定的提交 并丢弃 该提交之后的所有更改(包括已暂存和未暂存的)。所有 未包含在提交中的修改都会永久从工作树中移除。请谨慎使用!

安全回退的步骤

  1. 确定要返回的提交(例如使用 git log 或可视化工具)。
  2. 选择合适的 reset 模式:
    • 想要保留所有已暂存内容以便重新提交,使用 --soft
    • 想要保留更改但让暂存区恢复干净,使用 --mixed
    • 只有在确定可以丢弃后续工作时才使用 --hard
  3. 执行选定的命令。

协作提示

在与他人协作(例如在共享的 “Todo” 仓库)时,避免重写公共历史:

  • 绝不要 对已经推送到共享分支的提交使用 git reset --hard
  • 如果需要撤销公共提交,考虑使用 git revert;它会创建一个新提交来逆转更改,而不会重写历史。

理解这三种 reset 模式后,你就能在代码的不同版本之间自如切换,同时将意外数据丢失或合并冲突的风险降到最低。

Back to Blog

相关文章

阅读更多 »

理解 Git

《Understanding Gi》的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.a...

Git 入门

markdown 介绍 如果你正在学习编程或处理代码,你会到处听到 Git 这个词。Git 起初可能让人感到困惑,但一旦你…