1. 前言:Git 是 AI 编程时代的安全网

以前我对 Git 的理解比较简单,觉得它主要就是用来上传代码、下载代码,或者和 GitHub 配合使用。但在使用 Codex、Claude Code 等 AI 编程工具之后,我逐渐意识到,Git 不只是一个“代码上传工具”,而是 AI 编程时代非常重要的安全网。

Git 本质上是一个版本控制工具。简单来说,它可以帮助我们记录代码在不同时间点的状态。每完成一部分修改,就可以通过 Git 保存一次版本。以后如果代码改坏了,或者想查看之前的实现方式,就可以回到过去的某个版本。

在没有 Git 的时候,很多人可能会用复制文件夹的方式备份代码,比如:

project_v1
project_v2
project_final
project_final_final
project_final_really_final

这种方式虽然直观,但时间久了很容易混乱。我们很难知道每个版本之间具体改了什么,也很难判断哪个版本是稳定的。

对于 AI 编程来说,Git 的作用更加明显。因为 Codex、Claude Code 这类工具改代码的速度很快,一次可能会修改多个文件,甚至会重构原来的逻辑。如果没有 Git,我们就很难判断 AI 到底改了哪些内容,也很难在代码出问题后快速恢复到修改前的状态。
所以,这篇教程不是一篇完整的 Git 官方手册,而是我根据自己使用 AI 编程工具和服务器实验代码的过程整理出来的 Git 学习笔记。

重点不是把 Git 的所有功能都学完,而是先掌握最常用、最保命的操作:

  • 如何查看修改
  • 如何保存版本
  • 如何建立实验分支
  • 如何回退错误代码
  • 如何把本地代码同步到 GitHub

可以把 Git 理解成代码的“时间机器”:

  • commit:保存一次代码快照
  • branch:创建一条新的实验路线
  • diff:查看这次到底改了什么
  • restore:撤销错误修改
  • log:查看过去的版本记录

2. 创建版本库:让 Git 开始管理项目

在使用 Git 管理代码之前,需要先理解一个概念:版本库。

版本库,也叫仓库,英文是 Repository。它可以简单理解为一个被 Git 接管的项目文件夹。这个文件夹里的文件新增、修改、删除,Git 都可以追踪和记录。

Git 并不会自动管理电脑里的所有文件。只有当我们在某个项目目录中执行 git init 之后,这个目录才会变成一个 Git 版本库。

例如,我们先创建一个项目目录,然后输入git init指令,git就会在当前目录下生一个隐藏文件.git,它里面记录了提交历史、分支信息、版本变化等内容。一般情况下,我们不需要手动修改 .git 目录里的文件。如果不小心删除了 .git 目录,这个项目就会失去 Git 的版本记录,变回一个普通文件夹。

mkdir my_project
cd my_project
git init

3. Git 的基本流程:工作区、暂存区、本地仓库

在使用 Git 保存代码之前,需要先理解 Git 的三个区域:

  • 工作区:正在修改的项目文件夹
  • 暂存区:准备提交的修改
  • 本地仓库:已经保存下来的版本记录

它们之间的关系可以简单理解为:

工作区  →  暂存区  →  本地仓库
修改文件    git add    git commit

也就是说,我们先在工作区修改文件,然后用 git add 把修改加入暂存区,最后用 git commit 把暂存区里的内容提交到本地仓库。


3.1 工作区:正在修改的文件

工作区就是我们正在编辑的项目文件夹。

比如在 VS Code 里修改了 README.md、main.py 或其他代码文件,这些修改最开始都发生在工作区。

可以使用下面的命令查看当前工作区的状态:

git status

这个命令可以告诉我们:

  • 哪些文件被修改了
  • 哪些文件还没有被 Git 跟踪
  • 哪些文件已经加入暂存区
  • 当前是否有内容可以提交

3.2 暂存区:准备提交的修改

暂存区可以理解为“准备提交的修改”。

为什么需要暂存区呢?因为我们有时候并不想把所有修改一次性提交。暂存区就像提交前的购物车,你可以先把想提交的内容放进去,确认没问题后再统一提交;不想提交的内容,就先留在工作区。

如果只想暂存某一个文件,可以写文件名:

git add README.md

如果想把当前目录下所有修改都加入暂存区,可以使用:

