跳转至

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 的关键在于明白代码在提交过程中经过的三个地方。我们可以用 “打包发货” 来比喻:

  1. 工作区 (Working Directory):你正在改代码的地方。—— 你的办公桌,随你怎么涂改。
  2. 暂存区 (Staging Area / Index):准备提交的“缓存区”。—— 准备寄出的快递盒,你把要发货的东西放进去,但还没封口。
  3. 版本库 (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 退出。

养成好习惯:

每次写完一个独立的小功能(比如写完一个函数并通过了编译),就进行一次 addcommit。不要等写了 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 忽略列表

为什么要这么做?

  1. 可读性:快速过滤历史记录,一眼看出哪些是功能更新,哪些是 Bug 修复。
  2. 自动化:可以通过脚本自动从 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 如何回退?

如果代码改坏了,想回到上一个版本怎么办?

  1. 如果你只想看一眼过去git checkout <commit_id> (通过 git log 找到那串长长的 ID)。
  2. 如果你想放弃当前修改,回到上一次 commit 的状态git reset --hard HEAD

警告

git reset --hard 是危险操作,它会抹除你工作区还没提交的所有修改,请务必确认后再使用。

3.5 远程仓库:代码的云端备份

在之前的步骤中,你的所有操作都发生在你的本地硬盘。如果电脑进水或硬盘损坏,代码依然会丢失。远程仓库(如 GitHub、Gitee 或校内 GitLab)就是你的“云端保险箱”和“协作平台”。

3.5.1 常用场景与指令

A. 从零开始(下载别人的项目)

如果你想参与开源项目,或者以后获取助教分发的实验框架:

git clone <url>

这会将远程仓库完整地下载到本地,并自动建立连接。

B. 建立关联(将本地作业上传)

如果你先在本地写好了代码,现在想上传到自己的 GitHub 仓库:

  1. 关联远程库
    git remote add origin https://github.com/YourName/YourRepo.git
    

这里的 origin 是给远程仓库起的“外号”,你可以理解为指向云端地址的快捷方式。 2. 第一次推送

git push -u origin main

-u 参数会将本地的 main 分支与远程的 main 分支绑定,以后只需输入 git push 即可。

C. 同步更新(多台设备协作)

如果你在实验室写了一半,回宿舍想继续写:

  • 推送 (Push):在实验室写完后,commitgit 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: 千万别删! 所有的历史版本、提交记录都存在那个文件夹里。删了它,你的项目就退化回普通的文件夹了。