Git 面试题通常分为 基础操作、核心原理(最能拉开差距)和 工作流冲突解决。作为一名资深 Java 开发,面试官往往会通过 Git 考察你的团队协作能力和对版本控制的深度理解。
1. 核心原理:Git 的底层是怎么存数据的?
面试官: “Git 和 SVN 的区别是什么?Git 是怎么存储文件的?”
-
回答重点:
-
SVN 是增量式: 只存储文件差异(Delta)。
-
Git 是快照式: Git 存储的是文件的完整快照。如果文件没变,它只存一个指向之前文件的指针。
-
三个区域: 工作区(Working Directory)、暂存区(Index/Stage)、版本库(Repository)。
-
核心对象:
blob(存文件内容)、tree(存目录结构)、commit(存提交信息)。
-
2. 常用命令:reset vs revert
面试官: “如果你提交错了代码,想撤回,用哪个?有什么区别?”
-
git reset(回退):-
直接移动
HEAD指针。 -
--soft:只回退 commit,代码还在暂存区。 -
--hard:危险! 彻底回退到某个版本,本地修改会丢失。 -
适用: 自己私有的分支,清理提交历史。
-
-
git revert(反做):-
新建一个 commit,用来抵消之前的修改。
-
适用: 公共分支(如 master/develop)。因为它不会破坏提交历史,对协作更友好。
-
3. 进阶对比:merge vs rebase
面试官: “团队协作时,你倾向于用 merge 还是 rebase?”
-
git merge:-
优点: 记录真实的提交时间线,不会改变历史。
-
缺点: 频繁合共会导致分支线图(Graph)变得像“麻花”一样乱。
-
-
git rebase(变基):-
优点: 让提交历史变成一条直线,非常整洁。
-
缺点: 改变了历史。如果 rebase 了已经推送到远程的分支,会导致其他队友的代码冲突。
-
-
最佳实践: “在自己的本地开发分支 rebase 主干代码,保持简洁;合并回主分支时用 merge。”
4. 场景题:代码写一半,需要紧急修 Bug 怎么办?
面试官: “你正在开发功能,突然有个线上紧急 Bug 要去另一个分支修,但现在的代码还没写完不想 commit。”
-
回答: 使用
git stash。-
git stash:把当前工作区修改存入栈中。 -
切换分支修 Bug,提交,合回。
-
git checkout dev回到原分支。 -
git stash pop:取出之前的代码继续干活。
-
5. 灾难恢复:删掉的 commit 还能找回来吗?
面试官: “我不小心执行了 git reset --hard,还没 push,代码是不是彻底没了?”
-
回答: 不一定,只要本地
objects还没被 GC 回收,可以用git reflog。-
reflog记录了你在本地所有的操作记录(包括切换分支、reset 等)。 -
找到丢失 commit 的哈希值,再执行
git reset --hard <hash>即可找回。
-
6. 连环炮:什么是“冲突”?怎么解决?
-
原因: 两个提交修改了同一个文件的同一行。
-
解决: 1. Git 会在文件里标注
<<<< HEAD和>>>> hash。2. 手动决定保留哪份代码(或者两份都留)。
3.
git add标记冲突已解决。4.
git commit完成合并。
给你的面试小贴士:
如果你面试的是 Senior Java 岗位,面试官可能还会顺带问一句 Git Flow(如 Master, Develop, Feature, Hotfix 分支管理规范)。建议结合你前年做项目时的团队规范讲,会显得你非常有实战经验。
你现在的团队是用简单的 main/dev 模式,还是完整的 Git Flow?