git add .

这里的 . 表示当前目录,所以 git add . 的意思就是:把当前目录下的所有修改都加入暂存区。

需要注意的是,加入暂存区并不等于已经保存成版本。它只是表示这些修改已经准备提交。

在 AI 编程场景下,建议不要每次都无脑 git add .,最好先用 git status 或 git diff 看清楚 AI 到底改了哪些文件,再决定是否全部加入暂存区。


3.3 本地仓库:真正保存版本的地方

本地仓库是真正保存 Git 版本记录的地方。

把修改加入暂存区后,就可以使用 git commit 保存版本:

git commit -m "更新 README 文档"

其中,-m 后面的内容是本次提交说明,用来描述这次修改做了什么。

例如:

git commit -m "添加 Git 基本流程说明"

提交完成后,这次修改就会被保存到本地仓库,成为 Git 历史记录中的一个版本。

以后如果代码改坏了,就可以根据这些提交记录查看历史、对比差异,甚至回退到之前的版本。


3.4 一个完整示例

假设我们修改了 README.md 文件,可以按照下面的流程提交:

# 1. 查看当前状态
git status

# 2. 把 README.md 加入暂存区
git add README.md

# 3. 提交到本地仓库
git commit -m "更新 README 文档"

如果想提交当前目录下所有修改,也可以这样写:

git status
git add .
git commit -m "保存当前代码版本"

3.5 提交说明怎么写

git commit -m 后面的提交说明不要太随便。

不推荐一直写:

git commit -m "update"

因为时间久了之后,很难看出这次提交到底改了什么。

更推荐写得具体一点,例如:

git commit -m "修复登录接口报错问题"
git commit -m "添加 Git 暂存区说明"
git commit -m "调整实验参数配置"

好的提交说明可以帮助我们以后快速理解每一次代码修改的目的。


3.6 小结

这一章只需要记住下面这条流程:

修改文件 → git add → git commit

对应关系是:

工作区 → 暂存区 → 本地仓库

常用命令是:

git status
git add .
git commit -m "提交说明"

在 AI 编程时,推荐养成下面这个习惯:

git status
git diff
git add .
git commit -m "提交说明"

也就是先看清楚 AI 改了什么,确认没问题后,再保存成一个新的版本。

4. 查看修改:搞清楚 AI 到底改了什么

在 AI 编程场景下,查看修改非常重要。

因为 Codex、Claude Code 这类工具一次可能会修改多个文件,有时候不仅会改我们要求的地方,还可能顺手调整其他代码。如果不先检查修改内容,直接提交或者运行,就很容易把错误代码保存下来。

所以,让 AI 改完代码之后,建议先做三件事:

看状态 → 看具体修改 → 再决定是否提交

4.1 查看当前状态:git status

git status 可以查看当前项目里哪些文件发生了变化。

git status

它可以告诉我们:

  • 哪些文件被修改了
  • 哪些文件是新创建的
  • 哪些文件已经加入暂存区
  • 当前有没有内容可以提交

比如,当 AI 修改了一些文件后,我们可以先运行:

git status

这样就能大概知道 AI 动了哪些文件。


4.2 查看具体改了什么:git diff

如果想看文件里面具体改了哪些代码,可以使用:

git diff

git diff 会显示工作区中还没有加入暂存区的修改。

简单来说,它可以帮助我们回答一个问题:

AI 这次到底改了哪些代码?

在 AI 编程时,git diff 非常有用。每次 AI 修改完代码后,都建议先看一眼:

git diff

确认修改内容没有问题之后,再执行 git add 和 git commit。


4.3 查看暂存区里的修改:git diff --staged

如果已经执行过 git add,修改就进入了暂存区。

这时候再执行:

git diff

可能看不到刚才加入暂存区的内容。

如果想查看暂存区里准备提交的修改,需要使用:

git diff --staged

这个命令可以帮助我们确认:

这次即将提交的内容到底是什么?

4.4 一个推荐流程

在让 AI 修改代码后,可以按照下面的流程检查:

# 1. 查看哪些文件被修改了
git status

# 2. 查看具体代码变化
git diff

# 3. 确认没问题后加入暂存区
git add .

# 4. 再检查即将提交的内容
git diff --staged

# 5. 提交到本地仓库
git commit -m "说明本次修改内容"

