2013-07-25 110 views

回答

119

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

(在实践中,一些提交有多个父。要看到一个更有代表性日志,请使用如下命令git log --oneline --graph --decorate。)

git reflog不经过HEAD的祖先都没有。 reflog是HEAD指出的提交的有序列表:它是您的回购的撤消历史记录。 reflog不是repo本身的一部分(它被单独存储到提交本身),并且不包含在推送,提取或克隆中;它纯粹是本地的。

另外:理解reflog意味着你不能从你的repo数据中丢失数据,一旦它被提交。如果您不小心重置为较旧的提交或错误地重新绑定,或者任何其他视觉上“移除”提交的操作,则可以使用reflog查看之前的位置,然后再返回该引用以恢复先前的状态。记住,参考文献不仅意味着承诺,还包括其背后的整个历史。

+11

谨慎的说法:您有时会丢失数据,因为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周,那么你很可能是安全的。 – mcmlxxxvi

+0

@mcmlxxxvi我有两个本地文件夹相同的回购,我可以合并两个文件夹reflogs? – Tmx

7

这里的explanation of reflog from the Pro Git book

的事情之一的Git确实在后台,当你在外打工的就是保持一个引用日志 - 日志在哪里你的头和分支引用已经在过去的几个月。

您可以通过使用git reflog看到你引用日志:

$ git reflog 
734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated 
d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 
1c002dd... [email protected]{2}: commit: added some blame and merge stuff 
1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 
95df984... [email protected]{4}: commit: # This is a combination of two commits. 
1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 
7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD 

每次你的分支顶端以任何理由更新时,Git的商店,在这个临时历史记录您的信息。你也可以用这些数据指定较早的提交。

reflog命令也可用于删除条目或从reflog中过期的条目过旧。来自official Linux Kernel Git documentation for reflog

子命令expire用于修剪较旧的引用日志条目。

要从引用日志中删除单个条目,请使用子命令delete并指定确切条目(例如git reflog delete [email protected]{2})。

+0

但不将'混帐log'为您提供相同的信息?很抱歉,如果看起来很明显,我对GIT很陌生,想在我的第一个OMG之前获得一些基础知识。 – Noich

+2

Git日志是您***提交***的记录。正如Pro Git书所述,reflog是您的***引用***(基本上,您的分支指针和您的“HEAD”指针)的记录,以及它们指向的提交记录。那有意义吗?在附注中,'log'也可以显示reflog信息,但是必须传递一个特殊选项标志作为参数,'--walk-reflogs'。 – 2013-07-25 13:23:06

+1

另外,既然您是Git初学者,我强烈建议您阅读Pro Git书籍,这是我从Git学到的大部分知识。我建议第1-3和6-6.5章。我还强烈建议您学习如何以交互方式和非交互方式进行rebase。 – 2013-07-25 13:25:10

32
  • git log显示提交日志从裁判(头,标签,遥控器)访问
  • git reflog记录是在任何时间在你的回购中引用的所有提交的

这就是为什么当你做一个“破坏性”的操作(如删除一个分支)git reflog(一本地这是后缺省的90天清理记录)时,为了找回SHA1是被该分支引用。
git config

gc.reflogexpire 
gc.<pattern>.reflogexpire 

git reflog到期删除比这个时间早引用日志条目;默认为90天。
在中间,“<pattern>”(例如“refs/stash”)的设置仅适用于匹配<pattern>的参考。

safety net

git reflog经常引用为 “your safety net

在故障情况下,一般建议,当git的日志不告诉你,你在找什么,就是:

Keep calm and use git reflog

keep calm

同样,reflog是您的SHA1的本地录制。
git log相反:如果您将库存回推到upstream repo,您将看到相同的git log,但不一定相同git reflog

1

我很好奇这也只是想阐述和总结了一下:

  1. git log显示所有你提交你所在分支的历史。签出一个不同的分支,你会看到不同的提交历史记录。如果您想看到您为所有分支提交历史记录,请键入git log --all

  2. git reflog显示您的参考记录,如Cupcake说的。每次进行提交或检出时都会有一个条目。尝试使用git checkout几次在两个分支之间来回切换,并在每次结账后运行git reflog。您会看到每次更新的顶级条目都是“结帐”条目。您在git log中看不到这些类型的条目。

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

相关问题