Noi*_*ich 151 git git-log git-reflog
手册页说日志显示提交日志,reflog管理reflog信息.什么是reflog信息,以及日志没有的内容?日志似乎更加详细.
ben*_*n_h 201
git log显示当前的HEAD及其祖先.也就是说,它会将提交HEAD点打印到其父级,其父级,依此类推.它通过递归查找每个提交的父级来遍历repo的祖先.
(实际上,某些提交有多个父级.要查看更具代表性的日志,请使用类似的命令git log --oneline --graph --decorate.)
git reflog根本不会穿越HEAD的祖先.reflog是HEAD指向的提交的有序列表:它是您的repo的撤消历史记录.reflog不是repo本身的一部分(它单独存储在提交本身中),并不包含在推送,提取或克隆中; 它纯粹是本地的.
除此之外:理解reflog意味着一旦提交了repo,你就无法真正丢失数据.如果您不小心重置为较旧的提交,或错误地重新绑定,或任何其他可视"删除"提交的操作,您可以使用reflog查看之前的位置并git reset --hard返回该ref以恢复以前的状态.请记住,refs不仅意味着提交,还意味着它背后的整个历史.
Von*_*onC 57
git log 显示可从refs(head,tags,remotes)访问的提交日志git reflog是随时在您的仓库中引用或引用的所有提交的记录.这就是为什么git reflog(当执行"破坏性"操作(如删除分支)时,使用默认情况下90天后修剪的本地记录),以便返回该分支引用的SHA1.
见git config:
gc.reflogexpire
gc.<pattern>.reflogexpire
Run Code Online (Sandbox Code Playgroud)
git reflogexpire删除比此时更早的reflog条目; 默认为90天.在中间
使用"<pattern>"(例如"refs/stash"),该设置仅适用于与之匹配的引用<pattern>.

git reflog经常被称为" 你的安全网 "
如果遇到问题,当git log没有显示您要查找的内容时,一般建议是:

同样,reflog是SHA1的本地录像.
相反git log:如果你将你的仓库推到上游仓库,你会看到相同的git log,但不一定相同git reflog.
小智 14
当你工作的时候,Git在后台做的事情之一是保留一个reflog - 一个记录过去几个月HEAD和分支引用的位置.
您可以使用
git reflog以下命令查看您的reflog :Run Code Online (Sandbox Code Playgroud)$ 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中删除条目或过期的条目.从官方Linux Kernel Git文档中reflog:
子命令
expire用于修剪旧的reflog条目.要从reflog中删除单个条目,请使用子命令
delete并指定确切的条目(例如git reflog delete master@{2}).
Cam*_*zie 13
我喜欢将 git log 和 reflog 之间的区别视为私人记录和公共记录之间的区别。
通过 git reflog,它可以跟踪您在本地所做的一切。你答应了吗?Reflog 会跟踪它。您进行了硬重置吗?Reflog 会跟踪它。你修改了提交吗?Reflog 会跟踪它。您在本地完成的所有操作都会在引用日志中找到一个条目。
对于日志来说,情况并非如此。如果修改提交,日志仅显示新的提交。如果您执行重置并跳回历史记录中的一些提交,则您跳过的那些提交将不会显示在日志中。当您将更改推送给其他开发人员或GitHub或类似的东西时,只会显示日志中跟踪的内容。对于另一个开发人员来说,看起来好像从未发生过重置或从未发生过修改。
是的,我喜欢“私人与公共”的类比。或者也许更好的日志与参考日志的类比是“抛光与宝石”。reflog 显示了您所有的尝试和错误。该日志仅显示您工作历史的干净且完善的版本。
看一下这张图片来强调这一点。自从存储库初始化以来,已经发生了许多修改和重置。转发日志显示了这一切。然而 log 命令看起来好像只有一次针对存储库的提交:
另外,由于 reflog 会跟踪您修改的内容并提交您重置的内容,因此它允许您返回并找到这些提交,因为它会为您提供提交 ID。假设您的存储库尚未清除旧提交,这允许您恢复日志中不再可见的项目。这就是当某人需要拿回他们认为无意中丢失的东西时,转发有时最终会挽救他们的生命。
我对此也很好奇,只想详细说明和总结一下:
git log显示您所在分支的所有提交的历史记录。签出其他分支,您将看到不同的提交历史记录。如果要查看所有分支的提交历史记录,请键入git log --all。
git reflog显示纸杯蛋糕所说的您的推荐记录。每次提交或签出时都有一个条目。尝试使用两次在两个分支之间来回切换,git checkout并git reflog在每次签出后运行。您会看到每次更新的顶部条目都是“结帐”条目。您不会在中看到这些类型的条目git log。
参考文献:http : //www.lornajane.net/posts/2014/git-log-all-branches