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


139

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

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

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

但是如果图是

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

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

谢谢

Answers:


63

并不是特别容易-如果您丢失了指向树枝顶端的指针,那就像在大海捞针中找到一根针。您可以找到所有不再被引用的提交- git fsck --unreachable会为您完成此操作-但这将包括您在a之后丢弃的git commit --amend提交,在您基于基准的分支上的旧提交等。因此可以看到所有这些提交一次很可能有太多信息无法通过。

因此,简单的答案是,不要忘记您感兴趣的事物。更严重的是,默认情况下,刷新日志将保留对您最近60天内使用过的所有提交的引用。更重要的是,他们会给什么这些提交一些背景


7
+1:例如,由commit --amend或故意孤立的提交rebase与与分离的HEAD一起工作而意外孤立的提交绝对没有区别。
卡斯卡贝尔2011年

3
确实。从这种情况中恢复的最简单方法可能是查看HEAD本身的刷新日志。
araqnid

@Jefromi:很好地指出了git commit --amend死胡同,丢失提交等问题。我做了一些基础调整,什么都没做,最终导致某些分支无法从任何分支到达,并且感到有些肮脏,把它们留在了仓库中。现在,这种想法不再那么令人不安了。:)
埃米尔·伦德伯格

2
@araqnid我把自己和原始的海报放在同一张泡菜中,而您建议查看reflog只是要做的事情。
Ignazio

7
我同意这个答案,但是在某些人确实需要查看所有提交的情况下,包括故意的或偶然的孤儿提交, git fsck --unreachable都不提供。我刚试过 正如kenorb回答的那样,更好的方法是--reflog选择。与结合使用的特别好之处在于,您可以轻松解析视觉上下文,就像原始问题中说明的那样。例如,尝试:git log--graphgit log --graph --all --oneline --reflog
Inigo,

111

尝试:

git log --reflog

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


1
这就是我想要的---reflog参数的功能。
异常

3
顺便说一句,gitk也支持:gitk --reflog。
ald.li

50

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

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

这使我可以看到最近变得毫无头绪的提交。

我将其包装在名为的脚本帮助器中~/bin/git-reflog-gitk


1
这为我节省了很多时间……谢谢!
Bret Royster

这太棒了!谢谢!它确实使树的重要部分形象化。
Mladen B.19年

提示:这仅适用于本地工作作为reflog记录when the tips of branches and other references were updated in the *local repository*git log --reflog如果您想对非本地引用进行更改,则可能需要使用
Krishna Gupta

29

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

git reflog

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

在此处输入图片说明

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

git checkout -b temp_branch HEAD@{X}

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

希望这可以帮助...


26

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


您是否需要包括最后一部分:$(git reflog | awk'{print $ 1}')?这是做什么的?在尝试完您的解决方案后,即使没有最后一部分,它似乎也会产生相同的输出。
wmock 2015年

如果您移动分支指针并留下一些没有引用的提交(如OP一样),它们将不再显示在中git log --all。一个简单的例子:在git reset --hard @^您的HEAD @ {0}提交之后,该提交只会出现在刷新日志中,并且由于git reflog不支持,--graph您必须将这些提交传递给以git log --graph获得可视化表示。
弗洛里安·菲达

5
你可以使用--reflog,而不是 $(git reflog | awk '{print $1}')
西尔德

我比较git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')git log --oneline --all --graph --decorate --reflog,除了--reflog包含WIP条目之类的详细信息外,它们几乎相同。
脚本狼

@FlorianFida,而不是reflog为什么不使用它log --reflog呢?
Pacerier

9

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

首先创建一个包含丢失(无法到达)的提交和斑点的文件。(注意:如果您执行了类似的操作git gc,它将对所有提交进行垃圾回收,而您将在这里找不到它们!)

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

那给你这样的文件:

悬挂提交dec2c5e72a81ef06963397a49c4b068540fc0dc3
悬挂一滴f8c2579e6cbfe022f08345fa7553feb08d60a975
晃来晃去斑点0eb3e86dc112332ceadf9bc826c49bd371acc194
悬挂一滴11cbd8eba79e01f4fd7f496b1750953146a09502
悬挂承诺18733e44097d2c7a800650cea442febc5344f9b3
悬挂一滴1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

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

现在,您可以使用类似这样的内容从此提交中注销git log --oneline <commit hash>。另外,gitk,tig或任何其他git查看器也可以工作。

在您的情况下,如果您发现提交F的哈希,则日志将显示以下内容,

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

快捷方便!现在,您可以找到所有悬空提交的背景。

附言:是的,我知道,后期发布,但是,哦,有人可以在这里找到它并觉得有用。(最有可能在6个月后再次搜寻此网页)


5

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

然后,我不得不一直拖到文件末尾,我发现我刚刚丢失的提交。


这是我搞砸了之后才做的事情。试图奉献给大师,当我推动时,藏匿者退缩了。我重设--hard,然后意识到我的错误。提交在reflog中,因此我将其检出,从中进行分支,然后将其推送。一切最终都解决了。
戴维

5

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

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

$ nano .git/logs/HEAD

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

$ gedit .git/logs/HEAD

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

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


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

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


2

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.