我发现了很多有趣的帖子git fsck
,所以我想对它们进行一些实验。首先我在这个问题之前阅读的资料来源:
-
如何通过关键字在 GIT 存储库中找到无法访问的提交哈希? https://stackoverflow.com/questions/31388918/how-can-i-find-an-unreachable-commit-hash-in-a-git-repository-by-keywords
-
git fsck: --dangling 与 --unreachable 与 --lost-found 有什么不同? https://stackoverflow.com/questions/36621730/git-fsck-how-dangling-vs-unreachable-vs-lost-found-differ
-
获取所有 git 提交的列表,包括“丢失”的提交 https://stackoverflow.com/questions/4786972/get-a-list-of-all-git-commits-including-the-lost-ones
我从这个仓库开始:
* 9c7d1ea (HEAD -> test) f
* cd28884 e
| * 7b7bac0 (master) d
| * cab074f c
|/
* d35af2c b
| * f907f39 r # unreferenced commit
|/
* 81d6675 a
Where r
是从一个独立的HEAD
from a
。
然后我想重新建立基础master
on test
,但我有一些未分阶段的更改,所以我这样做了:
git rebase --autostash test
获取(我没有显示r
但它仍然存在):
* caee68c (HEAD -> master) d
* 2e1cb7d c
* 9c7d1ea (test) f
* cd28884 e
* d35af2c b
* 81d6675 a
接下来我运行:
$ git fsck
#...
dangling commit 6387b70fe14f1ecb90e650faba5270128694613d # stash
#...
$ git fsck --unreachable
#...
unreachable commit 6387b70fe14f1ecb90e650faba5270128694613d # stash
unreachable commit d8bb677ce0f6602f4ccad46123ee50f2bf6b5819 # stash index
#...
$ git fsck --lost-found
#...
dangling commit 6387b70fe14f1ecb90e650faba5270128694613d # stash
dangling commit f907f39d41763accf6d64f4c736642c0120d5ae2 # r
#...
第一个问题
为什么只有--lost-found
版本返回r
犯罪?为什么不是c
and d
之前rebase
显示在无法访问的范围内?我以为我理解了阅读链接问题的区别,但我显然错过了一些东西。我仍然有完整的引用日志,但我想你不需要它,因为所有提交(除了那些与stash
) 被引用。
我知道我应该创建另一篇文章,但第二个问题部分相关。出于好奇我尝试了一下:
$ git fsck --lost-found --unreachable
#...
unreachable commit 6387b70fe14f1ecb90e650faba5270128694613d # stash
unreachable commit d8bb677ce0f6602f4ccad46123ee50f2bf6b5819 # stash index
unreachable commit f907f39d41763accf6d64f4c736642c0120d5ae2 # r
unreachable commit 7b7bac0608936a0bcc29267f68091de3466de1cf # c before rebase
unreachable commit cab074f2c9d63919c3fa59a2dd63ec874b0f0891 # d before rebase
#...
第二个问题
结合这两个选项,我得到了所有无法访问的提交(而不仅仅是--lost-found
and --unreachable
),这是非常出乎意料的。为什么它会这样?