git reflog和log有什么区别?

手册页说日志显示提交日志,并且reflogpipe理reflog信息。 什么是reflog信息,它有什么,日志没有? 日志似乎更详细。

git log显示当前的HEAD及其祖先。 也就是说,它将打印提交HEAD点,然后它的父,其父,等等。 它通过回购的祖先遍历回来,recursion地查找每个提交的父项。

(实际上,一些提交有多个父代,要查看更具代表性的日志,请使用像git log --oneline --graph --decorate这样的命令。

git reflog根本不会遍历HEAD的血统。 reflog是HEAD指向的提交的有序列表:它是您的回购的撤消历史logging。 reflog不是回购本身的一部分(它被单独存储到提交本身),不包含在推送,提取或克隆中; 它纯粹是本地的。

除此之外:理解reflog意味着你不能从你的repo中丢失数据。 如果您意外地重置为较旧的提交或错误地重新绑定,或者任何其他可视地“移除”提交的操作,则可以使用reflog来查看以前的位置,然后将git reset --hard回到该ref以恢复先前的状态。 请记住,参考不仅意味着承诺,而且意味着它背后的整个历史。

  • git log显示了可以从refs(头部,标签,遥控器)访问的提交日志,
  • git reflog是任何时候在你的仓库中被引用的所有提交的logging

这就是为什么当你做一个“破坏性”操作(比如删除一个分支)时,为了取回那个分支引用的SHA1,使用了git reflog (默认情况下在90天后修剪的本地logging)。
请参阅git config

 gc.reflogexpire gc.<pattern>.reflogexpire 

git reflog expire删除比这个时间早的reflog条目; 默认为90天。
在中间,使用“ <pattern> ”(例如“ refs/stash ”),该设置仅适用于匹配<pattern>的ref。

安全网

git reflog经常被引用为“ 你的安全网 ”

如果遇到麻烦,一般build议,当git log不显示你要找的是:

保持冷静,使用git reflog

保持冷静

同样,reflog是SHA1的本地logging。
git log相反:如果将repo推向上游repo ,则会看到相同的git log ,但不需要相同的git reflog

以下是来自Pro Git书籍的reflog的解释 :

Git在后台工作时做的一件事就是保留一个reflog–logging过去几个月中HEAD和分支引用的位置。

你可以使用git reflog来查看你的git 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都会将这些信息存储在此临时历史logging中。 你也可以用这个数据指定更早的提交。

reflog命令也可用于删除条目或从reflog中过期的条目太旧。 从官方的Linux Kernel Git文档中获取reflog

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

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

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

  1. git log显示你所在分支的所有提交的历史logging。 签出一个不同的分支,你会看到不同的提交历史logging。 如果你想看到你提交所有分支的历史logging,inputgit log --all

  2. git reflog显示了你的引用logging,就像Cupcake说的那样。 每次提交或签出时都会有一个条目。 尝试使用git checkout在两个分支之间来回切换几次,并在每次签出后运行git reflog 。 您会看到每次更新的顶部条目都是“结帐”条目。 你在git log中看不到这些types的条目。

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