如果发现 AI 改了不该改的文件,就不要急着提交,可以先检查或者撤销这些修改。


4.5 小结

这一章主要记住三个命令:

git status        # 查看哪些文件发生了变化
git diff          # 查看工作区具体改了什么
git diff --staged # 查看暂存区准备提交什么

在 AI 编程时,推荐养成一个习惯:

不要让 AI 改完就直接提交,先用 git status 和 git diff 看清楚它到底改了什么。

5. 版本回退与撤销:代码改坏了怎么办

使用 Git 最大的好处之一,就是代码改坏之后可以恢复。

这一章主要介绍几种常见情况:

  • 撤销工作区的修改
  • 取消已经暂存的文件
  • 查看历史提交记录
  • 回退到之前的版本

5.1 撤销工作区的修改

如果某个文件被改坏了,而且还没有执行 git add,可以使用 git restore 撤销它。

例如,撤销 README.md 的修改:

git restore README.md

如果想撤销当前目录下所有未暂存的修改,可以使用:

git restore .

需要注意的是,这个操作会直接丢弃工作区里的修改,所以执行前最好先用下面的命令看清楚改了什么:

git status
git diff

5.2 取消暂存区里的文件

如果已经执行了 git add,文件进入了暂存区,但后来发现暂时不想提交它,可以取消暂存:

git restore --staged README.md

如果想取消暂存区里的所有文件,可以使用:

git restore --staged .

这个命令只是把文件从暂存区移回工作区,不会删除你的代码修改。

可以简单理解为:

git restore --staged:取消准备提交
git restore:撤销实际修改

5.3 查看历史提交记录

如果想查看之前保存过哪些版本,可以使用:

git log

它会显示详细的提交记录,包括提交 ID、作者、时间和提交说明。

如果想看更简洁的版本,可以使用:

git log --oneline

输出可能类似这样:

a1b2c3d 添加 Git 基本流程说明
e4f5g6h 更新 README 文档
i7j8k9l 初始化项目

前面的 a1b2c3d 就是提交 ID。后面如果要回退版本,就会用到它。


5.4 回退到之前的版本

如果代码已经提交过,但后来发现当前版本有问题,可以回退到之前的提交。

例如:

git reset --hard a1b2c3d

这条命令的意思是:把当前项目回退到提交 ID 为 a1b2c3d 的那个版本。

需要特别注意:

git reset --hard 会丢弃当前版本之后的修改

所以在使用之前,一定要确认自己真的想回退。建议先执行:

git log --oneline
git status

看清楚当前状态和目标版本之后,再执行回退操作。


5.5 AI 改坏代码时的推荐处理方式

如果 AI 改完代码后发现不对,不要急着继续让 AI 乱改。可以先按照下面的流程处理:

# 1. 查看 AI 修改了哪些文件
git status

# 2. 查看具体改动
git diff

# 3. 如果确认这些修改都不要了,撤销所有未暂存修改
git restore .

如果 AI 的修改已经加入暂存区,可以先取消暂存,再撤销:

git restore --staged .
git restore .

如果已经提交了错误版本,可以查看历史记录,然后回退:

git log --oneline
git reset --hard 提交ID

5.6 小结

这一章主要记住下面几个命令:

git restore 文件名          # 撤销某个文件的工作区修改
git restore .              # 撤销所有未暂存修改

git restore --staged 文件名 # 取消某个文件的暂存
git restore --staged .     # 取消所有暂存

git log --oneline          # 查看简洁提交历史
git reset --hard 提交ID     # 回退到指定版本

6. 分支管理:给实验代码开一条新路线

分支是 Git 里非常重要的功能。

可以把分支理解成一条新的代码路线。主分支保存相对稳定的代码,实验分支用来尝试新功能、改参数、跑实验或者让 AI 修改代码。

这样做的好处是:即使实验分支上的代码改坏了,也不会影响主分支上的稳定版本。


6.1 为什么需要分支

在写代码或者做实验时,我们经常会遇到这种情况:

  • 想尝试一个新功能
  • 想修改一组实验参数
  • 想让 AI 重构一部分代码
  • 想测试某个不确定的想法

如果直接在主分支上修改,一旦代码改坏了,就会比较麻烦。

