in git
我使用 gitk
来查看几周前提交的哈希值,并使用带有该哈希值的 git checkout 将我的源文件恢复到以前的状态。
现在我想去几天后的提交,但是gitk
只显示当前提交,而不是以后的提交。
使用git log
也仅在当前之前显示。
如何列出以后的提交?
您要签出的提交是否在任何分支的祖先中? 换句话说,您当前的任何分支是否包含您正在搜索的提交中所做的更改?
如果是这样,git log --all
将在日志中显示此提交。 如果您只查找提交消息,则添加 --oneline
和/或 --decorate
标志可能会使此输出更易于搜索:
$ git log --all --oneline --decorate
如果您的提交不在任何分支的祖先中(因此未显示log --all
),那么您必须搜索git reflog
。 reflog 本质上是您的HEAD
指向的所有提交的历史记录。 当您当前在工作目录中签出这些文件时,HEAD
指向提交。
引用日志的格式为
hash HEAD@{n}: command: message
其中command
是发出用于将HEAD
指向此特定位置的命令,message
是与此命令关联的消息。 对于commit
,message
是您输入的提交消息。
由于这种结构良好的格式,我们可以使用 grep 使输出更易于阅读。例如,如果您知道最近签出了有问题的提交,则可以运行:
$ git reflog | grep checkout
或者,要仅查看提交,您可以运行:
$ git reflog | grep commit
您还可以以许多其他方式使用 grep,具体取决于您要搜索的内容:
$ git reflog | grep "phrase in commit message" --ignore-case
$ git reflog | grep "individual|words|in|message" --ignore-case
git reflog
来查看 HEAD 指针访问过的所有提交的哈希值,即您在工作目录中曾经指向的所有提交。
如果您无法使用git log
找到您要查找的提交,这意味着您正在寻找的提交不是您当前放置的提交的祖先。如果在 reflog 中找不到您的提交,您可能会找到(直接或间接)基于它的提交。如果找到它,请检查它,您查找的提交现在应该列在 git log
中。
git log --all --oneline --graph --decorate
可视化您的 Git 树。您现在处于分离状态;回到你以前的地方;您需要使用:
git checkout <branch-name>
其中<branch-name>
是您正在处理的分支。