执行git pull后提交26337128不再出现在日志中的原因
问题:Git拉取后旧提交从日志消失但仍可查看的原因
昨日克隆了一个托管在GitLab实例上的Git仓库,当时HEAD指向提交26337128。今日执行git pull后,该提交不再出现在日志中(git log | grep 26337128和git branch -a --contains 26337128均无输出),这是为什么?
补充说明:通过git show 26337128仍可查看该提交(GitLab网页界面也能看到),未进行任何本地修改,且仍处于默认分支。
编辑补充的git reflog --all输出:
8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) refs/heads/drm-tip@{0}: pull (finish): refs/heads/drm-tip onto 8d0f83b389ec64b9f7f9b2ee241fc352346868f1 8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) HEAD@{0}: pull (finish): returning to refs/heads/drm-tip 8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) HEAD@{1}: pull (start): checkout 8d0f83b389ec64b9f7f9b2ee241fc352346868f1 8d0f83b389ec (HEAD -> drm-tip, origin/drm-tip, origin/HEAD) refs/remotes/origin/drm-tip@{0}: pull: forced-update 26337128da9b refs/heads/drm-tip@{1}: clone: from https://gitlab.freedesktop.org/drm/tip 26337128da9b refs/remotes/origin/HEAD@{0}: clone: from https://gitlab.freedesktop.org/drm/tip 26337128da9b HEAD@{2}: clone: from https://gitlab.freedesktop.org/drm/tip
原因分析
- 核心原因是远程分支发生了强制推送(force push),本地拉取时触发了强制更新(对应reflog中的
pull: forced-update记录)。 - 你克隆时的提交
26337128原本属于远程默认分支的提交链,但远程仓库的该分支被强制推送覆盖后,新的提交链不再包含26337128,因此git log无法遍历到它,git branch -a --contains也找不到包含该提交的分支。 git show能查看该提交,是因为该提交的对象仍保存在本地Git数据库中(Git默认会保留未被引用的对象至少30天,不会立即删除);GitLab网页能看到则是因为远程仓库可能通过reflog或未清理的对象保留了该提交的记录。- 从reflog可以明确看到,拉取完成后,本地分支
drm-tip和远程跟踪分支origin/drm-tip都切换到了新提交8d0f83b389ec,旧提交26337128仅存在于拉取前的分支引用历史(refs/heads/drm-tip@{1})中。
内容的提问来源于stack exchange,提问作者vinc17
相关产品推荐
相关产品推荐

