获取所有git提交的列表,包括';丢失';一个

获取所有git提交的列表,包括';丢失';一个,git,git-log,Git,Git Log,假设我有一个这样的图: A---B---C---D (master) \ \-E---F (HEAD) git checkout -b temp_branch HEAD@{X} 如果我执行git log--all--oneline,我将获得所有六次提交 但是如果图表是 A---B---C---D (master, HEAD) \ \-E---F 我不会看到E和F。我可以让git告诉我所有的提交,包括未命名的分支上的提交吗 谢谢不太容易——如果你失

假设我有一个这样的图:

A---B---C---D (master)
     \
      \-E---F (HEAD)
git checkout -b temp_branch HEAD@{X}
如果我执行git log--all--oneline,我将获得所有六次提交

但是如果图表是

A---B---C---D (master, HEAD)
     \
      \-E---F
我不会看到E和F。我可以让git告诉我所有的提交,包括未命名的分支上的提交吗


谢谢

不太容易——如果你失去了指向树枝顶端的指针,那就像大海捞针一样。您可以找到所有看起来不再被引用的提交-
git fsck--unreachable
将为您执行此操作-但这将包括在
git提交--amend
之后丢弃的提交,在您重定基础的分支上进行的旧提交等。因此,一次看到所有这些提交很可能是太多的信息而无法浏览


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

我通过查看reflog(位于
.git/logs/HEAD


然后我不得不把翻到文件的末尾,我找到了我刚刚丢失的提交。

我们将
git log
有时无法获得所有提交的详细信息,因此要查看此

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

$ nano .git/logs/HEAD
要查看您在其中的所有提交,或:

$ gedit .git/logs/HEAD
要查看您在其中的所有提交


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

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

git reflog |  awk '{ print $1 }' | xargs gitk
git reflog
这让我可以想象最近的无头犯罪


我在一个名为
~/bin/git reflog gitk

的脚本帮助程序中完成了这个任务。我如何解决这个问题?使用
git fsck
和日志记录

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

这将为您提供如下文件:

A---B---C---D (master)
     \
      \-E---F (HEAD)
git checkout -b temp_branch HEAD@{X}
悬空提交dec2c5e72a81ef06963397a49c4b068540fc0dc3
悬挂水滴f8c2579e6cbfe022f08345fa7553feb08d60a975
悬挂水滴0eb3e86dc112332ceadf9bc826c49bd371acc194
悬挂水滴11cbd8eba79e01f4fd7f496b1750953146a09502
悬空提交18733e44097d2c7a800650cea442febc5344f9b3
悬滴1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

然后,您可以使用最喜爱的文本编辑器打开此文件,从中复制提交/博客哈希。(*咳嗽*vim宏非常适合这种情况*咳嗽*)

现在,您可以使用类似于
git log--oneline
的东西从这个提交中重新登录。 或者,gitk、tig或任何其他git查看器都可以工作

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

A---B---E---F
又快又简单!现在,您可以找到所有这些悬而未决的提交背后的上下文


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

喜欢@Kieran的答案,但对于控制台:

git log--oneline--all--graph--decoration$(git reflog | awk'{print$1})

试试:

git log --reflog
它通过假装reflogs(
git reflog
)提到的所有对象在命令行上都列为
@bsimons,列出了所有git提交

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

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

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


请参见演示。图像上的C2、C3、C4和C5文件悬空但仍然可见。

以下命令救了我的命:

git reflog |  awk '{ print $1 }' | xargs gitk
git reflog
在这里,您可以看到一个屏幕,其中包含对git的历史提交,如下所示:

此时,您只需找到所需的
HEAD@{X}
,创建一个临时分支并按如下方式移动到它:

A---B---C---D (master)
     \
      \-E---F (HEAD)
git checkout -b temp_branch HEAD@{X}
这样,您就可以使用丢失的提交创建一个临时分支,而无需重新设置git存储库的基址或进一步破坏它

希望这有助于

git log --reflog

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

+1:通过
commit--amend--
rebase--
故意孤立的提交与通过使用分离的头而意外孤立的提交之间,比如说,绝对没有区别。从这种情况中恢复过来的最简单的方法可能是查看头部的reflog本身。@Jefromi:git commit的一个很好的提示--amend等。留下死胡同,丢失提交。我做了一些重定基期之类的事情,最终得到了一些无法从任何分支机构获得的承诺,并且感觉有点脏,将它们留在回购协议中。现在这种想法不再那么令人不安了@araqnid我和最初的海报陷入了同样的困境,你的建议就是看一下reflog。我同意这个答案,但如果有人确实需要查看所有提交,包括故意或意外的孤儿提交,
git fsck--unreachable
没有提供这一点。我刚试过。更好的方法是
git log
--reflog
选项,如下所示。特别好的是,结合
--graph
,您可以得到一个易于解析的可视上下文,就像原始问题中所示。例如,尝试:
git log--graph--a