更推荐的做法是:先创建一个新的分支,在新分支上随便尝试。确认没问题后,再把这个分支合并回主分支。

可以简单理解为:

main 分支:稳定版本
实验分支:用来尝试新想法

6.2 查看当前分支

可以使用下面的命令查看当前有哪些分支:

git branch

输出可能类似这样:

* main

其中 * 表示当前所在的分支。


6.3 创建并切换到新分支

如果想创建一个实验分支,可以使用:

git switch -c exp1

这条命令的意思是:创建一个名为 exp1 的新分支,并切换到这个分支。

执行后,可以再查看一下当前分支:

git branch

可能会看到:

  main
* exp1

这说明当前已经在 exp1 分支上了。


6.4 在实验分支上修改代码

切换到实验分支后,就可以正常修改代码、运行实验、让 AI 改代码。

修改完成后,依然按照之前的流程提交:

git status
git add .
git commit -m "在 exp1 分支上修改实验代码"

这样,这次修改就只保存在 exp1 分支上,不会影响 main 分支。


6.5 切换回主分支

如果想回到主分支,可以使用:

git switch main

切换之后,你会发现代码状态回到了主分支对应的版本。

这也是分支的意义:不同分支可以保存不同的代码状态。


6.6 合并分支

如果实验分支上的修改确认没有问题,就可以把它合并回主分支。

先切换到主分支:

git switch main

然后执行合并:

git merge exp1

这条命令的意思是:把 exp1 分支上的修改合并到当前的 main 分支。


6.7 删除已经不用的分支

如果实验分支已经合并完成,不再需要,可以删除:

git branch -d exp1

如果这个分支还没有合并,Git 可能会阻止删除,避免误删代码。

如果你非常确定这个分支不要了,可以强制删除:

git branch -D exp1

不过新手不建议随便使用 -D,因为它会强制删除未合并的分支。


6.8 AI 编程中的分支使用建议

在 AI 编程场景下,分支非常有用。

推荐每次让 AI 做比较大的修改前,先创建一个新分支:

git switch -c ai-test

然后再让 AI 修改代码。

AI 修改完成后,先检查:

git status
git diff

如果确认没问题,再提交:

git add .
git commit -m "AI 辅助修改某个功能"

如果 AI 改得不好,可以直接切回主分支,或者删除这个实验分支,不影响原来的稳定代码。


6.9 小结

这一章主要记住下面几个命令:

git branch              # 查看分支
git switch -c exp1      # 创建并切换到 exp1 分支
git switch main         # 切换回 main 分支
git merge exp1          # 把 exp1 合并到当前分支
git branch -d exp1      # 删除已经合并的分支

在 AI 编程和实验代码管理中,可以简单记住一句话:

不确定的修改,先开分支;确认没问题,再合并回主分支。

7. 远程仓库:把代码同步到 GitHub

前面几章讲的内容,主要都是在本地电脑或服务器上使用 Git。

但是在实际开发中,我们通常还会把代码同步到 GitHub。这样做有几个好处:

  • 可以把代码备份到云端
  • 可以在不同电脑或服务器之间同步代码
  • 可以和别人协作开发
  • 可以保存实验代码的历史版本

GitHub 上的仓库就叫远程仓库。本地电脑上的仓库叫本地仓库。

可以简单理解为:

本地仓库:保存在自己电脑或服务器上的代码仓库
远程仓库:保存在 GitHub 上的代码仓库

7.1 查看当前远程仓库

如果想查看当前项目有没有关联远程仓库,可以使用:

git remote -v

如果已经关联了 GitHub 仓库,可能会看到类似输出:

origin  git@github.com:username/project.git (fetch)
origin  git@github.com:username/project.git (push)

其中,origin 是远程仓库的默认名字。


7.2 添加远程仓库

如果本地项目还没有关联 GitHub 仓库,可以先在 GitHub 上新建一个仓库,然后把它添加到本地项目中。

使用命令:

git remote add origin 仓库地址

例如:

git remote add origin git@github.com:username/project.git

或者使用 HTTPS 地址:

git remote add origin https://github.com/username/project.git

添加完成后,可以用下面的命令确认:

git remote -v

7.3 推送代码到 GitHub

本地代码提交之后,并不会自动上传到 GitHub。

