Git 逻辑全解 + AI 实战指南

这篇博客的目标:让你真正理解 Git 在干什么,而不只是记住几个命令。理解了逻辑之后,命令只是自然语言的简写。最后一章会告诉你,有了 Claude Code 这样的 AI 工具,你甚至不需要记住命令——但理解逻辑仍然重要。


1. 一、Git 到底在解决什么问题?

你在写一份文档,改了好几版,最后文件名变成了这样:

报告_初稿.docx
报告_修改版.docx
报告_最终版.docx
报告_最终版_真的最终.docx
报告_最终版_真的最终_别再改了.docx

一个人写都这么乱,三个人一起写呢?每个人改了不同的地方,最后要合并成一份文档——怎么知道谁改了什么?改错了怎么回到昨天的版本?

Git 解决的就是这类问题。它的核心思路很直白:

记录每一次修改的完整快照,让你随时能回到任何一个历史版本。

理解 Git,只需要抓住两个东西:

快照(Snapshot) :每次提交,Git 不是记录「哪里改了」,而是给所有文件拍一张完整的「照片」存起来。这张照片就是一次 commit。

指针(Pointer) :每个 commit 都有一个唯一的哈希 ID,同时指向上一个 commit,形成一条链。而「分支」本身只是一个指向某个 commit 的指针——创建分支只是创建一个新指针,几乎不花任何时间。

main → commit C → commit B → commit A

你提交一次,main 指针向前移一步:

main → commit D → commit C → commit B → commit A

所有 Git 操作,都是围绕快照和指针展开的。

2. 二、三棵树 — Git 的工作模型

2.1 为什么需要三个区域?

很多新手的困惑是:为什么不能直接 commit,非要先 add?

Git 故意设计了三个区域,让你能精确控制哪些修改要提交、哪些先不动。

git add

git commit

git push

git pull

工作区
你正在编辑的文件

暂存区
准备提交的文件

本地仓库
已保存的版本

远端仓库
GitHub

工作区(Working Directory) :你电脑上的项目文件夹,编辑器里打开的所有文件都在这里。

暂存区(Staging Area) :一个「准备室」。把想提交的文件先放进来,确认没问题再正式提交。这样你可以选择性地提交——改了 10 个文件,但只想先提交其中 3 个。

本地仓库(Local Repository) :项目目录下的 .git 文件夹,存放所有历史记录、分支信息、标签等。

2.2 文件状态流转

一个文件在 Git 中的状态会这样变化:

git add

git commit

修改文件

git add

未跟踪
新建的文件

已暂存

已提交

已修改

未跟踪 → 已暂存 → 已提交 → 已修改 → 已暂存,形成一个循环。

  • 未跟踪:Git 知道文件存在,但没有开始追踪修改历史
  • 已修改但未暂存:改了文件,但还没告诉 Git「我要提交这个修改」
  • 已暂存:告诉 Git「这个修改准备提交了」
  • 已提交:修改永久保存到 Git 历史中

这就是为什么 Git 要分两步操作:git add​ + git commit。add 是告诉 Git「哪些修改要提交」,commit 是「正式拍照保存」。

2.3 怎么看当前状态

git status

Git 会告诉你:哪些文件被修改了、哪些在暂存区、哪些还没追踪。不需要记这个命令——跟 Claude Code 说「看看现在有哪些文件被修改了」就行。

3. 三、提交 — 给历史拍照片

3.1 提交的本质

