4.2 KiB
id, title, type, domain, stack, tags, level, related, week
| id | title | type | domain | stack | tags | level | related | week | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| devops.git.interview | Git 面试题 | interview | devops |
|
|
basic |
|
|
Git 面试题
基础
【基础】git merge 和 git rebase 有什么区别?
参考答案:merge 把两条分支的历史合并,可能产生合并提交,保留真实的并行开发历史;rebase 把当前分支的提交在目标分支最新提交之后重新应用,历史变成一条直线,但会生成新的提交哈希。公共分支不要 rebase,个人功能分支可以用 rebase 同步主干、整理提交。
【基础】git revert 和 git reset 有什么区别?
参考答案:revert 生成一个新提交来抵消指定提交的改动,不改写历史,适合撤销已推送的提交;reset 移动分支指针到指定提交,--soft 保留改动在暂存区、--mixed 保留在工作区、--hard 丢弃改动,会改写历史,只适合未推送的本地提交。
【基础】git fetch 和 git pull 的区别?
参考答案:fetch 只下载远程的最新提交,更新远程跟踪分支(如 origin/main),不改动本地分支;pull = fetch + merge(或配置为 rebase),会把远程改动合并到当前分支。习惯先 fetch 看清楚差异再决定合并方式。
【基础】你们用什么分支模型?
参考答案:按真实情况回答,并说明原因。例如 GitHub Flow:main 始终可发布,功能分支通过合并请求、CI 和评审后合并,合并后自动部署测试环境。有固定版本周期的(App、私有化交付)用 Git Flow 的 release / hotfix 分支。持续部署成熟的团队用主干开发 + 特性开关。
进阶
【进阶】误执行了 git reset --hard,提交还能找回吗?
参考答案:只要曾经提交过就能找回。git reflog 记录了 HEAD 的每次移动,找到 reset 之前的提交哈希,git reset --hard 哈希 或 git branch 新分支 哈希 恢复。删除的分支同理。但从未提交、也没有 stash 的工作区改动无法通过 reflog 找回。
【进阶】--force 和 --force-with-lease 有什么区别?
参考答案:--force 无条件用本地覆盖远程分支;--force-with-lease 只有当远程分支仍然是你上次获取时的状态才覆盖,如果别人在这期间推送了新提交就会拒绝,避免误覆盖同事的工作。改写过历史的个人分支推送时应该用后者。
【进阶】什么时候用 cherry-pick?有什么注意事项?
参考答案:需要把某个提交单独应用到另一个分支时,例如热修复同时带到 release 和 main、把某个修复回移到旧版本。注意 cherry-pick 会生成新的提交(不同哈希),如果之后两个分支合并,可能出现重复改动或冲突;大量 cherry-pick 说明分支策略可能有问题。
场景题
【场景题】有人把密钥提交到了远程仓库,怎么处理?
参考答案:第一步立即作废并轮换密钥、检查是否被滥用;然后删除文件并加入 .gitignore;视情况用 git filter-repo 清理历史并强制推送,通知所有人重新克隆,联系平台清理缓存;最后加上提交前和 CI 中的密钥扫描。清理历史不能代替轮换。详见热修复和密钥误提交场景。
【场景题】线上版本有紧急 bug,但 main 上已经有很多未发布的功能,怎么修?
参考答案:从线上版本的标签或 release 分支拉热修复分支,修复并补测试,走 CI 后合入 release 分支发布补丁版本;再把修复 cherry-pick 或合并回 main,保证下个版本包含修复。不要从 main 拉分支修复,否则会把未测试的功能带上线。
【场景题】合并时遇到大量冲突,怎么处理?
参考答案:先理解双方各自改了什么(git log、git diff 看两边的提交),逐个文件解决,不要一键全选某一方;解决后运行测试;冲突太多时可以和对方一起解决。根本上要避免长期不合并的分支:功能分支保持短小、经常同步主干。