git commit 只是把代码保存到本地仓库。如果想同步到 GitHub,还需要执行:

git push

第一次推送时,通常需要指定远程仓库和分支:

git push -u origin main

这条命令的意思是:

把本地 main 分支推送到 origin 远程仓库

其中:

  • origin:远程仓库的名字
  • main:要推送的分支名
  • -u:建立本地分支和远程分支的关联

以后再次推送时,就可以直接使用:

git push

7.4 从 GitHub 拉取代码

如果 GitHub 上的代码发生了变化,比如你在另一台电脑上提交了新代码,或者别人更新了仓库,就需要把远程代码拉取到本地。

使用命令:

git pull

它的作用是:

把 GitHub 上的最新代码同步到当前本地分支

在服务器和本地电脑之间同步代码时,git pull 很常用。


7.5 克隆已有仓库

如果 GitHub 上已经有一个项目,想把它下载到本地或服务器,可以使用:

git clone 仓库地址

例如:

git clone git@github.com:username/project.git

或者:

git clone https://github.com/username/project.git

执行后,Git 会自动下载整个项目,并创建一个已经关联远程仓库的本地版本库。


7.6 本地仓库和远程仓库的关系

可以简单理解为:

git commit:保存到本地仓库
git push:上传到 GitHub
git pull:从 GitHub 拉取最新代码
git clone:从 GitHub 下载整个项目

也就是说:

本地修改 → git add → git commit → git push → GitHub

需要注意的是,git commit 之后代码只是保存在本地,并没有上传到 GitHub。

如果想让 GitHub 上也有这次修改,还需要执行:

git push

7.7 一个完整示例

假设我们本地已经有一个 Git 项目,并且想把它上传到 GitHub,可以按照下面的流程:

# 1. 查看当前状态
git status

# 2. 把修改加入暂存区
git add .

# 3. 提交到本地仓库
git commit -m "更新项目代码"

# 4. 添加远程仓库
git remote add origin git@github.com:username/project.git

# 5. 推送到 GitHub
git push -u origin main

如果远程仓库已经添加过,那么以后只需要:

git status
git add .
git commit -m "更新项目代码"
git push

7.8 小结

这一章主要记住下面几个命令:

git remote -v                 # 查看远程仓库
git remote add origin 仓库地址 # 添加远程仓库
git push -u origin main       # 第一次推送到 GitHub
git push                      # 推送本地提交
git pull                      # 拉取远程更新
git clone 仓库地址             # 克隆远程仓库

在日常使用中,可以简单记住:

commit 是保存到本地,push 才是上传到 GitHub。

8. AI 编程中的推荐 Git 流程

在 AI 编程场景下,推荐不要直接在原项目上乱改,而是先把项目复制到自己的 GitHub 私有仓库中,再基于自己的仓库进行修改、实验和备份。

这一章以一个常见场景为例:

看到一个 GitHub 项目 → 下载到本地/服务器 → 上传到自己的 GitHub 私有仓库 → 开分支让 AI 修改

8.1 场景说明

假设现在 GitHub 上有一个开源项目:

https://github.com/original-author/example-project.git

我们想做的事情是:

  1. 把这个项目下载到本地或服务器;
  2. 在自己的 GitHub 上创建一个私有仓库;
  3. 把代码上传到自己的私有仓库;
  4. 后续在自己的仓库中开分支,让 AI 工具辅助修改代码。

这样做的好处是:

  • 不会影响原作者的项目;
  • 自己的修改可以完整保存;
  • 代码可以同步到 GitHub;
  • AI 改坏代码后也方便回退;
  • 可以用分支管理不同实验版本。

8.2 第一步:下载原项目

先进入你想存放代码的目录,例如:

cd ~/projects

然后使用 git clone 下载原项目:

git clone https://github.com/original-author/example-project.git

进入项目目录:

cd example-project

这时候,这个项目已经是一个 Git 仓库了。

可以查看当前远程仓库:

git remote -v

你可能会看到类似输出:

origin  https://github.com/original-author/example-project.git (fetch)
origin  https://github.com/original-author/example-project.git (push)

这说明当前项目还关联着原作者的 GitHub 仓库。


8.3 第二步:在自己的 GitHub 上创建私有仓库

接下来,登录自己的 GitHub,创建一个新的仓库。

