# 什么是 Git?它的主要功能是什么?
6 min read
Table of Contents
什么是 Git?它的主要功能是什么?
【核心定义】
Git 是一个分布式版本控制系统,用于高效管理项目文件的变更历史,支持多人协作开发。
【关键要点】
- 分布式架构:每个开发者本地都有完整的仓库副本(包括完整历史),不依赖中央服务器即可提交、分支、合并,避免单点故障。
- 快照式存储:Git 不保存文件差异,而是每次提交时对文件系统生成快照(SHA-1 哈希索引),提升检索与比较效率。
- 分支机制:创建分支仅创建指向提交的指针,成本极低;支持非线性开发流程,便于功能隔离与实验。
- 三区结构:工作区(本地文件)、暂存区(待提交快照)、仓库区(永久存储)分离,提供精细的变更控制。
- 完整性保障:所有数据(文件、提交、标签)均通过 SHA-1 哈希校验,任何篡改都会被检测。
【深度推导/细节】
核心矛盾:高效处理非线性协作与海量历史
- 快照 vs 差异存储:传统版本控制系统(如 SVN)存储文件版本间的差异,合并时需递归计算;Git 直接存储文件快照的哈希指针,合并时通过对比快照树快速定位冲突。
- 分支合并策略:
- Fast-forward:当目标分支是当前分支的直接上游时,仅移动分支指针(无新提交)。
- Three-way merge:当分支出现分叉时,基于共同祖先、两个分支的末端快照生成新合并提交。
- Recursive merge:处理多共同祖先的复杂场景,通过虚拟合并基址解决交叉历史。
- 垃圾回收机制:松散对象(未打包的提交/文件)通过
git gc自动打包为.pack文件,压缩历史数据,减少磁盘占用。
【关联/对比】
- Git vs SVN(集中式):
- Git 本地即完整仓库,支持离线操作;SVN 依赖中央服务器提交历史。
- Git 分支为轻量指针;SVN 分支为目录副本,操作笨重。
- Git vs Mercurial:两者均为分布式系统,但 Git 的暂存区设计提供更精细的提交控制,Mercurial 更强调简洁性。
【面试官追问】
- Git 如何保证数据完整性?
- 所有对象均通过 SHA-1 哈希生成唯一标识,任何修改都会改变哈希值;引用日志(reflog)记录指针变更,支持误操作恢复。
- 解释 HEAD、工作树、索引的区别?
- HEAD:指向当前分支最新提交的指针。
- 工作树:本地可见的实际文件。
- 索引(暂存区):下次提交的快照缓存区。
git merge与git rebase的优劣?- Merge 保留完整历史,产生合并提交;Rebase 线性化历史,避免冗余提交但可能破坏协作分支。
- 如何解决合并冲突?
- 手动编辑冲突文件 →
git add标记已解决 →git commit完成合并。
- 手动编辑冲突文件 →
【直击痛点】
- 哈希冲突概率:SHA-1 理论上存在碰撞可能,但 Git 已逐步迁移至 SHA-256 增强安全性。
- 大文件存储缺陷:Git 默认针对代码文本优化,二进制大文件会膨胀仓库;可通过
git-lfs(大文件存储扩展)分离存储。 - 性能临界点:单仓库数万以上提交或超大规模二进制文件时,克隆与拉取可能变慢,需通过浅克隆(
--depth)或子模块拆分优化。
【逻辑复现:合并冲突解决流程】
Step 1:执行 git merge feature,Git 提示冲突文件。
Step 2:打开冲突文件,定位 <<<<<<< HEAD(当前分支内容)与 >>>>>>> feature(合并分支内容)标记区间。
Step 3:人工决策保留内容,删除冲突标记并保存文件。
Step 4:git add resolved-file 将文件加入暂存区,标记冲突已解决。
Step 5:git commit 生成合并提交(或使用 git merge --continue)。
【版本差异】
- Git 1.x:基础分布式操作模型。
- Git 2.0+:默认启用
push.default=simple提升推送安全性,改进合并策略与性能。 - Git 2.23+:引入
git switch/git restore命令,分离分支切换与文件恢复功能,降低git checkout的语义混淆。