Git 核心操作
学习目标
- 熟练使用
git add、git commit、git status、git log - 学会用
git diff查看修改内容 - 会编写
.gitignore文件 - 掌握几种常用的撤销操作
准备工作
我们用一个模拟的 AI 项目来练习所有操作。先创建项目:
mkdir ai-image-classifier
cd ai-image-classifier
git init
# 创建基本的项目结构
mkdir data models src
touch src/train.py src/model.py src/utils.py
touch README.md requirements.txt
查看状态:git status
git status 是你用得最多的命令,它告诉你当前仓库的状态:哪些文件被修改了?哪些在暂存区?哪些还没被 Git 跟踪?
git status
输出:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
requirements.txt
src/
nothing added to commit but untracked files present
Untracked files(未跟踪的文件):Git 看到了这些文件,但还没有管理它们。你需要用 git add 告诉 Git "请开始跟踪这些文件"。
添加到暂存区:git add
# 添加单个文件
git add README.md
# 添加多个文件
git add src/train.py src/model.py
# 添加整个文件夹
git add src/
# 添加所有文件(最常用)
git add .
# 添加所有修改过的已跟踪文件(不包括新文件)
git add -u
实操案例
先给文件写点内容:
echo "# AI 图像分类器" > README.md
echo "torch>=2.0" > requirements.txt
cat > src/model.py << 'EOF'
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(16 * 16 * 16, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = x.view(-1, 16 * 16 * 16)
x = self.fc1(x)
return x
EOF
现在添加所有文件并查看状态:
git add .
git status
输出:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
new file: requirements.txt
new file: src/model.py
new file: src/train.py
new file: src/utils.py
文件变成了绿色的 "Changes to be committed",说明它们已经在暂存区里,准备好被提交了。
提交:git commit
git commit -m "初始化项目:添加模型定义和项目结构"
输出:
[main (root-commit) a1b2c3d] 初始化项目:添加模型定义和项目结构
5 files changed, 18 insertions(+)
create mode 100644 README.md
create mode 100644 requirements.txt
create mode 100644 src/model.py
create mode 100644 src/train.py
create mode 100644 src/utils.py
提交信息怎么写?
提交信息应该简洁、清晰,让人一看就知道这次改了什么。
好的提交信息:
git commit -m "添加 CNN 模型定义"
git commit -m "修复训练循环中学习率未更新的 bug"
git commit -m "添加数据增强:随机翻转和颜色抖动"
git commit -m "更新 README:添加安装说明"
不好的提交信息:
git commit -m "update" # 改了什么?
git commit -m "fix" # 修了什么?
git commit -m "aaa" # ???
git commit -m "改了一些东西" # 等于没说
一个实用的原则
提交信息回答这个问题:"这次提交做了什么?" 用动词开头(添加、修复、更新、删除、重构),说清楚对象。
查看修改:git diff
git diff 告诉你"上次提交之后,你改了什么"。
案例:修改模型代码
# 给 model.py 添加一个新层
cat > src/model.py << 'EOF'
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
self.conv2 = nn.Conv2d(16, 32, 3, padding=1) # 新增的卷积层
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(32 * 8 * 8, 10)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x))) # 新增
x = x.view(-1, 32 * 8 * 8)
x = self.fc1(x)
return x
EOF
现在查看变化:
git diff
输出会用红色和绿色高亮显示:
--- a/src/model.py
+++ b/src/model.py
@@ -1,4 +1,5 @@
+import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
+ self.conv2 = nn.Conv2d(16, 32, 3, padding=1) # 新增的卷积层
self.pool = nn.MaxPool2d(2, 2)
- self.fc1 = nn.Linear(16 * 16 * 16, 10)
+ self.fc1 = nn.Linear(32 * 8 * 8, 10)
- 红色(
-开头):被删除的行 - 绿色(
+开头):被新增的行
现在提交这次修改:
git add src/model.py
git commit -m "增加第二层卷积层,提升模型能力"
diff 的几种用法
git diff # 查看工作目录中未暂存的修改
git diff --staged # 查看暂存区中的修改(已 add 但未 commit)
git diff HEAD~1 # 查看最近一次提交改了什么
git diff abc1234 def5678 # 比较两次提交之间的差异
查看历史:git log
git log
输出:
commit def5678... (HEAD -> main)
Author: Zhang San <[email protected]>
Date: Mon Feb 9 10:30:00 2026
增加第二层卷积层,提升模型能力
commit a1b2c3d...
Author: Zhang San <[email protected]>
Date: Mon Feb 9 10:00:00 2026
初始化项目:添加模型定义和项目结构