Git 学习笔记
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