什么';git reflog和log之间的区别是什么?

什么';git reflog和log之间的区别是什么?,git,git-log,git-reflog,Git,Git Log,Git Reflog,手册页显示日志显示提交日志,reflog管理reflog信息。什么是reflog信息?它有哪些日志没有的信息?日志似乎要详细得多。以下是: 当你外出工作时,Git在后台做的一件事就是保存一个reflog——一个记录你的头和分支在过去几个月里的引用位置的日志 您可以使用git reflog查看您的reflog: $ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970.

手册页显示日志显示提交日志,reflog管理reflog信息。什么是reflog信息?它有哪些日志没有的信息?日志似乎要详细得多。

以下是:

当你外出工作时,Git在后台做的一件事就是保存一个reflog——一个记录你的头和分支在过去几个月里的引用位置的日志

您可以使用
git reflog
查看您的reflog:

$ git reflog
734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive.
1c002dd... HEAD@{2}: commit: added some blame and merge stuff
1c36188... HEAD@{3}: rebase -i (squash): updating HEAD
95df984... HEAD@{4}: commit: # This is a combination of two commits.
1c36188... HEAD@{5}: rebase -i (squash): updating HEAD
7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
每次由于任何原因更新分支提示时,Git都会在这个临时历史记录中为您存储这些信息。您还可以使用此数据指定较旧的提交

reflog
命令还可用于删除reflog中太旧的条目或使其过期。从:

子命令
expire
用于修剪较旧的reflog条目

要从reflog中删除单个条目,请使用子命令
delete
,并指定确切的条目(例如
git reflog delete master@{2}

  • 显示可从引用(头、标记、远程)访问的提交日志
  • 是回购协议中任何时候引用的所有提交的记录
这就是为什么在执行“破坏性”操作(如删除分支)时使用
git reflog
(默认情况下在90天后删除的本地记录),以便取回该分支引用的SHA1。
见:

gc.reflogexpire
gc..reflogexpire
git reflog
expire删除比此时间早的reflog条目;默认为90天。
在“<代码> <代码>”(例如“代码>引用/隐藏/代码>”中间),设置只适用于匹配<代码> <代码>的参考文献。

git reflog
通常被引用为“”

如果出现问题,当git日志没有显示您要查找的内容时,一般建议如下:

“”

同样,reflog是SHA1的本地录制。

git log
相反:如果你将回购推到一个新的位置,你将看到相同的
git log
,但不一定是相同的
git reflog
git log
显示当前的头部及其祖先。也就是说,它打印提交头指向的对象,然后是其父对象、其父对象,依此类推。它通过递归查找每个提交的父项,遍历回购协议的祖先

(在实践中,一些提交有多个父级。要查看更具代表性的日志,请使用类似于
git log--oneline--graph--decoration
的命令)

git reflog
根本不会遍历HEAD的祖先。reflog是HEAD指向的提交的有序列表:它是repo的撤销历史记录。reflog不是repo本身的一部分(它单独存储到提交本身),也不包括在推送、获取或克隆中;这纯粹是本地的


旁白:理解reflog意味着一旦回购协议被提交,您就不能真正丢失数据。如果您意外地重置为较旧的提交,或错误地重新设置基址,或任何其他可视地“删除”提交的操作,您可以使用reflog查看之前的位置,并使用git reset--hard返回到该ref以恢复以前的状态。请记住,REF不仅意味着提交,还意味着它背后的整个历史。

我对此也很好奇,只想详细阐述和总结一下:


  • git log
    显示您所在分支的所有提交的历史记录。签出不同的分支,您将看到不同的提交历史记录。如果要查看提交所有分支的历史记录,请键入
    git log--all

  • git reflog
    如Cupcake所说,显示您的参考记录。每次提交或签出时都有一个条目。尝试使用
    git checkout
    在两个分支之间来回切换几次,并在每次签出后运行
    git reflog
    。您将看到顶部条目每次都作为“签出”条目更新。在
    git日志
    中看不到这些类型的条目

  • 参考资料:

    实际上,reflog是

     git log -g --abbrev-commit --pretty=oneline
    

    所以答案应该是:这是一个特定的情况。

    我喜欢将git日志和reflog之间的区别看作是私有记录和公共记录之间的区别

    私人与公共 通过git reflog,它可以跟踪您在本地所做的一切。你犯了什么罪?Reflog跟踪它。你做了硬复位吗?Reflog跟踪它。是吗?Reflog跟踪它。您在本地完成的所有操作,在reflog中都有一个条目

    对于日志来说,这不是真的。如果修改提交,日志仅显示新提交。如果执行重置并在历史记录中向后跳过一些提交,则跳过的那些提交将不会显示在日志中。当您将更改推送到其他开发人员或类似人员时,只会显示日志中跟踪的内容。对于另一个开发人员来说,它看起来像从未发生过重置或修正

    原木磨光了。这辆自行车是用宝石制成的。 所以,是的,我喜欢“私人对公共”的比喻。或者更好的类比是“抛光vs宝石”。reflog显示了你所有的尝试和错误。日志只是显示了你的工作历史的一个干净而完美的版本

    请看这张图片以强调这一点。自存储库初始化以来,发生了多次修改和重置。reflog显示了所有这些。然而,log命令使它看起来好像只有一次针对回购的提交:

    回到“安全网”概念上来 此外,由于reflog跟踪您修改和提交的内容,因此它允许您返回并查找这些提交,因为它将为您提供提交ID。假设您的存储库尚未清除旧提交,则允许
     git log -g --abbrev-commit --pretty=oneline