获取所有git提交的列表,包括"丢失"提交

Ama*_*dan 120 git git-log

假设我有一个这样的图表:

A---B---C---D (master)
     \
      \-E---F (HEAD)
Run Code Online (Sandbox Code Playgroud)

如果我这样做git log --all --oneline,我将获得所有六个提交.

但如果图表是

A---B---C---D (master, HEAD)
     \
      \-E---F
Run Code Online (Sandbox Code Playgroud)

我不会看到E和F.我可以告诉我所有提交的git,包括那些未命名的分支上的提交吗?

谢谢

ken*_*orb 82

尝试:

git log --reflog
Run Code Online (Sandbox Code Playgroud)

它通过假装reflogs(git reflog)提到的所有对象在命令行中列出来列出所有git提交<commit>.

  • 输入“q”退出 git log (5认同)
  • 顺便说一句,gitk 还支持: gitk --reflog 。 (4认同)

ara*_*nid 54

不是特别容易 - 如果你丢失了指向分支尖端的指针,那就像在大海捞针一样.您可以找到所有似乎不再被引用的提交 - git fsck --unreachable将为您执行此操作 - 但这将包括您在一个git commit --amend旧的提交后丢弃的提交,您重新生成的分支等等.所以看到所有这些提交立刻很可能会有太多的信息需要通过.

所以轻率的答案是,不要忘记你感兴趣的事情.更严重的是,reflogs将保留对你在过去60天左右默认使用的所有提交的引用.更重要的是,他们会给什么这些提交一些背景.

  • +1:如果通过`commit --amend`或`rebase`故意孤立的提交与通过使用分离的HEAD意外孤立的提交之间绝对没有区别. (7认同)
  • 我同意这个答案,但是在有人确实需要查看所有提交的情况下,包括孤立的或故意的或偶然的提交,'git fsck --unreachable'不会提供该提交。我刚试过 更好的方法是git log的--reflog选项,如[kenorb回答](/sf/answers/2418399721/)。这样做的特别好处是,与`--graph`结合使用,您可以轻松解析视觉上下文,就像原始问题中说明的那样。例如,尝试:`git log --graph --all --oneline --reflog` (4认同)
  • 确实.可能从这种情况中恢复的最简单方法是查看HEAD本身的reflog. (3认同)
  • @araqnid 我和原来的海报一样陷入困境,你建议查看 reflog 就是要做的事情。 (2认同)

Kie*_*ran 49

当我解决这个问题时,我使用以下命令:

git reflog |  awk '{ print $1 }' | xargs gitk
Run Code Online (Sandbox Code Playgroud)

这让我可以想象最近变成无头的提交.

我把它包含在一个名为的脚本助手中~/bin/git-reflog-gitk.

  • 这帮我节省了很多时间……谢谢! (2认同)

Flo*_*ida 23

就像@Kieran的答案一样,但对于控制台: git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

  • 你可以使用```--reflog```而不是```$(git reflog | awk'{print $ 1}')``` (5认同)

Son*_*hja 10

拯救我生命的是以下命令:

git reflog
Run Code Online (Sandbox Code Playgroud)

在这里,您会看到一个屏幕,其中包含对git的历史记录提交,如下所示:

在此处输入图片说明

此时,您只需要找到HEAD@{X}所需的,创建一个临时分支,然后像这样移动到它:

git checkout -b temp_branch HEAD@{X}
Run Code Online (Sandbox Code Playgroud)

这样,您将拥有一个临时分支,其中包含丢失的提交,而无需重新定级或破坏更多的git存储库。

希望这可以帮助...


小智 7

我怎么解决这个问题?使用git fsck和记录!

首先创建一个包含丢失(无法访问)提交和blob的文件.(注意:如果你做了类似的事情git gc,它将垃圾收集他们所有的提交,你不会在这里找到它们!)

$git fsck --lost-found > lost_found.commits
Run Code Online (Sandbox Code Playgroud)

这给你一个像这样的文件:

晃来晃去犯dec2c5e72a81ef06963397a49c4b068540fc0dc3
晃来晃去的blob f8c2579e6cbfe022f08345fa7553feb08d60a975
晃来晃去斑点0eb3e86dc112332ceadf9bc826c49bd371acc194
晃来晃去的blob 11cbd8eba79e01f4fd7f496b1750953146a09502
悬挂提交18733e44097d2c7a800650cea442febc5344f9b3
晃来晃去的blob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

然后,您可以使用自己喜欢的文本编辑器打开此文件,以从那里复制提交/博客哈希.(*咳嗽*vim宏适用于此*咳嗽*)

现在,您可以使用类似的东西从此提交中重新登录git log --oneline <commit hash>.或者,gitk,tig或任何其他git viewer应该可以工作.

在您的情况下,如果您找到提交F的哈希,日志将显示这样的内容,

A---B---E---F
Run Code Online (Sandbox Code Playgroud)

快捷方便!现在,您可以找到所有这些悬挂提交背后的上下文.

PS是的,我知道,迟到了,但是哦,有人可能会在这里找到并发现它很有用.(当我再次谷歌时,我很可能在6个月内)


Mar*_*ara 7

实际上git fsck可以用来查找所有丢失的提交,你只需要正确的选项:

git fsck --unreachable --no-reflogs
Run Code Online (Sandbox Code Playgroud)

--unreachable单独是不够的,因为一些提交可能仍然被引用日志引用。如果您需要非常清晰地查看整个提交历史记录,您可以为如下内容创建别名:

git log --all --decorate --oneline --graph $(git fsck --no-reflogs --unreachable | awk '{if ($2 == "commit") print $3}')
Run Code Online (Sandbox Code Playgroud)

老实说,我不确定在最后一个命令中您是否需要该--unreachable选项,因为git log默认情况下会遍历祖先(除非--no-walk指定)。我不会打赌,但我认为没有必要。


sul*_*rza 6

git log --reflog
Run Code Online (Sandbox Code Playgroud)

救了我!我在合并 HEAD 时丢失了我的,找不到我的延迟提交!未显示在源代码树中,但git log --reflog之前显示我所有的本地提交


Gam*_*ing 5

我很幸运通过查看位于的reflog来恢复提交 .git/logs/HEAD

然后,我不得不躲到文件的末尾,我发现了我刚丢失的提交.


Vin*_*shi 5

我们将git log有时并不好让所有提交的细节,所以要查看此...

对于Mac:进入git项目并输入:

$ nano .git/logs/HEAD
Run Code Online (Sandbox Code Playgroud)

查看您在其中的所有提交,或:

$ gedit .git/logs/HEAD
Run Code Online (Sandbox Code Playgroud)

查看您在其中的所有提交,

然后您可以在任何喜欢的浏览器中进行编辑。