1. Git 面试题深度解析:从基础操作到高阶技巧
作为分布式版本控制系统的行业标准,Git 在技术面试中的考察频率居高不下。最近帮团队面试了几位候选人,发现很多开发者对git pull、rebase、squash这些基础操作的理解仍停留在表面。今天我就结合 7 年团队协作经验,拆解这些高频面试题背后的核心逻辑和实战场景。
2. 基础操作:pull vs fetch 的生死抉择
2.1 git pull 的双重身份
执行git pull时实际发生了两件事:
git fetch下载远程最新提交git merge将远程分支合并到当前分支
典型问题:"为什么我的 pull 操作总会产生 merge commit?" 答案就在这个默认行为里。在团队协作中,这可能导致提交历史出现大量无意义的合并节点。
关键技巧:使用
git pull --rebase可以避免自动生成 merge commit,保持线性历史
2.2 fetch 的侦察兵作用
与 pull 不同,git fetch只执行数据下载不自动合并。这就像先派侦察兵了解敌情再决定作战方案。实际开发中建议:
- 频繁使用 fetch 监控远程变化
- 明确需要合并时再手动执行 merge/rebase
- 配合
git log origin/main..main查看本地与远程差异
3. 合并策略:merge 与 rebase 的哲学之争
3.1 merge 的保守主义
标准的三方合并会产生新的合并节点,保留完整历史轨迹。适合:
- 公共分支(如 main/dev)的集成
- 需要明确记录合并时间的场景
- 跨团队协作时保持历史可追溯性
# 典型merge操作 git checkout feature git merge main # 将main分支合并到feature3.2 rebase 的激进美学
通过变基重写提交历史,创造完美的线性提交链。注意:
- 绝对不要在公共分支上 rebase
- 适合本地特性分支同步主分支更新
- 会产生新的 commit hash 可能影响协作
# rebase标准流程 git checkout feature git rebase main # 将feature分支变基到main血泪教训:曾经有同事在共享分支执行 rebase,导致全团队需要 reset --hard。记住黄金法则——只对本地未推送的提交做 rebase。
4. 高阶技巧:squash 与 cherry-pick 的精准手术
4.1 squash 的提交美容
将多个琐碎提交压缩为单个有意义的提交:
# 交互式rebase压缩提交 git rebase -i HEAD~3 # 合并最近3个提交在 PR/MR 工作流中特别有用,可以:
- 清理 "fix typo" 之类的琐碎提交
- 保持主分支历史清晰
- 配合 GitHub/GitLab 的 squash merge 功能使用
4.2 cherry-pick 的移植术
精准复制特定提交到当前分支:
git cherry-pick abc123 # 应用指定commit典型使用场景:
- 将热修复提交应用到多个发布分支
- 从错误分支抢救特定修改
- 避免全量合并带来的不必要变更
5. 面试高频问题实战解析
5.1 冲突解决全流程
当合并/变基出现冲突时:
- 暂停操作(merge/rebase 会提示冲突)
- 使用
git status查看冲突文件 - 手动编辑文件解决冲突(搜索
<<<<<<<标记) git add标记已解决文件- 继续操作(
git rebase --continue或直接提交)
5.2 后悔药大全
- 撤销未提交的修改:
git checkout -- <file> - 重置暂存区:
git reset HEAD <file> - 回退到某个提交:
git reset --hard abc123 - 恢复误删分支:
git reflog配合git checkout -b <branch> <hash>
6. 企业级 Git 工作流建议
6.1 分支管理策略
- 功能开发:feature/前缀 + JIRA 编号(如 feature/PROJ-123)
- 热修复:hotfix/ 前缀 + 问题描述
- 发布分支:release/ 版本号
- 主分支保护:设置 Code Owner 和 PR 审核
6.2 提交信息规范
采用语义化提交格式:
feat: 添加用户登录功能 fix: 修复密码强度校验漏洞 chore: 更新依赖包版本 docs: 补充API接口文档7. 进阶工具链推荐
7.1 可视化工具
- GitLens(VSCode 插件):查看代码作者和修改历史
- Sourcetree:图形化操作复杂流程
- tig:终端下的交互式浏览工具
7.2 配置优化
[alias] lol = log --graph --decorate --oneline st = status -sb cm = commit -m [core] autocrlf = input # 跨平台换行符处理在面试中遇到 Git 问题时,建议先明确面试官想考察的维度:是基础操作熟练度?对分布式原理的理解?还是团队协作经验?根据不同的侧重点组织答案,比死记硬背命令更有效果。