204

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

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

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

但是如果图表是

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

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

谢谢

4

12 回答 12

195

尝试:

git log --reflog

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

于 2015-12-31T15:41:43.060 回答
69

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

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

于 2011-01-24T20:49:46.343 回答
60

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

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

这让我可以想象最近的无头提交。

我将它包含在一个名为~/bin/git-reflog-gitk.

于 2014-05-21T10:45:50.857 回答
55

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

git reflog

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

在此处输入图像描述

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

git checkout -b temp_branch HEAD@{X}

这样,您将拥有一个带有丢失提交的临时分支,而不会重新定位或破坏您的 git 存储库。

希望这可以帮助...

于 2019-05-16T07:13:37.500 回答
29

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

于 2015-05-29T01:41:42.567 回答
10
git log --reflog

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

于 2020-04-21T11:59:53.730 回答
9

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

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

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

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

dangling commit dec2c5e72a81ef06963397a49c4b068540fc0dc3
dangling blob f8c2579e6cbfe022f08345fa7553feb08d60a975
dangling blob 0eb3e86dc112332ceadf9bc826c49bd371acc194
dangling blob 11cbd8eba79e01f4fd7f496b1750953146a09502
dangling commit 18733e44097d2c7a800650cea442febc5344f9b3
dangling blob 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

然后你可以用你最喜欢的文本编辑器打开这个文件,从那里复制提交/博客哈希。(*咳嗽* vim 宏非常适合这个 *咳嗽*)

现在您可以使用类似git log --oneline <commit hash>. 或者,gitk、tig 或任何其他 git 查看器应该可以工作。

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

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

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

PS 是的,我知道,迟到的帖子,但是哦,好吧,有人可能会在这里找到它并发现它很有用。(很可能在 6 个月后我再次用谷歌搜索)

于 2014-12-10T16:04:58.437 回答
5

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

然后我不得不向下移动到文件的末尾,我找到了我刚刚丢失的提交。

于 2013-12-18T09:51:38.083 回答
5

我们git log有时不能很好地获取所有提交的详细信息,所以要查看这个......

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

$ nano .git/logs/HEAD

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

$ gedit .git/logs/HEAD

查看你所有的提交,

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

于 2014-03-22T08:16:56.553 回答
3

@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

现在,许多工具将向您展示这些丢失提交的图形可视化。

于 2017-07-17T14:01:12.623 回答
3

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

于 2021-06-15T06:53:12.237 回答
2

如果您使用 Git Extensions GUI,如果您选中“View -> Show reflog references”,它可以向您显示悬空提交的图形可视化。这将在树中显示悬空提交,就像所有其他引用的提交一样。这样更容易找到您要查找的内容。

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

于 2018-07-11T16:28:43.897 回答