【问题标题】:Can't recover commit from Git due to same sha in reflog由于 reflog 中的 sha 相同,无法从 Git 恢复提交
【发布时间】:2015-03-18 03:33:39
【问题描述】:

我正在尝试恢复代码,因为我不小心切换到了 eclipse 中的一个分支并以某种方式丢失了所有数据(我仍然不知道我做了什么)。当我在命令行中打开我的 git reflog 时,我看到:

6dc60f6 HEAD@{14}: commit: fixed class mismatch for integers
638fbb1 HEAD@{15}: commit: fixed first NPE bug
22fc2b9 HEAD@{16}: commit: v 6.0.5
0acef4f HEAD@{17}: commit: clean up
8a441cb HEAD@{18}: commit: cleaned up db code
9ac384d HEAD@{19}: commit: ver 6.0.4
ce1f1c2 HEAD@{20}: commit: addded drivers
9b5a4dd HEAD@{21}: checkout: moving from master to 9b5a4dde0f97303579ec0cf15413ecce83a636dc
6dc60f6 HEAD@{22}: commit: change Db
9b5a4dd HEAD@{23}: commit: // for public schema: "" or "public" 
f668dd1 HEAD@{24}: commit: changed schema
a0e5b2a HEAD@{25}: commit: changed frames

我正在尝试结帐6dc60f6 HEAD@{14}: commit: fixed class mismatch for integers,但我所有的尝试都转到6dc60f6 HEAD@{22}: commit: change Db,这是一个更旧的版本。这是来自 git reflog 命令,而不是 git log 所以检查 @{14} 也不起作用。

有没有办法检查6dc60f6 的最新提交,还是丢失了?

谢谢。

附:其他 14 个命令只是我从一个分支切换到另一个分支并再次尝试修复它。

638fbb1 HEAD@{0}: checkout: moving from 6dc60f6 to master
638fbb1 HEAD@{1}: checkout: moving from ce1f1c247f94298c9e1fd67f0e1199a82df2ff1c to 6dc60f6
ce1f1c2 HEAD@{2}: checkout: moving from 6dc60f6 to ce1f1c2
638fbb1 HEAD@{3}: checkout: moving from master to 6dc60f6
638fbb1 HEAD@{4}:
6dc60f6 HEAD@{5}: checkout: moving from 6dc60f6f81a9f97d6d1244a288bec027fd7604b6 to master
6dc60f6 HEAD@{6}: 
638fbb1 HEAD@{7}: checkout: moving from ce1f1c247f94298c9e1fd67f0e1199a82df2ff1c to 638fbb1
ce1f1c2 HEAD@{8}: checkout: moving from 9b5a4dde0f97303579ec0cf15413ecce83a636dc to ce1f1c2
9b5a4dd HEAD@{9}: checkout: moving from 638fbb18fbe0dfd7bca8477d7b9ddde44443ed4a to 9b5a4dd
638fbb1 HEAD@{10}: checkout: moving from 6dc60f6f81a9f97d6d1244a288bec027fd7604b6 to 638fbb1
6dc60f6 HEAD@{11}: checkout: moving from 638fbb18fbe0dfd7bca8477d7b9ddde44443ed4a to @{6}
638fbb1 HEAD@{12}: checkout: moving from master to 638fbb1
6dc60f6 HEAD@{13}: checkout: moving from 078b90ff9eb70560ecf5e9a25b1f7aaa7db9a81a to master
078b90f HEAD@{14}: checkout: moving from master to @{5}
6dc60f6 HEAD@{15}: checkout: moving from latest_branch to master
6dc60f6 HEAD@{16}: checkout: moving from new_branch to latest_branch
6dc60f6 HEAD@{17}: checkout: moving from master to new_branch

编辑 2:

运行git reflog show --no-abbrev,这是在我执行所有那些充斥 reflog 的检查之前,它位于 repo 的 zip 文件中,因此它从 @{0} 开始,注意 2(HEAD,master)具有相同的哈希但不同的提交消息:

