Git使用笔记

9 min read

本笔记基于 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 merge
  • git 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 的烦恼):

  1. 生成密钥:ssh-keygen -t ed25519 -C "your_email@example.com"
  2. 查看并复制公钥:cat ~/.ssh/id_ed25519.pub
  3. 将内容添加到 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. 学习资源

Suggest an edit

Last modified: 30 Mar 2026