A---B---C---D (master)
\
\-E---F (HEAD)
如果我运行
git log --all --oneline
命令,我将得到我所有的六个提交记录。但是如果图形是:
A---B---C---D (master, HEAD)
\
\-E---F
我将不会看见 E 和 F。我能让 Git 告诉我所有的提交记录,包括那些没有命名的分支吗?
试试:
git log --reflog
该命令通过假装所有由reflogs (git reflog
)提到的对象在命令行中被列为<commit>
,以列出所有的 git 提交。
如果你已经丢失了指向分支末端的指针,那么它就像在草堆里找针一样不容易。你可以找到所有似乎不再被引用的提交-git fsck --unreachable
可以为您完成此操作-但其中将包括您在git commit --amend
之后放弃的提交,以及在分支上重新设置等等的旧提交。所以一次看到所有这些提交很可能是太多信息需要浏览。
因此,轻率的回答是,不要失去对你感兴趣的事物的追踪。更严肃地说,引用日志将保存默认情况下过去60天左右使用的所有提交的参考。更重要的是,它们将提供关于这些提交“是什么”的一些上下文信息。
git commit --amend
等命令留下死胡同、丢失提交的问题,你指出了一个很好的观点。我进行了一些变基操作,最终得到了一些无法从任何分支访问的提交,感觉在代码库中留下它们有点不妥。现在,这个想法不再那么令人不安了。 :) - Emil Lundberggit fsck --unreachable
并不能提供这样的信息。我刚刚尝试过了。更好的方法是使用 git log
的 --reflog
选项,就像 kenorb 回答 的那样。特别棒的是,结合 --graph
使用,你可以获得易于解析的视觉上下文,就像原始问题中所示的那样。比如,尝试一下:git log --graph --all --oneline --reflog
。 - Inigo当我处理这个问题时,我使用以下命令:
git reflog | awk '{ print $1 }' | xargs gitk
这让我可以可视化最近的提交,这些提交已经变得无头了。
我将其包装在一个名为~/bin/git-reflog-gitk
的脚本助手中。
编辑:- 我的git-reflog-gitk包装器是多余的 - 因为现在你可以直接调用gitk --reflog
git log --reflog
。 - Krishna Gupta与Kieran的回答类似,但是用于控制台:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
git log --all
中。一个快速的例子:在 git reset --hard @^
之后,您的 HEAD@{0} 提交将只存在于 reflog 中,而由于 git reflog
不支持 --graph
,您必须将提交传递给 git log --graph
来获得可视化表示。 - Florian Fida--reflog
替换 $(git reflog | awk '{print $1}')
。 - Sildgit log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
与 git log --oneline --all --graph --decorate --reflog
进行了比较,它们几乎完全相同,只是 --reflog 包含了 WIP 条目等详细信息。 - Script Wolflog --reflog
而不是reflog
呢? - Paceriergit log --reflog
你救了我!当我合并HEAD时,我丢了我的提交记录,无法找到我的最新提交记录!在SourceTree中也没有显示,但是git log --reflog
会显示我本地所有的提交记录。
git fsck
和日志记录!git gc
的操作,则它将垃圾回收所有提交,您将无法在此处找到它们!)$git fsck --lost-found > lost_found.commits
git log --oneline <commit hash>
的命令从此提交记录回滚。或者,gitk、tig或任何其他git查看器都应该可以工作。A---B---E---F
快速简便!现在你可以找到所有那些“悬挂提交”的背景。
附言:是的,我知道,发文有点晚了,但没关系,也许有人会在这里找到它并且发现它很有用。(最有可能再过六个月我再次谷歌搜索时会用到。)
通过查看位于.git/logs/HEAD
的引用日志,我成功地找回了提交。
然后我不得不向下滚动到文件末尾,并找到了我刚刚丢失的提交。
实际上,git fsck
可以用于查找所有丢失的提交,您只需要选择正确的选项:
git fsck --unreachable --no-reflogs
--unreachable
仅仅通过该命令是不够的,因为一些提交可能仍然被引用于 reflog 中。如果你需要一个相当清晰的整个提交历史视图,你可以创建一个类似下面这样的别名:
git log --all --decorate --oneline --graph $(git fsck --no-reflogs --unreachable | awk '{if ($2 == "commit") print $3}')
说实话,我不确定在这个最后的命令中是否需要--unreachable
选项,因为git log
默认遍历祖先(除非指定了--no-walk
)。我不敢确定,但我认为这不是必要的。
git log
命令不能获取到所有提交的详细信息,因此我们可以这样查看:针对Mac系统:进入你的git项目并输入以下命令:
$ nano .git/logs/HEAD
$ gedit .git/logs/HEAD
要查看您在其中的所有提交记录,
然后您可以在任何您喜欢的浏览器中进行编辑。
git reset origin/branch
时,并不是真正无法访问,只是在日志中不再显示。 - Sami Kuhmonengit checkout -B my/branch
命令,意味着意外地 使用这个日志列表,我找到了之前的 HEAD 提交记录,谢谢。 - Codesleuth