为什么说 Git 分支只是一个指向提交的轻量指针,创建分支时实际写入了什么
围绕“为什么说 Git 分支只是一个指向提交的轻量指针,创建分支时实际写入了什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答分支即 .git/refs 下 41 字节文件的实现。
程序员面试题库第 37 页,收录第 1801–1850 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“为什么说 Git 分支只是一个指向提交的轻量指针,创建分支时实际写入了什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答分支即 .git/refs 下 41 字节文件的实现。
围绕“git cherry-pick 适用于什么场景,挑选的提交在新分支上为什么是不同的对象”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明按补丁重放生成新哈希的机制与适用边界,不讲批量挑拣与冲突。
围绕“同一提交被 cherry-pick 到多个分支后,再合并这些分支会发生什么,如何避免重复冲突”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖分析同一补丁多份拷贝导致重复冲突的原因及 cherry / patch-id 层面的判断,不讲 rerere 机制细节。
围绕“为什么直接 cherry-pick 一个 merge commit 会失败,-m 1 表示什么、何时应该改用 rev”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释挑拣合并提交需指定主线父提交的原因及适用性判断,不讲 revert merge 的反向问题。
围绕“git cherry-pick 如何一次挑拣一个提交区间,区间左端点开闭有什么讲究、中途冲突如何处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清 A..B 与 A^..B 的差异及 --continue/--abort 流程。
围绕“git commit --amend 修改了最近一次提交的什么,为什么已推送的提交不应再 amend”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 amend 生成新哈希替换旧提交及改写已共享历史的后果。
围绕“Git 合并冲突标记 <<<<<<< 各段含义是什么,标准的冲突解决与验证流程是怎样的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖给出从 status 定位、编辑冲突块到 add 完成合并的完整步骤,不讲 rerere 复用方案。
围绕“删除本地分支和远程分支分别用什么命令,分支被删后提交对象会立刻消失吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分 -d/-D 与 push --delete 的作用对象及可达性与 gc 的关系,不讲 reflog 找回流程。
围绕“为什么改写历史后推送推荐 git push --force-with-lease 而不是 --force,它检测了什”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 lease 基于远程引用预期值的保护机制及其失效场景(如后台 fetch 后),不讲 rebase 改历史本身。
围绕“Git 的 blob、tree、commit 三种对象各记录什么内容,它们如何组成一次提交”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖画出三类对象的引用关系与内容哈希寻址方式。
围绕“.gitignore 中目录通配、取反规则和多级 ignore 文件的匹配优先级是怎样的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答模式匹配规则与 ! 取反失效的常见坑(父目录被排除)。
本文解释 HEAD 的本质,说明 detached HEAD 状态下提交为何会变成悬空提交,以及如何通过 reflog 查找哈希并创建分支来恢复提交。包括机制、具体场景和操作边界。
围绕“如何用 git log 的 -S、-G、--follow 等选项追踪某段代码何时被引入、移动或删除”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分 pickaxe -S 与正则 -G 的搜索语义及跨重命名追踪,不讲 log 格式化输出。
围绕“三方合并中的 merge base 是什么,找不到共同祖先时 Git 如何处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 merge base 的定位作用及 unrelated histories 报错的原因与 --allow-unrelated-hi。
围绕“Git 合并时什么条件下发生 fast-forward,与三方合并产生的 merge commit 有何本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断何时 FF、何时生成合并提交及 --no-ff 的取舍,不讲冲突处理。
围绕“Git 的 ort 与旧的 recursive 合并策略有什么区别,什么时候需要指定 -X 选项调整合并行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Git 2.34 默认 ort 策略的改进及 -X ignore-space-change 等常见选项的适用场景,不讲 sub。
围绕“合并冲突时 ours 和 theirs 分别指哪一方,rebase 中为什么会反过来”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖厘清合并与变基场景下 ours/theirs 指向的差异及由此导致的误用风险,不讲冲突工具配置。
围绕“Git 的 packfile 和 delta 压缩在什么时候触发,为什么松散对象多的仓库会变慢”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释松散对象打包机制与 gc/repack 的触发时机。
围绕“git pull 默认行为是什么,配置 pull.rebase 或 --rebase 后拉取流程有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖拆解 pull=fetch+merge/rebase 的两种路径及分叉历史下的选择,不讲 fetch 的 refspec 细节。
围绕“git push 提示 non-fast-forward 被拒绝时说明远程发生了什么,pull --rebase 与”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖给出诊断远程有新提交的判断与两条恢复路径的取舍,不讲强制推送的风险细节。
围绕“git rebase -i 中 pick、squash、fixup、reword 各做什么,如何用它们整理提交历史”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕演示交互式变基压缩与改写提交的操作及 squash 与 fixup 在提交信息上的差异,不讲 rebase 冲突处理。
围绕“git rebase 实际做了什么,变基后原提交还在吗、哈希为什么全变了”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 rebase 重放提交生成新对象的过程及旧提交的可达性,不讲交互式 rebase 命令清单。
围绕“git rebase --onto 能解决什么问题,如何把基于错误分支开发的提交移植到正确基线”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕用典型三段参数场景讲解提交区间移植,不讲普通 rebase 的基础用法。
围绕“团队协作中什么时候用 rebase、什么时候用 merge,为什么公共分支禁止变基”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖给出基于历史共享状态的决策标准。
围绕“origin/main 这种远程跟踪分支是什么,为什么本地不能直接在上面提交”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明远程跟踪引用的只读镜像性质及 fetch 更新的时机,不讲 push 的配置。
围绕“git rerere 如何记录并复用冲突解决方案,长期特性分支反复合并时为什么有用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 rerere 的记录-重放机制与开启方式,不讲与 merge 命令本身的交互细节。
围绕“git reset 的 --soft、--mixed、--hard 三种模式分别移动了哪几棵树,各自适合什么撤销场景”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖对照三棵树说明三种模式对 HEAD、暂存区、工作区的影响,不讲 reset 与 revert 的取舍。
围绕“工作区和暂存区的未提交修改分别如何丢弃,git restore 的 --staged 与 --worktree 如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分取消暂存与丢弃工作区改动两类操作及不可恢复风险,不讲 checkout 旧写法。
围绕“git revert 一个 merge commit 为什么要加 -m 参数,之后想把该分支再合回来会遇到什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释 -m 指定父提交的作用及反向合并后再次合并时变化丢失的坑与恢复办法,不讲普通 revert。
围绕“Git 用快照而非差异存储版本,这对切换分支和查看历史有什么实际影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答快照模型与 delta 存储的区别及对检出速度的影响,不讲 packfile 压缩细节。
围绕“如何只暂存一个文件中的部分修改,git add -p 的交互选项各自做什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清逐块暂存的交互操作及拆分 hunk 的场景,不覆盖 checkout -p 等其他 -p 变体。
围绕“git stash 保存的是什么,如何只暂存部分文件、应用后保留暂存区状态或恢复时被删除的 stash”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕覆盖 stash 的对象存储形态、apply 与 pop 差异及误删后的 fsck 找回,不讲 stash 与分支切换的常规。
本文解释 Git 工作区、暂存区、仓库各自存放什么,以及文件在三个区域间的流转命令和边界条件,强调 index 是暂存区核心,并给出具体场景。
围绕“为什么特性分支应该保持短小,长期不合并的分支会带来哪些具体的合并与维护问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖从冲突累积、语义漂移与集成成本论证短分支实践。
围绕“git push 时设置 -u / --set-upstream 建立了什么关系,之后 pull 和 status ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖解释分支与上游引用的绑定及由此带来的默认推拉目标与 ahead/behind 提示,不讲远程跟踪分支概念本身。
本题解释 Git 分布式模型相对 SVN 等集中式 VCS 在离线提交、完整历史副本、单点故障恢复上的具体优势,并给出工程场景和适用边界。
围绕“Git Flow 与 trunk-based development 的分支模型有何差异,团队选型时应考虑哪些发布与”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖从发布节奏、分支寿命与合并成本对比两种模型,不讲具体命令操作。
围绕“git worktree 解决了什么痛点,同一仓库检出多个分支到不同目录时有哪些限制”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明附加工作树共享对象库的机制及同一分支不能被两处检出的限制,不讲 stash 临时切换的替代。
围绕“Go 的 sync/atomic 操作和互斥锁在保护简单计数器时怎么选,原子操作能保证什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明单个数值的增减读用 atomic 更轻量、涉及多个变量的一致性必须加锁。
围绕“Go 的带缓冲 channel 缓冲满了和空了分别会怎样,缓冲大小如何影响并发行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明满则发送阻塞、空则接收阻塞、缓冲量决定解耦程度但不改变最终同步语义。
围绕“Go 中函数参数把 channel 声明为只读或只写有什么作用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明方向性 channel 类型在编译期限制误用、表达生产者消费者契约。
围绕“Go 中关闭 channel 的正确姿势是什么,哪些操作会 panic”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖明确向已关闭 channel 发送或重复关闭会 panic、接收方用 v, ok 判关闭、应由发送方关闭。
围绕“Go 的 context.WithCancel 和 WithTimeout 的取消信号如何在调用链中传播”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明父 context 取消级联到所有子 context、子监听 Done 退出、必须调用 cancel 释放资源。
围绕“为什么 Go 官方建议不要把 context 存进结构体字段,而要做函数第一个参数”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 context 生命周期跟随单次请求而非对象、存字段会造成取消语义混乱,net/http Handler 等例外从 Reque。
围绕“Go 中用 defer 关闭文件、连接等资源时,多个 defer 的执行顺序和错误处理要注意什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 defer 后进先出执行、关闭错误不应被静默吞掉可通过命名返回值记录。
围绕“Go 的 defer 参数何时求值,defer 在循环里累积会有什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 defer 注册时即求值参数、循环中延迟到函数返回才执行导致资源堆积。
围绕“Go 的空接口 interface{}(any)能存任何值,滥用它有什么代价”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断 any 牺牲编译期类型检查、需要运行时断言,适合打印等通用场景但不适合业务 API。
围绕“Go 中什么时候返回 error、什么时候 panic,recover 应该用在哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕划定可预期失败走 error、不可恢复的程序错误才 panic、recover 限于 goroutine 边界兜底。
围绕“Go 的 fmt.Errorf %w 包装错误和 errors.Unwrap、Is、As 如何配合工作”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要讲清清包装链上 Is 按值比较、As 按类型提取的区别与用法。
围绕“Go 中 runtime.Goexit 和 return 结束 goroutine 有什么区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Goexit 终止当前 goroutine 但仍执行已注册 defer、不影响其他 goroutine,主 goroutine。