1
0

Git 学习笔记

2026-07-11
2026-07-23

Git 学习笔记

Git(Distributed Version Control System,分布式版本控制系统)本质上是一个记录项目历史状态的工具。与普通备份不同,Git 不仅保存文件,还保存文件之间的演化关系,因此能够实现版本回退、实验管理、多人协作和代码审计等功能。一个 Git 项目中最重要的是隐藏目录 .git/,它相当于整个仓库的数据库,内部保存 Commit、Branch、Tag、配置文件以及对象存储等信息。因此执行 git commit 时,并不是上传到云端,而是将当前项目状态保存到本地 .git 数据库中,即使没有网络也可以查看和回退历史版本。

Git 的工作流程可以抽象为:

Working Directory → Staging Area → Repository
      工作区            暂存区          本地仓库

工作区就是平时编辑代码的地方;执行 git add 后,修改内容会进入暂存区;执行 git commit 后,暂存区内容会形成一个新的历史版本保存到仓库中。因此最常见的开发流程实际上只有三步:

git status
git add .
git commit -m "message"

其中 git status 用于查看当前仓库状态,是日常使用频率最高的命令。Git 中常见的文件状态主要有三种:Untracked(未跟踪,Git 尚未管理)、Modified(已修改,工作区与最近一次 Commit 不一致)和 Staged(已暂存,暂存区与最近一次 Commit 不一致)。理解这三个状态后,绝大部分 Git 输出信息都能看懂。

Commit 是 Git 中最核心的概念。每一次 Commit 都对应项目在某一时刻的完整快照,并由一个唯一哈希值标识,例如:

bf1a311

多个 Commit 会形成一条历史链:

Commit A → Commit B → Commit C

Git 实际上通过 HEAD 指针表示当前所处的位置,例如 HEAD 指向 Commit C,则说明当前工作版本为 C。查看历史最常用的命令为:

git log
git log --oneline

前者显示完整信息,后者显示简洁历史。在科研项目中,Commit 信息应尽量描述“做了什么改动”,例如:

git commit -m "add entropy-aware fusion"
git commit -m "add hard_scf constraint"
git commit -m "fix reliability gate bug"

而不要写成“update”“modify”等无意义描述。

如果刚提交就发现 Commit 信息写错,或者漏提交了某些文件,可以使用:

git commit --amend

例如:

git commit --amend -m "Best MV_CLIP entropy fusion hard_scf"

其本质并不是修改旧 Commit,而是生成一个新的 Commit 来替换最近一次 Commit,因此只建议用于尚未推送的最新提交。

对于科研项目来说,Tag(标签)非常重要。Commit 是一长串哈希值,不容易记忆,而 Tag 可以给某个重要版本起一个有意义的名字。例如当模型达到历史最好结果 ACC=86.34 时,可以执行:

git tag best_mvclip

之后无论进行了多少实验,都可以通过:

git checkout best_mvclip

直接回到当时的代码状态。因此 Tag 非常适合标记最佳模型、论文投稿版本、实验里程碑等关键节点。

.gitignore 文件用于指定哪些文件不应该进入版本管理。科研项目中通常只管理代码和配置文件,而不管理训练日志、缓存文件、模型权重和 IDE 配置。例如:

.idea/
.vscode/

runs/
logs/

__pycache__/
*.pyc

*.pt
*.pth
*.ckpt

其中 .idea.vscode 属于编辑器配置,__pycache__ 属于 Python 缓存,runs/logs/ 为训练输出,*.pt*.pth 为模型权重文件。这些内容往往体积大、变化频繁或具有个人环境特征,因此通常不纳入版本控制。一个简单原则是:代码提交,配置提交;缓存不提交,日志不提交,权重不提交。

需要特别理解的是,Git 并不是每次 Commit 都复制整个项目。Git 内部采用 Blob、Tree、Commit 等对象组成对象数据库,相同内容只保存一次,因此即使项目进行数百次 Commit,仓库体积通常也远小于简单复制数百份项目。所有 Commit 实际上都保存在 .git/objects/ 中,而 HEAD、Branch、Tag 等引用信息则保存在 .git/refs/ 中。

对于目前你的科研开发场景(MMSD2.0、MV_CLIP、多轮模型实验),推荐形成如下固定工作流:

# 修改代码

git status

# 检查改动

git add .

# 暂存改动

git commit -m "add uncertainty-aware fusion"

# 达到最佳结果后

git tag best_acc8634

# 查看历史

git log --oneline

# 查看所有标签

git tag

如果未来接入 GitHub,则在此基础上增加:

git push
git pull
git fetch

即可完成远程同步。对于单人科研开发而言,真正高频使用的命令其实只有:

git status
git add
git commit
git log
git tag
git checkout