比如仓库名叫:

my-example-project

注意:

  • 仓库可以设置为 Private
  • 不要勾选初始化 README
  • 不要添加 .gitignore
  • 不要添加 License

因为本地已经有完整项目代码了,远程仓库保持空仓库即可。

创建完成后,GitHub 会给你一个仓库地址,例如:

git@github.com:your-username/my-example-project.git

或者 HTTPS 地址:

https://github.com/your-username/my-example-project.git

8.4 第三步:修改远程仓库地址

因为这个项目是从原作者仓库 clone 下来的,所以默认远程地址还是原作者的仓库。

我们需要把远程地址改成自己的 GitHub 私有仓库。

可以先删除原来的远程地址:

git remote remove origin

然后添加自己的远程仓库地址:

git remote add origin git@github.com:your-username/my-example-project.git

如果你使用 HTTPS 地址,也可以写成:

git remote add origin https://github.com/your-username/my-example-project.git

添加完成后,再查看一次:

git remote -v

如果看到的是自己的仓库地址,就说明远程仓库已经切换成功。


8.5 第四步:推送代码到自己的私有仓库

确认远程仓库地址没有问题后,就可以把代码推送到自己的 GitHub 仓库。

一般主分支叫 main,可以执行:

git push -u origin main

如果项目的主分支叫 master,则执行:

git push -u origin master

如果不确定当前分支叫什么,可以先查看:

git branch

带 * 的就是当前所在分支,例如:

* main

推送完成后,刷新自己的 GitHub 私有仓库页面,就可以看到代码已经上传成功。


8.6 第五步:创建实验分支,让 AI 修改代码

代码上传到自己的私有仓库后,不建议直接在 main 分支上让 AI 大改代码。

更推荐先创建一个实验分支:

git switch -c ai-test

然后再使用 Codex、Claude Code 等 AI 工具修改代码。

AI 修改完成后,先查看改了哪些文件:

git status

再查看具体改了什么:

git diff

确认没有问题后,再提交:

git add .
git commit -m "AI 辅助修改项目代码"

然后推送实验分支到自己的 GitHub:

git push -u origin ai-test

这样,GitHub 上就会出现一个新的 ai-test 分支。


8.7 如果 AI 改坏了怎么办

如果 AI 修改后发现代码有问题,而且还没有提交,可以直接撤销工作区修改:

git restore .

如果已经加入暂存区,可以先取消暂存,再撤销:

git restore --staged .
git restore .

如果已经提交了错误版本,可以先查看历史记录:

git log --oneline

然后回退到之前的版本:

git reset --hard 提交ID

如果只是实验分支彻底不要了,也可以切回主分支后删除实验分支:

git switch main
git branch -D ai-test

8.8 一个完整流程示例

下面是完整命令流程:

# 1. 下载原 GitHub 项目
cd ~/projects
git clone https://github.com/original-author/example-project.git
cd example-project

# 2. 查看当前远程仓库
git remote -v

# 3. 删除原作者仓库地址
git remote remove origin

# 4. 添加自己的 GitHub 私有仓库地址
git remote add origin git@github.com:your-username/my-example-project.git

# 5. 确认远程仓库地址
git remote -v

# 6. 查看当前分支
git branch

# 7. 推送到自己的 GitHub 私有仓库
git push -u origin main

# 8. 创建 AI 实验分支
git switch -c ai-test

# 9. 让 AI 修改代码后,查看修改
git status
git diff

# 10. 确认没问题后提交
git add .
git commit -m "AI 辅助修改项目代码"

# 11. 推送实验分支
git push -u origin ai-test

如果当前项目主分支不是 main,而是 master,需要把上面的:

git push -u origin main
git switch main

改成:

git push -u origin master
git switch master

8.9 小结

这一章可以记住这个流程:

clone 原项目 → 创建自己的私有仓库 → 修改远程地址 → push 到自己的 GitHub → 开实验分支 → 让 AI 修改

核心命令是:

git clone 原项目地址
git remote remove origin
git remote add origin 自己的仓库地址
git push -u origin main
git switch -c ai-test
git status
git diff
git add .
git commit -m "提交说明"
git push -u origin ai-test

在 AI 编程中,推荐始终遵守一个原则:

稳定代码放 main,不确定修改开分支。