返回首页

Git 面试进阶详解

一、核心原理(面试官最爱追问)

1. Git 本质是什么

Git 是分布式版本控制系统,核心是“快照模型”而不是“文件差异模型”。每次提交都记录一组文件快照与父提交关系。

2. 三棵树怎么理解

  • Working Directory:工作区
  • Index(Staging Area):暂存区
  • Repository(HEAD 指向的提交):版本库

你执行 addcommitreset 本质就是在三棵树之间搬运状态。

3. 为什么会有冲突

本质是同一上下文被不同提交修改,自动合并无法确定最终语义,需要人工裁决。

二、merge vs rebase(必答题)

1. merge 的特点

保留分叉和合并历史,不重写已有提交,团队协作更稳妥。

2. rebase 的特点

把当前分支提交“重放”到新基线上,历史更线性,但会改写提交哈希。

3. 实战选型建议

  • 公共分支:优先 merge
  • 个人功能分支整理历史:可用 rebase
  • rebase 后推送:使用 git push --force-with-lease

三、交互式 rebase(高频细问)

1. 典型用途

压缩碎提交、调整提交顺序、改历史提交信息、删除无效提交。

2. 常用指令

  • pick:保留
  • reword:仅改 message
  • squash:与前一提交合并并编辑 message
  • fixup:与前一提交合并并丢弃当前 message
  • drop:删除提交

3. 冲突处理流程

git rebase -i HEAD~5
# 解决冲突后
git add .
git rebase --continue
# 放弃本次操作
git rebase --abort

四、回滚与恢复(救火能力)

1. reset

适合本地历史整理,按 --soft--mixed--hard 决定保留层级。

2. revert

对“已共享历史”更安全,会新增一个反向提交,不破坏原有历史链。

3. reflog

误删、误 reset、误 rebase 的恢复入口。找回 commit hash 后可 reset 回去。

五、团队协作常见坑

1. 直接强推覆盖他人提交

避免 push --force 盲推,优先 --force-with-lease

2. 提交粒度太粗

大而杂的提交会显著增加 code review 与回滚成本。

3. 长期不同步主干

功能分支与主干偏差过大,最终一次性冲突成本会陡增。

六、三档口述模板(背诵版)

1. 30 秒版本

Git 我重点掌握的是分支协作和历史治理。团队协作里我优先用 merge 保证稳定性,在个人分支会用 rebase 整理线性历史。发生误操作时,我一般先看 reflog 定位可恢复点,再选择 resetrevert,确保既能恢复代码也不破坏团队历史。

2. 2 分钟版本

我一般把 Git 分成三块来回答。第一是协作:功能分支开发、PR 合并、冲突处理和语义化提交。第二是历史治理:个人分支用 rebase -i 清理碎提交,公共分支尽量不用重写历史。第三是故障恢复:本地整理用 reset,线上协作回退用 revert,误删误回退先用 reflog 找历史锚点。这样既保证效率,也保证多人协作安全。

3. 5 分钟版本

我会从“原理、规范、实战”三个维度讲。原理上,Git 是快照模型,理解工作区/暂存区/版本库三棵树后,很多命令本质就清楚了。规范上,我会要求提交粒度小、信息清晰、分支命名可读,并在功能分支周期性同步主干,降低冲突爆发概率。实战上,我常用 rebase -i 做历史整理、cherry-pick 做补丁迁移、revert 做安全回滚,误操作通过 reflog 恢复。面试里我会强调:工具命令不难,难的是在团队协作中做出低风险决策。

七、高频追问标准答法(Q/A)

1. Q: 什么时候必须用 revert 而不是 reset

A: 当提交已经推到远端并被他人基于其开发时,用 revert 更安全,不破坏共享历史。

2. Q: 为什么 rebase 后要 --force-with-lease

A: 因为 rebase 改写了提交哈希,需要强制更新远端;--force-with-lease 能避免误覆盖他人新提交。

3. Q: stash popstash apply 区别

A: pop 应用后会删除该 stash;apply 只应用不删除。

4. Q: 如何减少冲突

A: 缩短分支生命周期、提高同步频率、拆小提交、提前对高风险文件沟通归属。

5. Q: 你如何设计提交规范

A: 采用语义化前缀(feat/fix/refactor/docs/chore),并要求一条提交只表达一个清晰意图。

八、可以反问面试官的问题

1. 分支策略

你们目前是 Git Flow、Trunk-based,还是简化版 feature-branch?

2. 回滚机制

线上回滚主要依赖 Git 还是 CI/CD 制品回滚?

3. 规范治理

团队是否有 commit lint、分支保护、必需 review 等硬约束?

4. 冲突热点

当前冲突最高发的模块是哪些,是否有 ownership 机制做边界治理?