Git 概念与用法完整说明
文档定位:面向软件开发、运维自动化、科研协作与团队工程实践,系统说明 Git 的核心概念、内部机制、常用命令与协作规范。
使用方式:先阅读“快速导航”和“目录”,再按场景跳转到对应章节。
快速导航
- 我是新手,先看:#01 Git 的定义与系统定位、#09 Git 的四个工作区域、#10 文件状态模型
- 我要开始一个项目:#11 安装与版本验证、#11A Git 下载与环境配置(跨平台)、#11B 国内网络环境下载与加速配置、#12 身份与基础配置、#13 初始化仓库、#14 克隆远程仓库
- 我要日常开发提交:#16 状态检查、#17 暂存内容、#18 创建提交、#19 差异比较
- 我要协作和同步:#27 远程仓库与远程引用、#28 获取更新(fetch)、#29 同步更新(pull)、#30 推送更新(push)
- 我做错了想恢复:#32 文件级恢复(restore)、#33 历史回退(reset)、#34 公开撤销(revert)、#35 引用恢复(reflog)
- 我想快速查命令:#49 高频命令速查
- 我要定位“哪个提交引入了 bug”:#51 二分查找坏提交(git bisect)
- 我要把单个补丁挪到别的分支:#50 精准摘取提交(git cherry-pick)
- 我要做规范协作(PR、评审、保护分支):#55 Pull Request 协作流程
目录
- Git 概念与用法完整说明
第一部分:概念基础与系统定位
01 Git 的定义与系统定位
Git 是一种分布式版本控制系统(DVCS),用于记录项目内容在时间维度上的演化过程,并支持多人并行开发、审查、回退、同步与发布。
Git 不是文件备份工具,也不只是代码同步工具。它本质上是“内容历史管理系统”,核心职责是:
- 记录项目内容状态
- 建立可追溯变更历史
- 支持并行开发线路隔离与整合
- 支持本地与远程仓库的同步
- 支持恢复、修订与发布
02 Git 的核心能力与适用范围
核心能力:
- 历史记录能力:以提交为单位定位、比较与恢复历史
- 并行开发能力:分支隔离不同任务
- 合并整合能力:自动合并与冲突定位
- 分布式协作能力:本地仓库具备完整历史
- 可恢复与可审计能力:通过 reset、restore、revert、reflog 处理误操作
适用范围:
- 软件开发与团队协作
- 运维脚本与基础设施代码
- 科研项目、课程项目版本管理
- 需要审计与可追溯性的文档工程
03 Git 与其他版本控制方式的本质区别
与手工备份式版本管理相比,Git 具备:
- 连续历史
- 自动差异比较
- 并行开发表达能力
- 结构化协作能力
与集中式版本控制(如 SVN)相比,Git 具备:
- 本地完整历史
- 离线可用
- 分支与合并成本更低
- 不依赖唯一中心节点
04 Git 的分布式架构特征
“分布式”意味着每个仓库副本都包含完整对象数据库与历史引用。
直接结果:
- 本地操作快(多数命令无需网络)
- 容错性高(不依赖唯一服务器)
- 分支实验成本低
- 协作更灵活,但需要更严格规范
第二部分:内部模型与核心机制
05 Git 的数据模型
Git 的核心是“对象数据库 + 引用系统”,不是“目录 + 命令集合”。
逻辑实体包括:
- 文件内容对象
- 目录结构对象
- 提交对象
- 标签对象
- 指向这些对象的引用
提交历史本质是有向无环图(DAG)。多数 Git 操作本质上只有两类:
- 创建新对象
- 更新或移动引用
06 Git 对象:blob、tree、commit、tag
- blob:保存文件内容,不保存文件名和路径
- tree:保存目录结构与名称映射
- commit:保存快照指针、父提交、作者、时间与提交说明
- tag:为对象(通常是提交)提供稳定名称
标签分为:
- 轻量标签:简单引用
- 附注标签:独立对象,带作者、时间与说明
07 提交图与历史结构
Git 历史不是线性列表,而是提交图:
- 普通提交:单父节点
- 分支分叉:从某提交分出新开发线
- 合并提交:常见双父节点
图结构支持共同祖先分析、三方合并、历史重放与复杂协作模型。
08 引用系统:HEAD、branch、tag、remote-tracking branch
- branch:可移动引用,指向某条开发线最新提交
- HEAD:当前检出位置(通常指向当前分支)
- tag:通常不可移动,用于发布点标记
- remote-tracking branch:远程状态在本地的镜像(如 origin/main)
09 Git 的四个工作区域
- 工作区(Working Directory):实际编辑文件的目录
- 暂存区(Staging Area / Index):下一次提交候选内容
- 本地仓库(Local Repository):对象与历史存储(.git)
- 远程仓库(Remote Repository):协作同步与备份节点
10 文件状态模型与状态迁移
常见状态:
- Untracked(未跟踪)
- Tracked / Unmodified(已跟踪未修改)
- Modified(已修改未暂存)
- Staged(已暂存)
典型路径:
Untracked -> Staged -> Tracked/Unmodified -> Modified -> Staged
第三部分:环境准备与仓库建立
11 安装与版本验证
11A Git 下载与环境配置(跨平台)
本节目标:确保你不仅“安装了 Git”,还完成了可用的命令行环境配置(尤其是 PATH)。
下载建议:
- Windows:从 Git for Windows 官方发布页下载安装包
- macOS:优先使用 Homebrew,或安装 Xcode Command Line Tools
- Linux:使用发行版官方包管理器安装
常用安装命令:
Windows(winget):
winget install --id Git.Git -e --source winget
macOS(Homebrew):
brew install git
Ubuntu / Debian:
sudo apt update
sudo apt install -y git
CentOS / RHEL / Rocky:
sudo dnf install -y git
安装后检查:
git --version
若提示“command not found”或“不是内部或外部命令”,通常是 PATH 未配置好。可按以下方式排查:
- 先确认 Git 可执行文件位置
which git
Windows PowerShell 可用:
Get-Command git
- 检查 PATH 是否包含 Git 安装目录
- 修改 PATH 后重启终端,再执行
git --version
常见建议:
- Windows 安装向导中,建议选择“Git from the command line and also from 3rd-party software”
- macOS/Linux 若存在多版本 Git,使用
which git确认当前生效路径 - 团队文档中固定最低版本要求,避免行为差异
11B 国内网络环境下载与加速配置
在网络受限或连接不稳定场景下,建议优先解决“下载源、协议选择、代理与证书”四个问题。
1) 下载与安装建议
- Git 安装包优先使用官方发布页与可信镜像站,避免来历不明的二次打包版本
- 包管理器(
winget、brew、apt、dnf)通常比手工下载更稳定、可维护
2) 协议选择建议(HTTPS vs SSH)
- 首次接入建议先用 HTTPS,配置更快
- 长期开发建议切换 SSH,减少重复凭证输入
验证远程可达性:
git ls-remote <repository-url>
若该命令超时或失败,优先检查网络、代理与 DNS,而不是先改 Git 命令本身。
3) 代理配置(按需启用)
设置 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 config --global --get http.proxy
git config --global --get https.proxy
4) SSH 连接检查与优化
生成密钥(如未生成):
ssh-keygen -t ed25519 -C "your_email@example.com"
测试连接:
ssh -T git@github.com
若 22 端口受限,可尝试基于 443 的 SSH 方案(依平台支持情况配置 ~/.ssh/config)。
5) SSL 证书与安全提醒
- 遇到证书问题应优先修复系统证书链或企业代理证书
- 不建议长期使用关闭 SSL 校验的方式
不推荐长期使用(仅临时排障):
git config --global http.sslVerify false
排障后务必恢复:
git config --global http.sslVerify true
6) 最小排障流程(推荐顺序)
-
git --version(确认安装) -
which git(确认生效路径) -
git config -l --show-origin(确认是否有异常代理/证书配置) -
git ls-remote <repository-url>(验证连通性) -
仍失败时,再切换协议或检查代理与 DNS
11C 版本验证
git --version
团队协作中建议统一版本区间,避免默认行为差异(例如默认分支名、rebase/merge 默认策略、凭证支持方式)。
12 用户身份与基础环境配置
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
配置层级:
- system(系统级)
- global(用户级)
- local(仓库级)
优先级:local > global > system
常用配置:
git config --global core.editor "code --wait"
git config --global color.ui auto
跨平台换行建议:
- Windows:
git config --global core.autocrlf true
- Linux / macOS:
git config --global core.autocrlf input
13 仓库初始化:git init
git init
适用场景:
- 从零创建项目
- 将已有目录纳入 Git 管理
- 本地实验仓库
14 远程仓库克隆:git clone
git clone <repository-url>
常用参数:
git clone --depth=1 <repository-url>
git clone --branch <branch-name> <repository-url>
git clone --recursive <repository-url>
15 配置层级与仓库元数据结构
典型 .git 目录结构:
- objects/:对象数据库
- refs/:引用目录
- HEAD:当前检出引用
- config:仓库配置
- index:暂存区索引
- logs/:引用变动日志
- hooks/:钩子脚本目录
第四部分:本地版本控制操作
16 状态检查与信息读取
git status
git status -s
git branch -a
git branch -vv
git remote -v
高频实践:每次提交、合并、推送前先看一次状态。
17 内容加入暂存区:git add
git add file.txt
git add .
git add -A
git add -p
重点:git add 是“选择下一次提交内容”,不是“直接提交”。
18 创建提交:git commit
git commit -m "message"
高质量提交应满足:
- 主题明确
- 边界清晰
- 可独立理解
- 可单独回退
修订最近一次提交:
git commit --amend
19 差异比较:git diff
git diff
git diff --cached
git diff <commit1> <commit2>
git diff main feature/login
- git diff:工作区 vs 暂存区
- git diff —cached:暂存区 vs 最近提交
20 历史查看:git log、git show、git blame
git log
git log --oneline --graph --decorate --all
git show <commit-id>
git blame file.txt
第五部分:分支、合并与历史整合
21 分支的定义与实现原理
分支是“指向提交的可移动引用”,不是目录副本。
这也是 Git 分支轻量、切换快、可高频创建删除的根本原因。
22 分支创建、切换与删除
git branch feature/login
git switch -c feature/login
git checkout -b feature/login
git switch main
git branch -d feature/login
git branch -D feature/login
git push origin --delete feature/login
23 合并机制:fast-forward 与 three-way merge
- fast-forward:目标分支无额外提交,仅前移引用
- three-way merge:双方都前进时,基于共同祖先进行三方整合,通常产生 merge commit
24 冲突的成因、识别与处理
标准处理流程:
- git status 定位冲突文件
- 手工整合文本并删除冲突标记
- git add 标记冲突已解决
- 继续 merge / rebase / commit 流程
原则:按语义整合,不做机械“选左或选右”。
25 变基:git rebase 的原理与用途
rebase 的核心是“将提交序列重放到新基底”,因此会改写历史。
适用场景:
- 整理个人分支历史
- 合并前清理提交序列
- 让功能分支跟上最新主线
26 merge 与 rebase 的适用边界
- 公开共享历史:优先 merge 或 revert
- 个人未共享历史:可使用 rebase 整理
- 是否允许主干 rebase:由团队统一约定
第六部分:远程协作与同步机制
27 远程仓库与远程引用
- 本地分支:可提交、可修改(如 main)
- 远程跟踪分支:远程状态本地镜像(如 origin/main)
28 获取更新:git fetch
git fetch
特点:只更新远程跟踪分支,不改当前工作区和当前本地分支。适合“先看再整合”。
29 同步更新:git pull
git pull
通常等价于:
git fetch
git merge
若启用 rebase 策略,则可能表现为 fetch + rebase。
30 推送更新:git push
git push
git push -u origin main
非 fast-forward 被拒绝时,先确认原因,再决定 fetch / merge / rebase。
强推优先使用:
git push --force-with-lease
31 上游分支、跟踪关系与协作约束
git branch -vv
建立上游关系后,pull/push/status 的默认行为更明确,可减少误操作。
第七部分:历史修改、撤销与恢复
32 文件级恢复:git restore
git restore file.txt
git restore --staged file.txt
git restore --source=<commit-id> file.txt
33 历史回退:git reset
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
- —soft:回退提交,保留暂存区和工作区
- —mixed:回退提交与暂存区,保留工作区
- —hard:回退提交、暂存区、工作区(高风险)
34 公开历史撤销:git revert
git revert <commit-id>
revert 通过“新增反向提交”撤销历史效果,不改写已有历史,适合公共分支。
35 引用恢复:git reflog
git reflog
误 reset、误 rebase、误 checkout 后,通常可通过 reflog 找回旧引用。
36 提交修订:git commit —amend
git commit --amend
用于修正最近一次提交说明或补交遗漏内容。它会改写最近一次提交。
37 历史改写的风险与控制原则
高风险操作包括:
- commit —amend
- rebase
- reset
- push —force
控制原则:
- 本地个人历史可整理
- 已共享历史不随意改写
- 主干分支改写需强约束
- 公共撤销优先 revert
- 强推优先 —force-with-lease
第八部分:辅助机制与工程工具
38 暂存工作现场:git stash
git stash
git stash push -m "WIP: login page"
git stash list
git stash pop
git stash apply
- pop:恢复并删除记录
- apply:恢复但保留记录
39 版本标记:git tag
git tag v1.0.0
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0
git push origin --tags
40 忽略规则:.gitignore
示例:
node_modules/
dist/
build/
*.log
.env
.vscode/
.DS_Store
注意:.gitignore 仅对“未跟踪文件”生效。已跟踪文件需先执行 git rm —cached。
41 子模块:git submodule
git submodule add <repo-url> <path>
git submodule update --init --recursive
适合“独立仓库依赖且需锁定版本”的场景,不适合替代普通目录结构。
42 远程地址与认证配置
常见协议:HTTPS、SSH。
git remote -v
git remote set-url origin <new-url>
第九部分:工程实践与协作规范
43 提交粒度与提交说明规范
提交粒度建议:
- 一个提交只做一件事
- 不混入无关改动
- 可独立审查与回滚
提交说明建议:
- 避免:update、modify、fix bugs
- 推荐:Add request timeout handling
- 推荐:Fix duplicate primary key in order service
- 推荐:Refactor auth middleware initialization
44 分支命名与生命周期管理
命名示例:
- feature/user-login
- bugfix/payment-timeout
- hotfix/prod-null-pointer
- release/v1.2.0
- docs/api-guide
生命周期建议:
- 从稳定基线创建
- 在分支内完成特定任务
- 审查通过后合并
- 合并后删除无用分支
45 常见团队工作流
- Feature Branch Workflow:大多数团队适用
- Git Flow:流程严格、发布节奏明确
- Trunk-Based Development:短分支、小步合并、高频集成
46 冲突预防与协作注意事项
- 高频同步主线
- 功能分支短生命周期
- 避免多人长期修改同一核心文件
- 合并前审查 diff
- 大规模重构提前沟通
47 典型错误与处理方法
- 临时文件误提交
- 更新 .gitignore
- 对已跟踪文件执行 git rm —cached
- 重新提交
- 最近一次提交信息或内容有误
git commit --amend
- 已共享提交需要撤销
git revert <commit-id>
- 误执行 reset —hard
git reflog
- 推送被拒绝
先确认:远程是否前进、是否受分支保护、是否历史被改写、是否权限不足。
48 Git 最佳实践
- 高频使用 status/diff/log 理解当前状态
- 小步提交,减少混杂提交
- 不在主分支直接做复杂开发
- 共享历史谨慎改写
- 公共撤销优先 revert
- 项目早期建立 .gitignore
- 高风险操作前先确认引用与差异
- 把 Git 当作“历史系统”而不是“同步工具”
第十部分:命令速查
49 高频命令速查
仓库建立:
git init
git clone <repo-url>
状态与信息:
git status
git status -s
git branch -a
git branch -vv
git remote -v
暂存与提交:
git add <file>
git add .
git add -A
git add -p
git commit -m "message"
git commit --amend
差异与历史:
git diff
git diff --cached
git log
git log --oneline --graph --decorate --all
git show <commit-id>
git blame <file>
分支与合并:
git switch <branch>
git switch -c <branch>
git merge <branch>
git rebase <branch>
git branch -d <branch>
远程同步:
git fetch
git pull
git push
git push -u origin <branch>
撤销与恢复:
git restore <file>
git restore --staged <file>
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert <commit-id>
git reflog
辅助功能:
git stash
git stash list
git stash pop
git tag
git tag -a v1.0.0 -m "release"
git push origin --tags
git submodule update --init --recursive
第十一部分:进阶实战专题
50 精准摘取提交:git cherry-pick
cherry-pick 用于把“某一个或某几个提交”的变更效果复制到当前分支,而不是合并整条分支。
常见场景:
- 线上热修复需要从开发分支挑一个补丁
- 发布分支只需要吸收某个 bugfix
- 多分支并行时临时同步单个修复
基本用法:
git cherry-pick <commit-id>
git cherry-pick <commit-a> <commit-b>
git cherry-pick <start-commit>^..<end-commit>
冲突处理:
git cherry-pick --continue
git cherry-pick --abort
注意事项:
- cherry-pick 会创建新提交,哈希与原提交不同
- 不适合大量连续历史迁移,批量迁移更适合 merge/rebase
51 二分查找坏提交:git bisect
bisect 可以在“好版本”和“坏版本”之间做二分搜索,用最少步骤定位引入问题的提交。
基础流程:
git bisect start
git bisect bad
git bisect good <good-commit-id>
之后 Git 会自动切到中间提交,你在每一步执行测试并标记:
git bisect good
git bisect bad
完成后回到原分支:
git bisect reset
自动化测试模式(推荐):
git bisect start
git bisect bad
git bisect good <good-commit-id>
git bisect run <test-script>
git bisect reset
52 多工作树并行开发:git worktree
worktree 允许同一仓库在不同目录检出不同分支,适合并行处理多个任务。
常见场景:
- 一边修复线上 bug,一边保持主任务开发
- 评审他人分支时不打断当前工作目录
常用命令:
git worktree list
git worktree add ../repo-hotfix hotfix/login-crash
git worktree remove ../repo-hotfix
实践建议:
- 目录命名包含分支语义,如
repo-hotfix、repo-review - 用完及时 remove,避免旧工作树长期堆积
53 自动化与冲突复用:git hooks 与 git rerere
hooks 是 Git 在特定时机触发的脚本机制,常用于质量闸门。
典型钩子:
- pre-commit:提交前执行格式化、lint、基础测试
- commit-msg:校验提交信息格式
- pre-push:推送前执行关键测试
rerere(reuse recorded resolution)用于复用历史冲突解决结果。
开启方式:
git config --global rerere.enabled true
适用场景:
- 长周期分支反复 rebase/merge 时,降低重复冲突处理成本
54 提交签名、可信历史与 blame 降噪
对于安全要求较高的团队,建议启用提交签名(GPG 或 SSH 签名)来提升提交可信度。
同时,建议在大规模格式化提交后使用“忽略修订”减少 blame 噪声:
git blame --ignore-revs-file .git-blame-ignore-revs <file>
典型做法:
- 把“纯格式化提交”写入
.git-blame-ignore-revs - 评审与定位责任时默认启用 ignore-revs
这能显著提高代码追溯的可读性与准确性。
55 Pull Request 协作流程与分支保护
推荐协作流程:
- 从主干拉出短生命周期功能分支
- 本地自检(格式化、测试、静态检查)
- 推送并创建 Pull Request
- 通过自动化检查与人工评审
- 选择团队约定的合并策略(merge/rebase/squash)
- 合并后删除功能分支
分支保护建议:
- 禁止直接推送主干
- 必须通过 CI
- 至少 1 名 reviewer 批准
- 对关键仓库限制 force push
常见合并策略建议:
- 注重完整历史:使用 merge commit
- 注重线性历史:使用 rebase merge
- 注重主干整洁:使用 squash merge
附录
附录 A:撤销与恢复命令对照
按作用对象快速区分:
- git switch:切换分支
- git restore:恢复文件/暂存状态
- git checkout:旧式复合命令(语义过载)
- git reset:移动分支引用,可能影响暂存区与工作区
- git revert:新增反向提交,不改写已有历史
典型场景:
- 丢弃工作区单文件改动
git restore file.txt
- 取消暂存但保留工作区改动
git restore --staged file.txt
- 切换分支
git switch main
- 撤回最近一次提交但保留内容
git reset --mixed HEAD~1
- 撤销已推送提交
git revert <commit-id>
- 临时查看历史提交
git checkout <commit-id>
若要继续开发,请新建分支:
git switch -c temp-branch
风险等级(低 -> 高):
switch -> restore -> checkout(视用途)-> revert -> reset —soft -> reset —mixed -> reset —hard
附录 B:merge / rebase / cherry-pick / revert 决策说明
- merge:整合整条分支,保留分叉历史,不改写已有提交
- rebase:整理个人分支历史,保持线性,但会改写提交
- cherry-pick:仅挑选单个提交到当前分支
- revert:安全撤销公共历史中的某次提交
选择口诀:
- 整条整合不改历史,用 merge
- 整理个人分支历史,用 rebase
- 只要一个补丁,用 cherry-pick
- 公共分支做撤销,用 revert
附录 C:.gitignore 常用模板补充
通用模板:
# OS
.DS_Store
Thumbs.db
# Editors
.vscode/
.idea/
# Logs
*.log
# Env
.env
.env.local
# Temporary
tmp/
temp/
*.tmp
Rust:
target/
Cargo.lock
**/*.rs.bk
Go:
bin/
dist/
coverage.out
vendor/
*.test
LaTeX:
*.aux
*.log
*.out
*.toc
*.synctex.gz
*.fls
*.fdb_latexmk
前端(Node.js / pnpm / yarn):
node_modules/
dist/
coverage/
.npm/
.pnpm-store/
.yarn/
.next/
.nuxt/
vite.svg
Python 数据与实验工程:
__pycache__/
*.pyc
.venv/
.env
.ipynb_checkpoints/
.mypy_cache/
.pytest_cache/
dist/
build/
附录 D:推荐 Git 配置模板
以下模板适合作为个人开发环境起点,可按团队规范调整。
# 身份
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
# 默认行为
git config --global init.defaultBranch main
git config --global pull.rebase false
git config --global fetch.prune true
# 可读性
git config --global color.ui auto
git config --global core.editor "code --wait"
# 冲突复用
git config --global rerere.enabled true
常用 alias 示例:
git config --global alias.st "status -sb"
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.co "checkout"
git config --global alias.sw "switch"
git config --global alias.br "branch -vv"
说明:alias 要简短、稳定、低歧义,团队共享时应统一文档。
附录 E:常见故障排查清单
git pull后出现大量冲突
- 先执行
git status确认冲突文件 - 用
git log --oneline --graph --decorate --all理解分叉点 - 视情况改为先
fetch再手动merge/rebase
git push被拒绝(non-fast-forward)
- 执行
git fetch - 检查
git branch -vv - 再选择 merge 或 rebase
- 误删分支后找不到提交
- 先查
git reflog - 找到提交后
git switch -c recover-branch <commit-id>
- 工作区很乱又不想立即提交
- 临时保存:
git stash push -m "WIP: <topic>" - 处理完中断任务后:
git stash pop
- 合并后发现引入回归
- 公共分支优先
git revert <merge-commit-id> - 私有分支再考虑 reset/rebase 重整
- blame 信息被格式化提交污染
- 使用
--ignore-revs-file - 维护
.git-blame-ignore-revs
结语
系统学习 Git 的关键,不在于机械记忆命令,而在于建立对象模型、引用系统、状态迁移和协作约束的整体认知。
当你能够回答“当前在哪个引用上、改动在什么状态、历史该不该改写、如何安全与团队协作”这四个问题时,Git 就会从“命令集合”升级为你的工程基础设施。