每次 commit,Git 做了这几件事:

  1. 把暂存区的所有文件拍一个快照
  2. 给快照生成一个唯一的哈希 ID(如 a1b2c3d
  3. 记录提交者和时间
  4. 让这个 commit 指向上一个 commit
  5. 把当前分支的指针移到这个新 commit

无上一个

commit A
789ghi

commit B
def456

commit C
abc123

main

commit 是不可变的。 一旦提交,快照就永久保存在 .git 里。你不能「修改」一个 commit,只能「创建一个新的 commit 来撤销它」。

3.2 一个好的提交习惯

一个提交做一件事。 不是为了好看,是为了以后回退时能精确定位。一个 commit 里混了 10 个不相关的修改,以后想回退其中一个就很麻烦。

commit message 说清楚做了什么:

✅ feat: 添加用户登录功能
✅ fix: 修复首页加载超时
✅ refactor: 重构数据库查询逻辑

❌ 改了一些东西
❌ update
❌ 123

3.3 用 Claude Code 提交

不需要记命令,直接说:

「帮我提交当前所有修改,commit message 写成 feat: 添加用户登录功能」

Claude Code 会自动执行:

git add .
git commit -m "feat: 添加用户登录功能"

更进一步,你可以让它分析你的修改再提交:

「我刚写完了登录功能,帮我看看改了什么,然后自动生成合适的 commit message 并提交」

Claude Code 会先执行 git diff 分析改动,再根据内容生成语义化的 commit message,最后完成提交。你完全不需要知道具体命令。

4. 四、分支 — 并行世界的入口

4.1 分支的本质:一个指针

Git 最精妙的设计。分支不是文件夹的副本,只是一个指向某个 commit 的指针。

从 main 创建一个 feature-login 分支时,Git 只是创建了一个新指针,指向同一个 commit。没有复制任何文件。

无上一个

commit A

commit B

commit C

main

feature-login

然后你在 feature-login 上提交新 commit,feature-login 指针向前移动,但 main 不动:

无上一个

commit A

commit B

commit C

commit D

main

feature-login

这就是并行开发的原理——两个分支独立前进,互不影响。

4.2 分支操作的本质

操作 本质 说明
git branch xxx 创建指针 指向当前 commit,不移动任何东西
git switch xxx 移动 HEAD 把「当前所在位置」指向某个分支
git merge xxx 合并提交 把两个分支的修改合并到一起
git branch -d xxx 删除指针 只删指针,不影响 commit 历史

4.3 合并的逻辑

合并时,Git 会找到两个分支的最近公共祖先,然后把两边的修改合并:

无上一个

commit A

commit B

commit C

commit D

main

feature-login

commit E 合并提交

main

如果两个人修改了同一个文件的同一行,Git 不知道该保留哪个,就会产生合并冲突。这时需要手动选择保留哪个版本。

4.4 冲突怎么解决

冲突文件里会看到这样的标记:

<<<<<<< HEAD
这是 main 分支的版本
=======
这是 feature 分支的版本
>>>>>>> feature-login

解决步骤:打开文件,手动选择保留哪个版本(或两个都保留),删掉标记符,保存文件,然后:

git add 冲突文件名
git commit -m "merge: 合并 feature-login,解决冲突"

4.5 用 Claude Code 操作分支

「我要开发一个新功能叫支付模块,帮我创建一个分支并切换过去」

Claude Code 执行:

git checkout -b feature-payment

「支付模块写完了,帮我合并到 main 然后删除这个功能分支」

Claude Code 执行:

git checkout main
git merge feature-payment
git branch -d feature-payment

「合并的时候有冲突了,帮我看看怎么解决」

Claude Code 会读取冲突文件,告诉你每处冲突两边分别写了什么,建议怎么改,然后帮你修改文件并完成合并。

5. 五、远端仓库 — 连接云端

5.1 为什么需要远端?

本地仓库存在你自己的电脑上。电脑丢了、硬盘坏了,所有历史记录就没了。远端仓库(GitHub/GitLab)就是把本地仓库同步到云端服务器。

git push

git pull

你的电脑
本地仓库

GitHub
远端仓库

5.2 push / pull / fetch 的区别

命令 方向 本质
git push 本地 → 远端 把本地的提交上传到 GitHub
git pull 远端 → 本地 把 GitHub 的新提交下载并合并到本地
git fetch 远端 → 本地 只下载,不合并(更安全)

git pull​ = git fetch​ + git merge

建议用 git fetch​ + git merge​ 代替 git pull——先看看远端有什么变化,再决定要不要合并。

5.3 用 Claude Code 连接远端

「我在 GitHub 上创建了一个空仓库,地址是 git@github.com:myname/project.git,帮我关联上然后推送」

Claude Code 执行:

git remote add origin git@github.com:myname/project.git
git push -u origin main

「GitHub 上有新的提交了,帮我拉下来看看有什么变化」

Claude Code 会先 fetch,再告诉你远端新增了哪些提交、谁提交的、改了什么。你看完觉得没问题,再说「合并到本地」,它才执行 merge。

6. 六、回退 — Git 的时光机

6.1 理解回退的本质

回退操作最容易搞混。关键在于:你要回退的是什么?

Git 有三个地方可以「回退」,不同位置用不同命令:

位置 命令 效果
工作区(改了没 add) git restore <file> 文件恢复到上次 add/commit 的状态
暂存区(add 了没 commit) git restore --staged <file> 从暂存区退回工作区
本地仓库(commit 了) git reset 回退到之前的某个 commit
本地仓库(已 push) git revert 创建新 commit 来撤销(不改历史)

6.2 reset 的三种模式

git reset --soft HEAD~1   # 只回退仓库,暂存区和工作区都保留
git reset --mixed HEAD~1  # 回退仓库和暂存区,工作区保留(默认)
git reset --hard HEAD~1   # 全部回退,工作区的修改也丢失

记忆技巧:--soft​ 最温柔(只动一个),--hard​ 最狠(全部清空),--mixed 居中。

6.3 reset vs revert

revert

revert

main → commit C

main → commit D 撤销C

reset

HEAD~1

main → commit C

main → commit B

git reset 会修改历史——把分支指针往回移,中间的 commit「消失」了。已经 push 到远端的话,别人基于这些 commit 做的工作会出问题。

git revert 不修改历史——创建一个新的 commit,内容是「撤销某个 commit 的修改」。历史记录连续,只是多了一个反向操作。

规则:已经 push 的代码,只用 git revert

6.4 用 Claude Code 回退

「我刚提交的代码有问题,帮我回退一下,但修改内容还想保留」

Claude Code 判断应该用 --soft

git reset --soft HEAD~1

「上次的提交是错误的,我想彻底丢弃那些修改」

git reset --hard HEAD~1

「我已经推送到 GitHub 了,发现有个提交有问题,帮我安全地撤销」

git revert HEAD

你只需要描述意图,Claude Code 会根据「是否已 push」「是否要保留修改」来选择正确的命令。

7. 七、团队协作 — Fork + PR 工作流

7.1 为什么需要 PR?

团队开发中,你不能直接往 main 分支推代码——万一写了个 bug,整个项目就崩了。

Pull Request(PR)的逻辑是:你在自己的分支上开发,开发完后发起「合并请求」,其他开发者审查你的代码,审查通过后才合并到 main 分支。PR 就是一道关卡。

7.2 Fork 的逻辑

想给一个开源项目贡献代码,但没有直接写入权限,就需要 Fork:

Fork

Clone

开发

Push

Pull Request

原项目
别人的仓库

你的 GitHub 副本

你的电脑

功能分支

Fork 就是把别人的仓库复制一份到你的 GitHub 账号下。你在自己的副本上修改,改完后向原项目发起 PR。

7.3 用 Claude Code 协作

「我想给 xxx 项目贡献代码,帮我设置好 Fork 工作流」

Claude Code 执行:

git clone git@github.com:你的用户名/项目名.git
cd 项目名
git remote add upstream git@github.com:原作者/项目名.git

「我要基于上游最新代码开发一个新功能,叫 feature-xxx」

git fetch upstream
git checkout -b feature-xxx upstream/main

「开发完了,帮我推送到 GitHub 并生成 PR 描述」

Claude Code 会推送代码,分析你的所有修改,自动生成规范的 PR 描述——包含改动概述、修改文件列表、测试建议等。

8. 八、AI + Git — Claude Code 完全指南

8.1 为什么 AI 改变了 Git 的使用方式?

传统用 Git 需要你:记住大量命令和参数、看懂英文报错、根据场景判断该用哪个命令。

AI 工具让你只需要做一件事:描述你想要什么结果。

8.2 Claude Code 的三种操作模式

基础模式:你说结果,它执行命令

「帮我把所有修改提交,commit message 写成 fix: 修复登录 bug」

Claude Code 理解后执行:

git add .
git commit -m "fix: 修复登录 bug"

进阶模式:你描述意图,它拆解并执行

「我想创建一个新分支来开发用户管理功能,开发完后合并回 main,然后推送到 GitHub」

Claude Code 自动拆解成多步操作,依次执行创建分支、提交、合并、推送。

智能模式:你描述问题,它诊断并解决

「我在合并分支的时候遇到冲突了,帮我看看怎么解决」

Claude Code 会读取冲突文件,分析两边内容,给出解决方案,帮你修改文件,完成合并。

8.3 全场景 AI 操作速查

你想做什么 你可以这样说
初始化项目 「帮我在这个目录下初始化 Git 仓库」
提交代码 「帮我提交所有修改,commit message 写成 xxx」
查看状态 「看看现在有哪些文件被修改了」
查看差异 「帮我看看 index.html 改了什么」
创建分支 「创建一个叫 xxx 的分支并切换过去」
合并分支 「把 xxx 分支合并到 main」
回退代码 「上次提交有问题,帮我回退」
推送到远端 「帮我把代码推送到 GitHub」
拉取更新 「帮我拉取 GitHub 上最新的代码」
解决冲突 「合并的时候有冲突了,帮我解决」
生成 .gitignore 「帮我生成一个适用于 Python 项目的 .gitignore」
代码审查 「帮我审查一下这个 diff,有没有潜在问题」
生成 PR 「帮我分析修改内容,生成 PR 描述」
配置 CI/CD 「帮我配置 GitHub Actions,每次推送自动运行测试」
查看历史 「用简洁的方式列出最近的提交记录」
暂存修改 「我正在改代码但要紧急切分支,帮我存起来」
恢复暂存 「bug 修完了,帮我恢复之前存的修改」

8.4 完整实战流程

假设你要开发一个博客系统,从零开始的完整流程:

第一步:初始化

「帮我初始化一个 Git 仓库,创建 .gitignore(Node.js 项目),然后提交」

第二步:开发用户模块

「创建一个 feature-user 分支,我要开发用户注册和登录功能」

第三步:提交代码

「用户模块写完了,帮我提交」

第四步:开发文章模块

「切换到 main 分支,创建 feature-post 分支,我要开发文章发布功能」

第五步:合并用户模块

「用户模块已经在 feature-user 上提交了,帮我合并到 main」

第六步:合并文章模块

「文章模块也写完了,帮我合并到 main 然后推送」

第七步:发现问题回退

「文章模块有 bug,那个提交已经推送了,帮我用 revert 安全撤销」

整个过程中,你只需要描述你想做什么,Claude Code 帮你执行具体怎么做

9. 九、附录 — 概念速查

9.1 核心概念关系

git add

git commit

git push

git fetch

git merge

工作区

暂存区

本地仓库

远端仓库

远端副本

9.2 回退决策流程

想回退代码

改了但没 add?

git restore file

add 了但没 commit?

git restore --staged file

commit 了但没 push?

git reset HEAD~1

git revert HEAD

9.3 常用命令速查

操作 命令 什么时候用
初始化 git init 新项目开始用 Git
克隆 git clone <url> 把远端项目下载到本地
状态 git status 看看当前什么情况
差异 git diff 看具体改了什么
暂存 git add . 准备提交所有修改
提交 git commit -m "xxx" 保存一个版本快照
历史 git log --oneline 看之前提交了什么
分支 git branch <name> 创建新分支
切换 git switch <name> 切到另一个分支
合并 git merge <branch> 把分支合并到当前分支
推送 git push 上传到 GitHub
拉取 git pull 从 GitHub 下载并合并
获取 git fetch 只下载不合并
暂存 git stash 临时存起修改
回退 git reset --soft HEAD~1 回退但保留修改
撤销 git revert HEAD 安全撤销(不改历史)

Git 的核心逻辑就三个:快照、指针、三棵树。理解了这三个概念,所有命令都是自然语言的简写。而有了 Claude Code,你连命令都不需要记——只需要清楚地描述你想要什么结果,AI 会帮你执行。

但理解逻辑仍然重要。当 AI 执行的命令和你预期不符时,当你需要判断 AI 的方案是否正确时,当 AI 无法理解你的意图时——你需要知道 Git 在底层到底在干什么。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