Git工具
Note
“代码没存,电脑崩了”、“这个版本改坏了,想回退到昨天”、“我的代码被舍友改乱了”…… 如果你遇到过这些问题,那么 Git 将是你的救星。
3.0 安装 Git¶
在 Linux 上,Git 通常已经预装了。如果没有,可以使用包管理器安装:
# Ubuntu/Debian
sudo apt update
sudo apt install git
# Fedora
sudo dnf install git
# Arch
sudo pacman -S git
在 Windows 上,推荐使用 Git for Windows.
安装完成后,你可以在命令行输入 git --version 来验证安装是否成功。
3.1 核心概念:Git 的“三层空间”¶
理解 Git 的关键在于明白代码在提交过程中经过的三个地方。我们可以用 “打包发货” 来比喻:
- 工作区 (Working Directory):你正在改代码的地方。—— 你的办公桌,随你怎么涂改。
- 暂存区 (Staging Area / Index):准备提交的“缓存区”。—— 准备寄出的快递盒,你把要发货的东西放进去,但还没封口。
- 版本库 (Repository):存储所有历史快照的地方。—— 快递公司的仓库。一旦封口发出(Commit),这个版本就永久记录在案了。
3.2 基础命令流¶
3.2.1 第一步:我是谁?(配置)¶
在使用 Git 之前,你必须告诉它你的身份,否则它会拒绝你的提交。
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
一般来说,Git 会将这些信息保存,只用一次配置就行了。你可以通过 git config --list 来查看当前的配置信息。
3.2.2 第二步:日常开发¶
| 命令 | 对应动作 | 详解 |
|---|---|---|
git init |
创始 | 在当前文件夹创建一个隐藏的 .git 目录,开启监控。 |
git status |
观察 | 最常用的命令! 它会告诉你哪些文件改了没加,哪些加了没存。 |
git add <file> |
打包 | 把文件从“办公桌”放进“快递盒”(暂存区)。常用 git add . 添加全部。 |
git commit -m "msg" |
封箱 | 真正生成一个版本。msg 必须清晰,如 "Fix: 修复了 Makefile 报错"。 |
git log |
翻看历史 | 查看过去所有的提交记录。按 q 退出。 |
养成好习惯:
每次写完一个独立的小功能(比如写完一个函数并通过了编译),就进行一次 add 和 commit。不要等写了 500 行代码后再提交,那样“回滚”的代价太大了。
在项目开发中,如果提交信息(Commit Message)随心所欲,过了一周连你自己都不知道当时改了什么。约定式提交是工业界通用的规范,其基本格式为:
<type>: <description>
| 类型 (Type) | 含义 | 示例 |
|---|---|---|
| feat | 新功能 (Feature) | feat: 增加 Makefile 自动运行功能 |
| fix | 修复 Bug | fix: 解决 tool.c 中的段错误 |
| docs | 仅文档改动 | docs: 修改实验报告中的笔误 |
| style | 格式变动 (不影响逻辑) | style: 统一将缩进由空格改为 Tab |
| refactor | 重构 (既不是 fix 也不加 feat) | refactor: 优化了头文件的引用结构 |
| chore | 构建过程或辅助工具的变动 | chore: 更新 .gitignore 忽略列表 |
为什么要这么做?
- 可读性:快速过滤历史记录,一眼看出哪些是功能更新,哪些是 Bug 修复。
- 自动化:可以通过脚本自动从 commit 中提取信息生成更新日志(CHANGELOG)。
3.3 巧妙使用 .gitignore:保持仓库整洁¶
在做实验时,我们不希望把编译生成的 build/ 目录或巨大的二进制文件存进 Git,因为它们是自动生成的,且占空间。
在项目根目录创建 .gitignore 文件,写入你要忽略的内容,示例:
# 忽略所有以 .o 结尾的文件
*.o
# 忽略所有的构建文件夹
build/
# 忽略可执行文件
main
*.exe
# 忽略系统自动生成的临时文件
.DS_Store
.vscode/
Tip
.gitignore 的优先级:如果一个文件已经被 git add 过了,那么它就已经进入了版本库的监控范围了。此时即使你在 .gitignore 里写了这个文件,它也不会被忽略。要让它生效,你需要先运行 git rm --cached <file> 把它从版本库中移除,然后再提交一次。
忠告:
Git 仓库里只应该存放源码、配置文件(如 Makefile/CMakeLists)和文档。千万不要把 build/ 文件夹或者编译出来的 main 程序推送到远程仓库。
如果你发现 git status 里出现了一堆编译产物,请立刻检查你的 .gitignore!
3.4 如何回退?¶
如果代码改坏了,想回到上一个版本怎么办?
- 如果你只想看一眼过去:
git checkout <commit_id>(通过git log找到那串长长的 ID)。 - 如果你想放弃当前修改,回到上一次 commit 的状态:
git reset --hard HEAD
警告
git reset --hard 是危险操作,它会抹除你工作区还没提交的所有修改,请务必确认后再使用。
3.5 远程仓库:代码的云端备份¶
在之前的步骤中,你的所有操作都发生在你的本地硬盘。如果电脑进水或硬盘损坏,代码依然会丢失。远程仓库(如 GitHub、Gitee 或校内 GitLab)就是你的“云端保险箱”和“协作平台”。
3.5.1 常用场景与指令¶
A. 从零开始(下载别人的项目)¶
如果你想参与开源项目,或者以后获取助教分发的实验框架:
git clone <url>
这会将远程仓库完整地下载到本地,并自动建立连接。
B. 建立关联(将本地作业上传)¶
如果你先在本地写好了代码,现在想上传到自己的 GitHub 仓库:
- 关联远程库:
git remote add origin https://github.com/YourName/YourRepo.git
这里的 origin 是给远程仓库起的“外号”,你可以理解为指向云端地址的快捷方式。
2. 第一次推送:
git push -u origin main
-u 参数会将本地的 main 分支与远程的 main 分支绑定,以后只需输入 git push 即可。
C. 同步更新(多台设备协作)¶
如果你在实验室写了一半,回宿舍想继续写:
- 推送 (Push):在实验室写完后,
commit并git push。 - 拉取 (Pull):回宿舍后,在代码目录执行
git pull,将云端最新的修改“拉”下来同步到本地。
3.5.2 身份校验(避坑指南)¶
现在的远程仓库为了安全,通常不允许直接用“账号+密码”提交。
- HTTPS 方式:可能需要使用 Personal Access Token (PAT)。
- SSH 方式:这是最推荐的方式。通过生成 SSH 密钥对(
ssh-keygen),将公钥上传到服务器,实现免密提交。
3.6 章节小结:Git 常用命令速查表¶
| 场景 | 命令 |
|---|---|
| 开启新项目 | git init |
| 确认当前状态 | git status |
| 准备提交 | git add <file> 或 git add . |
| 正式记录 | git commit -m "feat: xxx" |
| 查看过去 | git log --oneline --graph |
| 同步云端 | git push (推上去) / git pull (拉下来) |
3.6 实验常见问题 Q&A¶
Q: 为什么我运行 git commit 会弹出一个奇怪的编辑器(Vim)?
A: 那是因为你没加 -m "消息"。Git 强迫你输入提交说明。输入 :q! 可以退出,或者按 i 进入输入模式,写完后按 Esc 再输入 :wq 保存退出。建议初学者永远记得带上 -m。
Q: git status 看到一堆红色的文件名是什么意思?
A: 那说明这些文件被改动了,但还没进“暂存区”。快运行 git add 吧!
Q: 我把 .git 文件夹删了会怎样?
A: 千万别删! 所有的历史版本、提交记录都存在那个文件夹里。删了它,你的项目就退化回普通的文件夹了。