Git问题:提交属目标分支但未显示在对应文件历史中
咱们先来拆解你碰到的这个有点反直觉的情况:
你通过git branch --contains 868cd84a941确认了提交868cd84a941确实属于2018_06分支,但切换到这个分支后,用git log --graph --oneline --decorate -- src/web/thirdParty/jquery/jquery.js查看文件历史时,却完全看不到这个提交的痕迹,只有一条引入该文件的初始提交a7ef0eab25f。
核心原因:你的提交被后续合并操作「悄悄覆盖」了
这种情况最常见的根源是之后有合并提交用了「丢弃目标分支更改」的策略——简单说就是,虽然你的提交还在分支的提交树里(所以--contains能查到它),但它对那个jquery文件的修改已经被后续的合并给抹掉了,自然不会出现在该文件的历史记录里。
具体来说,大概率是以下两种场景之一:
- 空合并操作:如果合并时,两个分支的jquery文件内容已经完全一致(比如之前有人手动同步过更改),Git会生成一个空的合并提交,这时候你的提交修改不会体现在文件历史中,但提交本身还是分支的祖先节点。
- 使用了
ours合并策略:有人执行了类似git merge -X ours <分支名>或者git merge --ours <分支名>的命令,这种策略会完全保留当前分支的文件内容,直接忽略被合并分支的所有更改——包括你提交868cd84a941里的修改。
验证问题的具体步骤
你可以通过以下几步确认到底是哪种情况:
1. 查看2018_06分支的完整提交链
先看看整个分支的提交关系,找到868cd84a941的位置,以及它之后的合并提交:
git log --graph --oneline --decorate 2018_06
在输出里定位到868cd84a941,看看它后面有没有带Merge标记的提交,这些就是可疑对象。
2. 排查可疑合并提交的细节
假设你找到了那个可疑的合并提交(比如哈希是abc123),执行命令查看它的合并策略和细节:
git show abc123
如果输出里出现Merge strategy: ours或者Xmerge strategy: ours,那实锤就是用了ours策略导致你的修改被覆盖了。
3. 对比提交修改与当前文件内容
直接拉出你提交里的文件版本,和当前分支的版本做对比,确认修改是否真的被覆盖:
# 导出你提交里的jquery.js版本 git show 868cd84a941:src/web/thirdParty/jquery/jquery.js > old-jquery.js # 导出当前分支的jquery.js版本 cat src/web/thirdParty/jquery/jquery.js > current-jquery.js # 对比两个文件的差异 diff old-jquery.js current-jquery.js
如果两者差异很大,就说明你提交里的修改确实被后续操作给替换掉了。
找回被覆盖的修改
如果需要恢复你提交里的修改,直接执行以下命令即可:
# 直接将提交中的文件内容覆盖当前分支的对应文件 git checkout 868cd84a941 -- src/web/thirdParty/jquery/jquery.js # 提交恢复的更改 git add src/web/thirdParty/jquery/jquery.js git commit -m "Restore changes from commit 868cd84a941 for jquery.js"
⚠️ 注意:执行前请确保当前分支的该文件没有未提交的更改,或者先手动备份一下当前文件,避免丢失现有修改。
内容的提问来源于stack exchange,提问作者Travis Bruce

