切换·Esc 返回

Git 版本控制Git

Git 专区
记录每次代码改动,需要时可以查看或恢复旧版本

Git 记录项目在不同时间的代码状态。修改先留在工作区,检查并选择后可以记录为一次提交 Commit。需要协作或远端备份时,再把这些提交发送到远程仓库,这一步叫推送 Push

工作区index.html 改好了 git add 暂存区这次要记的改动 git commit 本地仓库 git push 远程仓库GitHub 有副本了
$ git add . && git commit -m "首页能跑了" && git push
代码沿这条流水线走:add 装车、commit 只在本地存档push 才上云。想把别人的更新拿回来,走反方向的 git pull。

什么时候用

  • 初始化仓库后,用 add 选择改动,再用 commit 记录版本
    init 初始化add 选择改动commit 记录版本
  • 每完成一个可以验证的小改动,就保存一次提交
    每个稳定小步都可以成为一次提交
  • 出现问题时,可以回到之前提交的稳定状态
    改动出现问题时可以回到之前的提交
  • 需要协作或远端备份时,再把提交推到 GitHub
    💻 本地仓库git push →☁️ GitHub

什么时候不用

  • 长时间不提交,出现问题后难以恢复到稳定状态
    长时间没有提交记录,难以恢复稳定版本
  • 提交说明含义不清,之后无法判断每个版本做了什么
    ● 111
    ● 改了下
    ● asdf
    说明含义不清,之后难以定位版本
  • 遇到问题就删除项目目录,连同本地历史一起丢失
    🗂my-first-page🗑 删除
    删除项目目录会同时丢失本地历史
  • 把包含真实密钥的 .env 提交进版本历史
    .envgit push →☁️
    密钥会进入远程提交历史
发展历程 · History
1991—2002
史前时代:补丁 + tar 包

Linux 内核靠邮件列表互发补丁和压缩包协作,版本管理基本靠吼。

2002
改用商业工具 BitKeeper

内核团队开始用商业分布式工具 BitKeeper 管理源码,免费但要看人脸色。

2005.04
Linus 十天写出 git

BitKeeper 收回免费授权。Linus Torvalds 一怒之下自己写,约十天出活。「git」在英式俚语里是「讨厌鬼」,他自嘲:我是个自负的混蛋,所有项目都按自己命名——先有 Linux,现在 git。

2005.06
接管 Linux 内核

git 正式成为 Linux 内核的版本管理工具,分布式(每人一份完整历史)从此成为主流。

2008
GitHub 上线

git 从单机工具变成协作网络:fork、pull request、社交化编程登场。

2018
微软 75 亿美元收购 GitHub

开源最大的家被巨头买走,社区一度恐慌,几年后证明体验只增不减。

今天
全世界的代码都活在 git 上

从 Linux 内核到你刚让 AI 生成的第一个页面,几乎每一行代码的背后都有 git。

组成结构 · Anatomy
💻 工作区你正在改的文件 git add → 📥 暂存区选好这次要记录的改动 git commit → 🗄 本地仓库存档点在这 git push → ☁️ 云端仓库GitHub
1工作区Working Dir你电脑上正在修改的文件,这些变化还没有进入版本历史
2暂存区Staginggit add 选择下一次 commit 要记录的改动,文件本身不会被搬走
3本地仓库Repositorygit commit 把暂存区内容写进本地历史,生成带编号和说明的记录
4远程仓库Remotegit push 后远程才会收到本地的新提交,可用于协作和异地副本
典型使用场景
GitHub 提交记录页
Commits · main
AI 改导航栏,页面乱了
10 分钟前
c7d8e9f
首页能跑了 ✓
2 小时前
a1b2c3d
初始化项目
3 天前
0f1e2d3
终端里 git log 翻历史
zsh — my-first-page
$ git log --oneline c7d8e9f AI 改导航栏,页面乱了 a1b2c3d 首页能跑了 ✓ 0f1e2d3 初始化项目 每行一个存档点:前面是编号,后面是说明
回滚到上一个 commit
zsh — my-first-page
$ git revert c7d8e9f [main f4e5d6c] Revert "AI 改导航栏" 新增一条反向提交,旧历史仍然保留
GitHub 仓库首页
my-first-page
📄 index.html首页能跑了 ✓2 小时前
📄 README.md初始化项目3 天前
📄 .gitignore初始化项目3 天前