执行git checkout到指定提交为何包含更早提交?如何仅获取单个提交?
问题原因解析
- 为什么执行
git checkout 10bec0c会包含提交1、2的内容:Git的每一个提交都是基于其父提交的完整代码快照,提交3本身就是在提交1、2的改动基础上生成的,所以当你执行checkout切换到提交3时,工作区会直接还原到提交3完成时的全量代码状态,自然会包含前面所有提交的变更。 - 为什么cherry-pick也出现同类问题:正常情况下
git cherry-pick只会应用指定提交和它父提交之间的差异,不会携带前置提交的内容,出现该问题通常是两种情况:- 你要操作的提交3是合并提交,未指定父节点参数时cherry-pick会拉取整个合并链的改动
- 提交3的改动本身依赖提交1、2的代码基础,单独应用到其他分支时,从文件内容层面看起来像是携带了前置提交的变更
- 冲突解决过程中误引入了前置提交的改动内容

仅获取单个提交内容的操作方案
场景1:将单个提交的改动应用到当前分支
- 普通提交直接使用标准cherry-pick命令:
git cherry-pick <提交3的哈希值>
如果该提交是合并提交,需要指定父节点序号(通常1代表合并的目标分支父节点,2代表源分支父节点):git cherry-pick -m 1 <合并提交哈希值> - 如果cherry-pick仍不符合预期,可通过补丁方式手动提取改动:
先导出单个提交的补丁文件:git format-patch -1 <提交3的哈希值>
再应用补丁到当前分支:git apply <生成的.patch文件名>
场景2:仅查看单个提交的改动内容,不需要切换代码状态
直接使用git show命令查看该提交的专属diff:git show <提交3的哈希值>
内容的提问来源于stack exchange,提问作者Alicia Y
相关产品推荐
相关产品推荐

