您确实可以使用git reflog 来检查远程分支上是否缺少提交,但只有在您的远程分支中有最新副本时它才会起作用本地仓库(您的远程跟踪分支)。
您可以通过经常运行git fetch 来使本地远程跟踪分支保持最新状态。但是,如果有人推送了一个您尚未获取的提交,然后在您下次获取之前将其删除,那么您将不会知道有一个提交已被删除。只有当您拥有已更改的原始历史记录的副本时,您才会发现远程分支的历史记录已被更改,在这种情况下,Git 会告诉您存在强制更新 :
$ git fetch origin
From c:/Users/Keoki/Documents/GitHub/bare
+ 02f0d6e...5c7b77b master -> origin/master (forced update)
如果有人强行推送到您的遥控器,则在您获取或拉取时应该非常明显,因为它会显示为强制更新(正如我所指出的那样out),除非您不经常从遥控器中获取或拉取。如果你可以直接访问你的远程仓库,你也可以直接在上面查看 reflogs。
Reflog 用法
你提到,
看起来这个手册页说这个命令也可以用来从日志中删除条目,这很糟糕。
git reflog 只会在您传递以下任何额外选项(来自 official documentation)时从 reflog 中删除条目(与使用 git log 获得的日志不同):
否则,git reflog 是只读的,并且只会列出您的参考资料所在的历史记录。对于您的特定示例,您可以使用以下命令查看远程跟踪分支的 reflog 历史记录:
git reflog <remote>/<branch>
例如,
$ git reflog origin/master
5c7b77b refs/remotes/origin/master@{0}: fetch origin: forced-update
02f0d6e refs/remotes/origin/master@{0}: fetch origin: fast-forward
fc32eac refs/remotes/origin/master@{1}: pull origin master: fast-forward
b6a06e1 refs/remotes/origin/master@{5}: fetch origin: fast-forward
35a91e4 refs/remotes/origin/master@{6}: update by push
019ea3a
在上面的示例中,您将看到 origin/master 在 reflog 的最新(顶部)条目中被强制更新,表明远程分支的原始历史记录已被更改,可能表明提交已被删除(尽管重写的提交也会导致强制更新)。