git reflog和log有什么区别?

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不仅意味着提交,还意味着它背后的整个历史.

  • 需要注意的是:您有时会丢失数据,因为reflog条目不会永久存在 - 它们会在某些条件下被清除.请参阅[此答案](http://stackoverflow.com/a/26451688/1614641)和[git-reflog](https://www.git-scm.com/docs/git-reflog)和[ GIT-GC(https://www.git-scm.com/docs/git-gc).一般来说,如果破坏性操作不超过2周,那么你很可能是安全的. (22认同)

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没有显示您要查找的内容时,一般建议是:

" 保持冷静并使用git reflog "

保持冷静

同样,reflog是SHA1的本地录像.
相反git log:如果你将你的仓库推到上游仓库,你会看到相同的git log,但不一定相同git reflog.


小智 14

以下是Pro Git书中解释reflog:

当你工作的时候,Git在后台做的事情之一是保留一个reflog - 一个记录过去几个月HEAD和分支引用的位置.

您可以使用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
Run Code Online (Sandbox Code Playgroud)

每次因任何原因更新分支提示时,Git会在此临时历史记录中为您存储该信息.您也可以使用此数据指定较旧的提交.

reflog命令还可用于从reflog中删除条目或过期的条目.从官方Linux Kernel Git文档中reflog:

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

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

  • Git log是你的***提交***的记录.正如Pro Git书所述,reflog是你的***引用***(基本上是你的分支指针和你的`HEAD`指针)的记录,以及它们指向的提交.那有意义吗?在旁注中,`log`也可以显示reflog信息,但你必须传递一个特殊的选项标志作为参数,`--walk-reflogs`. (2认同)
  • 另外,由于您是Git初学者,因此我强烈建议您阅读Pro Git书,这是我学习有关Git的大部分知识的方式。我建议第1-3和6-6.5章。我也强烈建议您学习如何以交互方式和非交互方式进行基础调整。 (2认同)

Cam*_*zie 13

我喜欢将 git log 和 reflog 之间的区别视为私人记录和公共记录之间的区别。

私人与公共

通过 git reflog,它可以跟踪您在本地所做的一切。你答应了吗?Reflog 会跟踪它。您进行了硬重置吗?Reflog 会跟踪它。你修改了提交吗?Reflog 会跟踪它。您在本地完成的所有操作都会在引用日志中找到一个条目。

对于日志来说,情况并非如此。如果修改提交,日志仅显示新的提交。如果您执行重置并跳回历史记录中的一些提交,则您跳过的那些提交将不会显示在日志中。当您将更改推送给其他开发人员或GitHub或类似的东西时,只会显示日志中跟踪的内容。对于另一个开发人员来说,看起来好像从未发生过重置或从未发生过修改。

原木已抛光。reflog 是宝石般的。

是的,我喜欢“私人与公共”的类比。或者也许更好的日志与参考日志的类比是“抛光与宝石”。reflog 显示了您所有的尝试和错误。该日志仅显示您工作历史的干净且完善的版本。

看一下这张图片来强调这一点。自从存储库初始化以来,已经发生了许多修改和重置。转发日志显示了这一切。然而 log 命令看起来好像只有一次针对存储库的提交:

原木已抛光。 Reflog 是宝石。

回到“安全网”的想法

另外,由于 reflog 会跟踪您修改的内容并提交您重置的内容,因此它允许您返回并找到这些提交,因为它会为您提供提交 ID。假设您的存储库尚未清除旧提交,这允许您恢复日志中不再可见的项目。这就是当某人需要拿回他们认为无意中丢失的东西时,转发有时最终会挽救他们的生命。

  • 我发现这个答案最容易理解!谢谢。 (2认同)

mit*_*tch 5

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

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

  2. git reflog显示纸杯蛋糕所说的您的推荐记录。每次提交或签出时都有一个条目。尝试使用两次在两个分支之间来回切换,git checkoutgit reflog在每次签出后运行。您会看到每次更新的顶部条目都是“结帐”条目。您不会在中看到这些类型的条目git log

参考文献:http : //www.lornajane.net/posts/2014/git-log-all-branches