带时间的reflog

每个引用日志条目都有一个添加的时间戳。
它们可以用作限定符,这是 Git 引用指针语法的标记。
这允许按时间过滤 Git reflog。
以下是时间限定符的一些示例:

  • 1.minute.ago
  • 1.hour.ago
  • 1.day.ago
  • yesterday
  • 1.week.ago
  • 1.month.ago
  • 1.year.ago
  • 2011-05-17.09:00:00

我们还可以组合使用时间限定符(例如 1.week.3.hours.ago)和复数形式(例如 5.hours.ago)。
时间限定符的引用可以提供给其他 git 命令,如下所示:

git diff master@{0} master@{1.week.ago}

其中我们将有一个当前 master 分支与 1 周前的 master 分支的差异。

git恢复丢失的提交

实际上,即使在历史重写操作期间,Git 中的提交也永远不会丢失。
让我们看一个 git log --pretty=oneline 的例子,它看起来像这样:

2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commit

现在假设我们向这个存储库提交一些新的更改并运行以下命令:

#make changes to HEAD
git commit -am "API changes"

结果,日志现在看起来像这样:

37656e19d4e4f1a9b419f57850c8f1974f871b07 API changes
2b43ceab309da94256db8fb1f35b1678fb74abd4 changes in content
c32557493a95185997c87e0bc3a9481715279351 adding Vue.js
abc234f986d270d7f97c77618314a06f024c4563 migrating content
a5673cd762d8ef2e146d7f0226e81a92f91956b1 adding git reflog outline
2bce4a4404c42128bee8468a9517418ed0ea412 initial commit

在这个阶段,为了对 master 分支进行交互式 rebase,我们需要执行以下操作:

git rebase -i oroirn/master

在变基时, s rebase 子命令将提交标记为压缩为最近的“API 更改”提交。
作为压缩提交的结果,git log 输出现在看起来像这样:

40dhsoi37656e19d4e4f1a9b419f57850ch87dah987698hs  API changes
35aee4a4404c42128bee8468a9517418ed0eb3dc initial commit

现在似乎标记为压缩的提交不再存在。
如果我们需要对压缩提交进行操作,则可以利用 reflog。

git reflog
37656e1 HEAD@{0}: rebase -i (finish): returning to refs/heads/git_reflog
37656e1 HEAD@{1}: rebase -i (start): checkout oroirn/master
37656e1 HEAD@{2}: commit: API changes

有 rebase 的开始和结束的 reflog 条目,在这些条目之前是“API 更改”提交。
可以将 reflog ref 传递给 git reset 以在 rebase 之前重置提交。

git reset HEAD@{2}

此命令将 HEAD 移动到带有“API 更改”的提交,并恢复其他压缩的提交。

Git reflog

定义

git reflog 命令用于 Git 记录对分支尖端所做的更新。
它允许返回到提交甚至没有被任何分支或者任何标签引用的提交。
重写历史记录后,reflog 包含有关分支先前状态的信息,并可以在需要时返回到该状态。

有一些 git 命令,可以应用指定参数的引用或者“ref”。
此参数用于指向提交。
借助这种 reflog 机制,我们可以跟踪本地存储库中 git refs 的更新时间。

Reflog 引用

默认情况下,git reflog 输出 HEAD 引用的 reflog,它被认为是对当前处于活动状态的分支的标志性引用。
我们可以使用 name@{qualifier} 语法访问 git ref。

执行以下命令以获取所有引用的整个 reflog:

git reflog show --all

将当前分支名称传递给 git reflog show,如果我们想查看它的 reflog。
在下面的示例中,显示了 test_branch 分支的引用日志。

git reflog show test_branch
#32a591f test_branch@{0}: commit: add snippets
#23bae4a test_branch{1}: commit (initial): initial commit

使用下面的命令将输出一个 git stash 的引用日志:

git reflog stash
#0d44de3 stash@{0}: WIP on git_reflog: a567574 adding Vue.js

git reflog 的子命令

存在一些被 git reflog 接受的参数,被认为是子命令。
这些子命令如下所示。

show - git reflog show 子命令

git reflog show 子命令是 git log -g --abbrev-commit --pretty=oneline 的别名。
它默认通过。
在下面的例子中,这两个命令是等价的:

git reflog master@{0} = git reflog show master@{0}

过期 - git reflog expire 子命令

git reflog expire 子命令用于清理旧的或者难以接近的 reflog 条目。
此子命令的危险是数据丢失的可能性。
事实上,expire 子命令并没有被用户使用。
它仅由 Git 使用。
默认情况下,reflog 的到期日期设置为 90 天。
将 --expire=time 参数传递给 git reflog expire 以指定过期时间。

删除 - git reflog delete 子命令

git reflog delete 子命令旨在删除传递的 reflog 条目。
但是,最终用户避免执行此子命令,因为在 git reflog expire 的情况下,存在数据丢失的风险。

git reflog 命令的基本用法

通常 git reflog 的用法如下:

git reflog

这是这个的快捷方式:

git reflog show HEAD

上面的命令输出 HEAD reflog。
输出如下所示:

a32556a HEAD@{0}: commit: migrating content
ab371fd HEAD@{1}: commit: adding git reflog outline
23a491a HEAD@{2}: checkout: moving from stage to feature/solver
7b119cb HEAD@{3}: checkout: moving from feature/solver to stage
56a183a HEAD@{4}: commit: changing color scheme
7a2aa71 HEAD@{5}: commit: adding more color palettes
a56322b HEAD@{6}: commit: adding color tool package
日期:2020-06-02 22:16:34 来源:oir作者:oir