Skip to content

Git 是干什么的? ​

导读 ​

Git 是本地的时间机器:把整个项目一次次拍成完整快照,核心动作只有提交和读档。懂了四个区域、分支、回滚和 .gitignore,AI 说「已暂存」「已推送」时你就不会一头雾水。

Git 的核心动作只有两个:提交和读档。

  • 提交:给整个项目拍一张完整快照。
  • 读档:回到任意一次提交的状态。
为什么我强烈推荐你使用 Git

耦合性,就是模块和模块之间绑得多紧。

  • 高耦合:模块缠得很紧,A 改一点点,B、C 全跟着改,牵一发动全身。难维护、容易出 bug,改一处崩一片。
  • 低耦合:模块互相独立,只通过简单接口打交道,内部细节互不关心。改 A 基本不影响 B,好测试、好维护。

打个比方:

低耦合像乐高,每块独立,随时能换一块、拼新的;

高耦合像毛线团,缠在一起,想抽一根线,整团跟着乱。

而程序员追求低耦合性,主要是为了一个额外的奖励:可拓展性——想加新功能,往“插槽”里塞一块新的就行,不用把老代码拆了重拼。

但低耦合有代价:一个程序被拆成成百上千个文件,互相用复杂逻辑连接。维护、开发和测试使得版本管理变得几乎不可能完成。

结论:Git 就是为这种复杂度而生的——它让你敢于拆分,而不必担心失控。

普通的保存,是用新版本覆盖旧版本;而 Git 的每一次「提交」,都是给整个项目拍一张完整的快照。无论项目有 10 个文件还是 10 万个文件,无论你改了 1 行还是 1000 行,Git 都会忠实地记下这一刻所有文件的完整状态。

这意味着:

  • 后悔自由:任何时候,你都可以把项目精准地「读档」回任意一次提交的状态;
  • 平行宇宙:你可以基于任何一个快照,分叉出一条新的时间线去大胆尝试;
  • 协作不冲突:每个人在自己的时间线上工作,最后再把各自的快照合并到一起。

四个区域:工作区、暂存区、本地仓库、远程仓库 ​

理解 Git 的四个区域,否则 AI 说「已暂存」「已提交」「已推送」时,就会一头雾水。

text
工作区  --git add-->  暂存区  --git commit-->  本地仓库  --git push-->  远程仓库
工作区  <--git restore--  暂存区/本地仓库  <--git pull/fetch--  远程仓库

打个比方:

  • 工作区:就是字面意思。
  • 暂存区:接受、拒绝 diff 的这个过程,就是 git add,也就是把代码放到了暂存区。
  • 本地仓库:点击「提交」以后会弹出一个 git commit message 的“对账单”,这时候需要你去写日志(记得点保存,否则不生效)。等你确认了这份对账单以后,才算是真正被拍了快照,存到了本地仓库。
  • 远程仓库:就是上传到 GitHub。

注意

  1. .git 目录就是本地仓库的核心,不要手动删改里面的内容。

  2. 不要用 OneDrive、iCloud、坚果云这类同步盘去同步,因为网盘可能在 Git 写入一半时把文件同步走,轻则分支错乱,重则仓库损坏。

  3. 你可以把一切的环节都扔给 AI,让 AI 来完成,而且也推荐这样做。它更快,效率更高,笔记也完整。

分支 ​

分支功能经常应用于测试环节。例如假设你同时有两个好点子,都想试一试,那可以从 main 分出去,在分支上大胆尝试,失败了就丢掉,成功了再合并回来。

默认主线通常叫 main。你可以这样理解:

  • main:稳定主线,最好随时能跑。
  • feat/phone-login:正在做的功能分支。
  • fix/token-expired:正在修的 bug 分支。

建议在两种情况下开:

  1. AI 要进行大改、重构、换架构;
  2. 你想尝试一个不一定成功的方案。

同样的,你可以直接让 AI 去帮你执行这部分操作:

text
请为「手机号登录」创建一个功能分支 feat/phone-login。
在这个分支上完成修改,完成后告诉我如何合并回 main。
每一步先解释,不要直接动 main。

合并时可能会遇到冲突。记得让 AI 识别一下:

text
合并时如果有冲突,请先列出冲突文件、冲突位置和两种选择的区别。
等我确认后再修改。

后悔自由:restore、revert、reset ​

Git 的核心价值之一是后悔自由。其中原理不需要理会,理解下列的提示词足够了:

一条回滚提示词:

text
我想撤销提交 <hash>,但希望保留历史。
执行前先解释会发生什么,并告诉我如何验证回滚成功。

铁律:任何回滚前,先提交当前改动或开一个备份分支。 不要让 AI 直接 reset --hard。

退回的几种情况

情况一:改错了,但还没提交。

让 AI 用 git restore <file> 丢弃工作区修改。注意,这会直接丢掉你未保存的改动。

情况二:已经提交,但还没推送。

可以用 git reset 回退。但 reset 有软硬之分,--hard 会直接丢文件。非程序员不要自己猜,让 AI 解释后再做。

情况三:已经推送到远端。

最安全的是 git revert <hash> 生成一个「反向提交」,把那次提交的效果抵消掉。

情况四:改到一半,想临时收起。

可以用 git stash。它像把桌面上的东西先扫进抽屉,等会儿再拿出来。

.gitignore:什么东西永远不该进仓库 ​

Git 会记住你提交过的一切。密码、token、私钥、真实隐私信息,一旦提交,就会留在历史里。即便把文件删掉,历史记录中仍能找得到原文。

所以,提交前必须有一道过滤网:.gitignore,被写进这个文件的文件夹或文件将不会被 Git 收录。

下面这些通常不该进仓库:

text
.env
*.key
*.pem
node_modules/
dist/
build/
.DS_Store
*.log

不要上传仓库,不要放进网盘。

如果已经提交了密钥,正确做法不是「删掉再提交一次」,而是:

  1. 立刻轮换密钥;
  2. 让 AI 检查 Git 历史;
  3. 必要时清理历史。

一条检查提示词:

text
请为这个项目生成合适的 .gitignore,并检查当前是否有敏感文件已经被 Git 追踪。
如果发现 .env、密钥、token、密码等,先停下来告诉我,不要提交。

参考资料 ​

除特别声明外,本书内容采用 CC BY-NC-SA 4.0 授权