【问题标题】:Is it possible to see if a commit has been deleted from a remote branch?是否可以查看提交是否已从远程分支中删除?
【发布时间】:2014-08-23 23:38:14
【问题描述】:

我问这个问题的原因是我怀疑有时我工作的地方有时提交似乎只是无缘无故地从远程分支“消失”。我在这里的另一篇文章中看到确实可以使用:

git push origin HEAD --force

我确实讨厌偏执,但如果我能检查一下,我会放心。我在某处读到了一个命令:

git reflog

看起来这个手册页说这个命令也可以用来从日志中删除条目,这很糟糕。无论如何我可以检查一下并放松心情吗?

【问题讨论】:

    标签: git git-reflog


    【解决方案1】:

    您确实可以使用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 获得的日志不同):

    • --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 fetch 时从未关注过它的输出,或者我自己可能已经想到了这一点。哈哈。但再次非常感谢您。
    【解决方案2】:

    有多种方法可以有效地删除或更改 Git 日志,包括(来自 Git 的文档):amendrebasesquashfilter-branch。浏览选项:

    http://git-scm.com/book/en/Git-Tools-Rewriting-History

    关于reflog 的功能(来自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(由于新的提交, 检查分支或重置)。在硬重置后恢复提交时通常会访问它。

    要查看引用日志,请输入:

    git reflog
    

    要查看更详细的信息,请输入:

    git log --walk-reflogs
    

    至于您的问题,我想您可以运行git loggit reflog(或git loggit log --walk-reflogs)并比较结果(记住reflog 只记录本地操作)。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2014-09-16
      • 2023-01-12
      • 2016-05-30
      • 1970-01-01
      • 2023-03-11
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多