Git
一、基础概念与核心原理
-
Git 与其他版本控制工具的区别(如 SVN)
- 分布式 vs 集中式:Git 本地有完整仓库,无需联网即可提交;SVN 依赖中央服务器。
- 分支轻量级:Git 分支是指针操作,创建/切换成本极低;SVN 分支是文件复制。
- 内容寻址存储:Git 按数据内容生成哈希值,确保数据不可变;SVN 按文件版本管理。
-
Git 核心组件与工作流程
- 四区域模型:
- 工作区(Working Directory):本地文件系统中的代码。
- 暂存区(Staging Area/Index):
git add
后等待提交的变更。 - 本地仓库(Local Repository):
git commit
后的历史版本(含对象库、 refs 等)。 - 远程仓库(Remote Repository):团队共享的代码托管平台(如 GitHub)。
- 操作流程示例:
git clone
→ 修改文件 →git add
→git commit
→git push
。
- 四区域模型:
-
Git 对象模型(底层原理)
- 三大对象:
- Blob:存储文件内容(无文件名)。
- Tree:存储目录结构(包含 Blob 和子 Tree 的引用)。
- Commit:存储提交信息(作者、时间、父提交引用、指向 Tree 的指针)。
- 引用(Refs):如
HEAD
(当前分支指针)、分支名、标签(Tag),本质是指向 Commit 的指针。
- 三大对象:
二、常用命令与操作场景
-
基础操作命令
- 克隆与拉取:
git clone
(克隆仓库)、git pull
(拉取并合并远程分支)。 - 提交流程:
git add
(暂存变更)、git commit
(提交到本地)、git push
(推送到远程)。 - 历史查看:
git log
(查看提交历史)、git diff
(对比文件差异)。
- 克隆与拉取:
-
分支与合并
- 分支管理:
git branch
(创建/查看分支)、git checkout
(切换分支)、git switch
(新版切换分支)。 - 合并策略:
git merge
:创建合并提交(保留分支历史,适合团队协作)。git rebase
:将分支历史重放至目标分支顶端(保持线性历史,适合个人开发)。
- 面试高频问题:
- merge 和 rebase 的区别?
→ merge 生成新提交,保留分支合并痕迹;rebase 改写历史,使分支更简洁。 - 什么场景用 rebase?
→ 个人开发分支未推送到远程时,避免污染公共分支历史。
- merge 和 rebase 的区别?
- 分支管理:
-
撤销与回滚
git reset
:移动 HEAD 指针,可重置暂存区和工作区(危险,可能丢失未提交变更)。git revert
:创建新提交撤销旧提交(安全,适合已推送到远程的分支)。git checkout
:恢复文件到指定版本(或放弃工作区修改)。
-
冲突解决
- 冲突场景:多人修改同一文件同一区域,合并时需手动解决。
- 解决步骤:
git merge
或git rebase
时出现冲突,编辑冲突文件(标记为<<<<<<<
=======
>>>>>>>
)。- 保留正确代码,删除冲突标记。
git add
冲突文件,git commit
完成合并。
三、分支策略与团队协作
-
主流分支模型
- Git Flow:
- 主分支:
master
(稳定版本)、develop
(开发主干)。 - 功能分支:
feature/*
(开发新功能)。 - 发布分支:
release/*
(准备上线)。 - 热修复分支:
hotfix/*
(紧急 bug 修复)。
- 主分支:
- GitHub Flow/Trunk-Based Development:
- 简化分支,以
main
为主干,功能分支直接合并到main
(适合快速迭代团队)。
- 简化分支,以
- Git Flow:
-
团队协作最佳实践
- 提交规范:使用结构化 commit message(如 Angular 规范:
feat: 添加用户登录功能
)。 - 代码审查:通过 PR(Pull Request)机制,强制审查后合并。
- 分支管理:定期清理过时分支,避免分支泛滥。
- 钩子脚本(Hooks):使用
pre-commit
钩子检查代码格式(如通过husky
集成ESLint
)。
- 提交规范:使用结构化 commit message(如 Angular 规范:
四、高级功能与问题解决
-
高级命令与场景
git cherry-pick
:将其他分支的某个提交应用到当前分支(适合跨分支移植功能)。git reflog
:记录 HEAD 的所有变更,用于恢复误删的提交(git reset --hard <reflog哈希>
)。git stash
:临时保存未提交的修改(适合切换分支前暂存工作)。git submodule
vsgit subtree
:
→ submodule 维护独立仓库引用(适合依赖外部项目);
→ subtree 将外部仓库合并为当前仓库的子目录(适合集成内部组件)。
-
性能与大仓库优化
- Git LFS(Large File Storage):存储大文件(如图片、视频)到远程服务器,避免仓库膨胀。
- 稀疏检出(Sparse Checkout):仅克隆仓库中的部分目录(
git clone --sparse
+git sparse-checkout
)。
-
常见问题与解决方案
- 问题:误删了未推送的提交,如何恢复?
→ 用git reflog
找到对应哈希,git reset --hard <哈希>
。 - 问题:远程分支被删除,本地如何恢复?
→git fetch
后用git branch -r
查看远程分支引用,git checkout -b <分支名> origin/<原分支名>
。
- 问题:误删了未推送的提交,如何恢复?
五、原理深入与扩展
-
Git 如何保证数据完整性?
- 所有对象(Blob/Tree/Commit)通过 SHA-1 哈希标识,修改任意内容会导致哈希变化,Git 可通过哈希校验数据一致性。
-
分布式协作中的冲突处理
- 多人推送至同一分支时,可能遇到
non-fast-forward
错误,需先git pull
合并远程变更,再git push
。
- 多人推送至同一分支时,可能遇到
-
Git 钩子(Hooks)的类型
- 客户端钩子:
pre-commit
(提交前检查)、prepare-commit-msg
(修改提交信息)。 - 服务端钩子:
pre-receive
(推送前校验,防止非法提交)。
- 客户端钩子:
六、面试加分项
- 结合项目经验:举例说明在团队中如何用 Git 解决具体问题(如某次复杂冲突的处理、分支策略的优化)。
- 工具链集成:了解 Git 与 CI/CD 的结合(如 GitHub Actions 中通过 Git 触发构建)。
- 原理延伸:了解 Git 的底层存储(如打包文件
pack
的机制)、分布式协同算法(如 Git 的冲突解决策略)。
总结备考方向
- 背熟核心命令:掌握常用命令的参数与场景(如
merge
/rebase
/reset
/revert
的区别)。 - 理解原理逻辑:从对象模型到分支合并,用逻辑图辅助记忆(如 Commit 树的结构)。
- 模拟实战问题:思考面试中可能的场景题(如“如何回滚已推送的错误提交”),用具体命令步骤回答。
- 关注团队实践:了解主流分支策略的优缺点,结合团队规模说明适用场景。