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

时间:2011-01-24 20:43:41

标签: git git-log

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

A---B---C---D (master)
     \
      \-E---F (HEAD)

如果我git log --all --oneline,我将获得所有六次提交。

但如果图表是

A---B---C---D (master, HEAD)
     \
      \-E---F

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

由于

12 个答案:

答案 0 :(得分:61)

尝试:

git log --reflog

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

答案 1 :(得分:48)

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

所以轻率的回答是,不要忘记你感兴趣的事情。更严重的是,reflogs将保留对你在过去60天左右默认使用的所有提交的引用。更重要的是,他们会给出一些关于 提交的内容的背景信息。

答案 2 :(得分:42)

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

git reflog |  awk '{ print $1 }' | xargs gitk

这让我可以看到最近变成无头的提交。

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

答案 3 :(得分:21)

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

答案 4 :(得分:6)

我如何解决这个问题?使用git fsck并记录!

首先创建一个包含丢失(无法访问)提交和blob的文件。 (注意:如果您执行类似git gc的操作,那么它将垃圾收集所有提交,您将无法在此处找到它们!)

$git fsck --lost-found > lost_found.commits

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

  

悬空提交dec2c5e72a81ef06963397a49c4b068540fc0dc3
  悬空blob f8c2579e6cbfe022f08345fa7553feb08d60a975
  悬空blob 0eb3e86dc112332ceadf9bc826c49bd371acc194
  悬空blob 11cbd8eba79e01f4fd7f496b1750953146a09502
  悬挂提交18733e44097d2c7a800650cea442febc5344f9b3
  悬空blob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

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

现在,您可以使用git log --oneline <commit hash>之类的内容从此提交中重新登录。 或者,gitk,tig或任何其他git查看器都应该可以工作。

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

A---B---E---F

快速简便!现在,您可以找到所有这些悬空提交背后的背景信息。

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

答案 5 :(得分:5)

通过查看位于.git/logs/HEAD

的reflog,我很幸运地恢复了提交

然后我不得不把搞砸到文件的末尾,然后我发现了我刚丢失的提交。

答案 6 :(得分:5)

我们git log有时候提交所有提交的详细信息并不好,所以要查看...

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

$ nano .git/logs/HEAD

查看您的所有提交,或者:

$ gedit .git/logs/HEAD

查看您的所有提交,

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

答案 7 :(得分:3)

git log --reflog

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

答案 8 :(得分:2)

@bsimmons

git fsck --lost-found | grep commit

然后为每个分支创建一个分支:

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

现在,许多工具会向您显示丢失提交的图形可视化。

答案 9 :(得分:2)

如果使用Git Extensions GUI,则可以通过选中“查看->显示引用日志引用”来显示悬空提交的图形化可视化。 就像所有其他引用的提交一样,这将在树中显示悬挂的提交。这样,您可以轻松找到所需的内容。

请参见this image进行演示。提交图像上的C2,C3,C4和C5悬空但仍然可见。

答案 10 :(得分:1)

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

git reflog

您会发现一个屏幕,其中包含对git这样的历史记录的提交:

enter image description here

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

git checkout -b temp_branch HEAD@{X}

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

希望这对您有帮助...

答案 11 :(得分:0)

实际上 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)。我不会赌它,但我认为没有必要。