Git使用笔记
本笔记基于 The Missing Semester of Your CS Education - Version Control (Git)
本笔记根据原教程文档,使用Kimi K2.5总结并翻译为中文版,并由Gemini 3 Flash Preview补充GitHub与中国开发者需要注意的问题
版本控制系统 (VCS) 是用于跟踪源代码(或其他文件和文件夹集合)变更的工具。正如其名,这些工具帮助维护变更历史,并促进协作。Git 是目前事实上的标准版本控制工具。
1. Git 的数据模型
Git 的独特之处在于它对数据的建模方式。Git 将历史记录建模为一系列快照 (Snapshots),而不是差异。
快照 (Snapshots)
Git 将顶级目录中的文件和文件夹集合的历史建模为一系列快照。
- Blob (Binary Large Object): 文件内容(仅仅是一堆字节)。
- Tree: 目录。将名称映射到 Blob 或其他 Tree(目录可以包含子目录)。
- Commit: 快照。它是被追踪的顶级 Tree,还包含元数据(如作者、信息)和父级 Commit。
建模历史:关联快照
历史是一个有向无环图 (DAG) 的快照。每个提交(Snapshot)都指向其“父级”提交。
- 线性历史: 每个提交只有一个父级。
- 分支与合并: 一个提交可能有多个父级(例如合并两个分支时)。
o <-- o <-- o <-- o <---- o
^ /
\ v
--- o <-- o
数据模型伪代码
理解 Git 的数据模型有助于理解其命令:
// 文件是一堆字节
type blob = array<byte>
// 目录包含命名的文件和目录
type tree = map<string, tree | blob>
// 提交包含父级、元数据和顶级树(快照)
type commit = struct {
parents: array<commit>
author: string
message: string
snapshot: tree
}
对象和内容寻址 (Content-addressing)
在 Git 的数据存储中,所有对象(Blob, Tree, Commit)都通过其 SHA-1 哈希进行内容寻址。
objects = map<string, object>
def store(object):
id = sha1(object)
objects[id] = object
def load(id):
return objects[id]
引用 (References)
因为 SHA-1 哈希(如 698281bc68...)难以记忆,Git 使用“引用”(refs)作为 SHA-1 哈希的人类可读名称。引用是指向提交的指针。与不可变的对象不同,引用是可变的。
- master (或 main): 通常指向主开发分支的最新提交。
- HEAD: 特殊引用,指向当前所在的提交(当前检出的位置)。
references = map<string, string>
def update_reference(name, id):
references[name] = id
def read_reference(name):
return references[name]
2. 暂存区 (Staging Area)
Git 允许你指定哪些修改应该包含在下一个快照中,这就是“暂存区”(或称为 Index)。
这允许你创建干净的提交,例如:
- 将两个功能的修改分开提交。
- 在提交修复时排除调试用的打印语句。
3. Git 命令行接口
基础 (Basics)
git help <command>: 获取命令帮助git init: 初始化新仓库git status: 查看状态(当前工作区和暂存区情况)git add <filename>: 添加文件到暂存区git commit: 创建新提交git log: 显示历史日志git log --all --graph --decorate: 可视化历史 DAG(推荐)git diff <filename>: 显示工作区相对于暂存区的差异git diff <revision> <filename>: 显示文件在不同快照间的差异git checkout <revision>: 更新 HEAD 和工作区
分支与合并 (Branching and Merging)
git branch: 显示分支git branch <name>: 创建分支git switch <name>: 切换分支git checkout -b <name>: 创建并切换分支git merge <revision>: 合并指定版本到当前分支git mergetool: 使用工具解决合并冲突git rebase: 变基。将一系列补丁应用到新的基底上(重写历史以保持线性)
远程 (Remotes)
git remote: 列出远程仓库git remote add <name> <url>: 添加远程git push <remote> <local branch>:<remote branch>: 推送对象并更新远程引用git branch --set-upstream-to=<remote>/<remote branch>: 设置本地与远程分支的关联git fetch: 从远程获取对象/引用git pull: 等同于git fetch; git mergegit clone: 从远程下载仓库
撤销 (Undo)
git commit --amend: 编辑上一次提交的内容/信息git reset <file>: 取消暂存文件git restore: 丢弃更改(恢复文件到最近提交的状态)
4. 高级 Git
- git config: Git 是高度可配置的。
- git clone —depth=1: 浅克隆,不下载完整历史版本。
- git add -p: 交互式暂存(可以只暂存文件的部分修改)。
- git rebase -i: 交互式变基(可以修改、合并、删除历史提交)。
- git blame: 显示每行代码的最后修改者。
- git stash: 暂时移除工作目录的修改(保存现场)。
- git bisect: 二分查找历史(例如用于定位引入 Bug 的提交)。
- .gitignore: 指定故意不追踪的文件(如编译产生的临时文件)。
5. 杂项
- GUI: 虽然有许多 Git GUI 客户端,但建议先学习命令行接口。
- Shell 集成: 在 Shell 提示符中显示 Git 状态(如当前分支、是否有修改)非常有用(推荐 zsh-git-prompt 或 Oh My Zsh)。
- 编辑器集成: 如 Vim 的 fugitive.vim。
- GitHub: Git 不等于 GitHub。GitHub 是一个托管 Git 仓库的平台,提供了 Pull Requests (PR) 等协作功能。其他类似平台还有 GitLab, BitBucket 等。
6. 初始配置与环境优化
初始配置
安装 Git 后,首先应配置个人信息,这会出现在你的 Commit 元数据中:
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
# 设置默认分支名为 main (顺应现代习惯)
git config --global init.defaultBranch main
SSH 密钥配置
相比 HTTPS,使用 SSH 协议在推送代码时更方便(免去输入 Token 的烦恼):
- 生成密钥:
ssh-keygen -t ed25519 -C "your_email@example.com" - 查看并复制公钥:
cat ~/.ssh/id_ed25519.pub - 将内容添加到 GitHub Settings -> SSH and GPG keys 中。
7. 中国开发者额外注意 (Network & Proxies)
在国内环境下,直接访问 GitHub 往往不稳,建议进行以下优化:
配置代理
如果你本地开启了代理工具(如 7890 端口),可以配置 Git 走代理:
HTTP/HTTPS 协议:
# 设置代理
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
提升克隆速度
- 浅克隆:
git clone --depth 1 <url>只下载最新一次提交,极大减少大仓库下载量。 - 国内镜像: 如果仅需下载,可以使用
gitclone.com等镜像地址,或者通过 Gitee 的“导入已有仓库”功能作为中转。
文件名乱码
解决 git status 中文文件名显示为数字转义符的问题:
git config --global core.quotepath false
8. GitHub 协作流程
GitHub 扩展了 Git 的社交属性,核心流程包括:
- Fork: 在服务端克隆一份别人的仓库到你的账号下,你可以自由修改。
- Pull Request (PR): 你修改完后,向原作者发起“合并请求”。
- Issue: 讨论 Bug 或新功能的地方。
- GitHub CLI (
gh): 官方工具,支持在命令行直接操作 PR、Issue 和 Repo,非常适合 Geek。
9. 学习资源
- Pro Git: 强烈推荐。阅读前 5 章即可掌握大部分用法。
- Oh Shit, Git!?!: 修复常见 Git 错误的简短指南。
- Learn Git Branching: 一个学习 Git 分支操作的浏览器游戏。
- Git from the Bottom Up: 深入解释 Git 的底层实现细节。
Last modified: 30 Mar 2026