6dc60f6f81a9f97d6d1244a288bec027fd7604b6 (HEAD, master) HEAD@{0}: commit: fixed class mismatch for integers
638fbb18fbe0dfd7bca8477d7b9ddde44443ed4a HEAD@{1}: commit: fixed first NPE bug
22fc2b9e22e9259858f5d8df6b44fdd17e7ef475 HEAD@{2}: commit: v 6.0.5
0acef4fef3df6df7b6f77ef3d373f3071aafdc4a HEAD@{3}: commit: clean up
8a441cbfc8b68b25fe6cc2e96ed5cad797ba139c HEAD@{4}: commit: clean up db code
9ac384dfec998e3c7ea0641ba04025d5c0aa4abb HEAD@{5}: commit: ver 6.0.4
ce1f1c247f94298c9e1fd67f0e1199a82df2ff1c HEAD@{6}: commit: added drivers
9b5a4dde0f97303579ec0cf15413ecce83a636dc HEAD@{7}: checkout: moving from master to 9b5a4dde0f97303579ec0cf15413ecce83a636dc
6dc60f6f81a9f97d6d1244a288bec027fd7604b6 (HEAD, master) HEAD@{8}: commit: change Db
9b5a4dde0f97303579ec0cf15413ecce83a636dc HEAD@{9}: commit: // for public schema: "" or "public"
f668dd11646727dae7b8511796a88c59d439c2bf HEAD@{10}: commit: changed schema
a0e5b2a2c349ae0665f80fa1b7027836c8bbc6aa HEAD@{11}: commit: changed frames
2e934ffe0546413e7a7e81318f9e7aefc458e8d2 (origin/master) HEAD@{12}: commit: Change classes: BusinessRules - fix compliler error DBMetaInfopanel - fix dialog: MSDOC-ISSUE-007, MSDOC-ISSUE-010 ReportTable - fix DateTime and Number format Config.txt - add global DateTime and Number format add jar Profiler 6.0.4
078b90ff9eb70560ecf5e9a25b1f7aaa7db9a81a HEAD@{13}: commit: apply 6.0.3.2 fix and changed global parameters in Config.txt commented all DBs in Config.txt
9fb275d45da8e2df3044448b3275aa24a77ddd85 HEAD@{14}: commit: change framework version to 6.0.4
9835cdf1ba1d38bf3343e43623bd31f2aa0562b6 HEAD@{15}: commit: add Datetime and number format
839fa8b27a1c7a05fa19d75b5c62a8f35a865b9d HEAD@{16}: commit: add new profiler-6.0.3.4 remove profiler-6.0.3.1 change pom.xml
68acc9cfd9e0bc65159e35e832afa59d4d014717 HEAD@{17}: commit: add 6.0.3.1
46b0d9c2c8d4ac81f951ae41e2f405c864f430b0 HEAD@{18}:

【问题讨论】:

  • 如果你使用git log,你可以看到完整的sha,从而消除两者之间的歧义。
  • 签出HEAD@{14}(明确使用HEAD)能解决问题吗?
  • @CommuSoft 我无法 git 记录我想查看的提交,因为它是最新的提交,我只能到达它正下方的 638fbb1。查看HEAD@{14} 或@{14} 再次查看来自638fbb1 的第14 次提交,这是我最接近的一次。由于类不匹配,我只是无法获得最新的提交。
  • 这不是最新的提交,据我所知,你只是回到了历史。如果你再次签出头部,你可以看到其他提交......
  • @CommuSoft 我已经在之前的所有其他消息中进行了编辑,这只是我试图切换到正确的分支。我不知道如何获得最新的变化了。 git checkout HEAD 或 master 只能让我访问 638fbb1。

标签: git reflog


【解决方案1】:

解决方法:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

来自:

How to recover a dropped stash in Git?

【讨论】:

    【解决方案2】:

    问题是git reflog 将哈希缩写为 7 个字符,但是这两次提交中的前 7 个字符是相同的。

    要使用 reflog 获取完整哈希,请使用以下命令:

    git reflog show --no-abbrev

    然后,您可以使用完整的哈希来检查您想要的提交。

    【讨论】:

    • 即使已解决,我仍在调查。我运行了该命令(在 cygwin 中),这真的很奇怪,但我得到了完全相同的 SHA 和 2 条不同的提交消息,它们都显示为(HEAD,master)。到底是怎么回事? (我已将git reflog show --no-abbrev 的输出编辑到我的帖子中)
    猜你喜欢
    • 2010-12-26
    • 2020-08-30
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2014-12-21
    • 2012-09-12
    相关资源
    最近更新 更多