我可以使用git fsck来显示提交名称吗?

时间:2015-06-10 15:20:39

标签: git

我在许多已删除的提交中都有一个已删除的提交,我尝试恢复。我发现了fsck --lost-found命令。太好了!

问题是我有超过一百个悬挂的提交语句,信息很少。

dangling commit 654857f5e8418c4031e1d8411579906c528da562
dangling commit 74499bd482d688c1416d5091b391d82a438855a9
dangling commit 124ed7cd4465434865577c82757732df62febb59
dangling commit 92573bf4595be6f80f22eba94548dbc88d8796fc
dangling commit 125b0ffa3f0db71f23fda65d6adb2f9941748cc0
dangling commit ba5b1f8d6d920900abc88bd725d44ba86c8c772f
dangling blob e760d751ae4e3dab9beed0996e683c0f291eb4cc

如果它可以抛出提交名称与sha将是一个很大的帮助。实际上,我必须逐个运行git show,以找到正确的提交。有更简单的方法吗?

3 个答案:

答案 0 :(得分:13)

这适用于Linux和Mac:

playerResource.name

我不确定您在Windows git shell中是否有playerResource.firstName + playerResource.lastNamegit fsck --lost-found | grep "dangling commit" | cut -d" " -f 3 | xargs -I "{}" git --no-pager show --stat "{}"

说明:

  • grep找到数据
  • xargs将其简化为仅悬空提交
  • git fsck仅保留提交ID
  • grep使用ID
  • 运行命令cut

[编辑] 修复了有多个悬空提交的情况。

答案 1 :(得分:6)

这不是用git fsck解决这个问题的答案,而是可能在这种情况下有用的东西。

git reflog输出存储库中过去HEAD的列表。例如,如果从分支主机切换到分支机构,则会生成一个带有主分支HEAD的reflog条目。

因此,如果提交在某个时间是分支的一部分,那么您可以使用git refloggit log和一些手动工作的组合来恢复它。

有几种情况:

  1. 点击git reflog然后滚动浏览。如果它显示您正在寻找的提交消息,那太好了!复制提交ID并将其用于您想要的任何内容(例如git cherry-pick,或使用git branch save-my-commit commitid将其保存到分支中。

  2. 提交不是直接在git reflog中,但是您会看到要查找的提交之后(以及在删除之前)提交的提交。在这种情况下,请使用您在git reflog中找到的提交后的提交ID,并将其作为参数传递给git loggit log commitid。滚动输出,看看是否可以找到您的提交。使用提交ID,如案例1所示。

  3. 提交不直接在git reflog中,并且在删除提交之后 之前 < / em>删除它。

    这是最繁琐的案例,在这种情况下,可能更容易通过此处的其他流程。我不确定它们实际上是否会被列为悬空提交,因此如果您使用git fsck找不到提交,则值得一试。

    查看git reflog中的所有条目,并使用提交ID作为git log的参数,如案例2中所述。尝试查找您之后的提交。

  4. 祝你好运!

答案 2 :(得分:0)

或更简单:

git fsck --lost-found | sed 's/\(dangling commit \|dangling blob \)//' | xargs -t -n1 git show