我问这个问题的原因是我怀疑有时我工作的地方有时提交似乎只是无缘无故地从远程分支“消失”。我在这里的另一篇文章中看到,确实可以使用:
git push origin HEAD --force
我确实讨厌感觉偏执,但如果我能检查一下,我会放心。我在某处读到了一个命令:
git reflog
看起来这个手册页说这个命令也可以用来从日志中删除条目,这很糟糕。无论如何我可以检查一下并放松心情吗?
我问这个问题的原因是我怀疑有时我工作的地方有时提交似乎只是无缘无故地从远程分支“消失”。我在这里的另一篇文章中看到,确实可以使用:
git push origin HEAD --force
我确实讨厌感觉偏执,但如果我能检查一下,我会放心。我在某处读到了一个命令:
git reflog
看起来这个手册页说这个命令也可以用来从日志中删除条目,这很糟糕。无论如何我可以检查一下并放松心情吗?
您确实可以使用它git reflog
来检查远程分支上是否缺少提交,但只有当您在本地存储库(您的远程跟踪分支)中有该远程分支的最新副本时它才会起作用。
您可以通过经常运行git fetch
. 但是,如果有人推送了一个您尚未获取的提交,然后在您下次获取之前将其删除,那么您将不会知道有一个提交已被删除。如果您拥有已更改的原始历史记录的副本,您只会发现远程分支的历史记录已更改,在这种情况下,Git 会告诉您已强制更新:
$ git fetch origin
From c:/Users/Keoki/Documents/GitHub/bare
+ 02f0d6e...5c7b77b master -> origin/master (forced update)
如果有人强行推送到您的遥控器,则在您获取或拉取时应该很明显,因为它将显示为强制更新(正如我已经指出的那样),除非您不获取或经常从你的遥控器上拉。如果您可以直接访问远程仓库,您也可以直接在其上检查 reflogs。
你提到,
看起来这个手册页说这个命令也可以用来从日志中删除条目,这很糟糕。
git reflog
git log
如果您传递以下任何额外选项(来自官方文档) ,则只会从 reflog 中删除条目(与您获得的日志不同):
--expire=<time>
--expire-unreachable=<time>
--all
否则,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 的最新(顶部)条目中看到被强制更新,表明远程分支的原始历史记录已被更改,可能表明已删除提交(尽管已重写提交也会导致强制更新)。
有多种方法可以有效地删除或更改 Git 日志,包括(来自 Git 的文档):amend
、rebase
、squash
和filter-branch
. 浏览选项:
http://git-scm.com/book/en/Git-Tools-Rewriting-History
关于reflog
(来自The Linux Kernel Archives)的功能:
https://www.kernel.org/pub/software/scm/git/docs/git-reflog.html
Reflog 是一种记录分支尖端何时更新的机制。该命令用于管理其中记录的信息。
reflog 在各种 git 命令中很有用,用于指定引用的旧值。例如,HEAD@{2} 表示“HEAD 曾经是两步前的位置”,master@{one.week.ago} 表示“master 曾经指向一周前的位置”,等等。有关详细信息,请参阅 gitrevisions(7)。
基本上,Git 保留两个日志:一个是我们都知道的,另一个是 reflog,后者仅存在于您的本地 repo 中。Git 会在 HEAD 移动时更新 reflog(由于新提交、签出分支或重置)。在硬重置后恢复提交时通常会访问它。
要查看 reflog,请输入:
git reflog
要查看更详细的信息,请输入:
git log --walk-reflogs
至于你的问题,我想你可以运行git log
and git reflog
(或git log
and git log --walk-reflogs
)并比较结果(记住reflog
只记录本地操作)。