如何通过关键字在GIT存储库中找到无法到达的提交哈希?

乔克斯

我对GIT情况感到有些困惑。

我正在研究一个GIT版本的项目,我刚刚注意到,我们认为几周前我们已经在master分支上的一些提交实际上丢失了。我记得这些提交是由其他人在功能分支“功能/某物”上推送的,该分支不再存在。

我试图找到那些遗漏的提交来解决我们的错误并将其推入永久分支。在这个团队中,每个开发人员都将他正在处理的故障单的ID放入提交消息中。因此,我肯定知道票证ID(例如1234)在我要查找的提交消息中,因此我尝试了:

git log --all --grep=1234
git log -g --grep=1234
git log --all | grep 1234
git reflog | grep 1234

所有这些命令均未返回任何内容。

此时,我正要放弃,然后我想起了我们的git repo已与Slack集成在一起,因此我在slack历史记录中搜索了1234,并发现了哈希表。我立即尝试:

git show hash1
git show hash2

这出奇的工作!它显示了所有提交信息。所以提交就在那里,以某种方式仍在我的本地存储库中。所以我想仔细检查一下我是如何错过他们的:

git reflog | grep hash1
git branch --contains hash1
git fsck --lost-found | grep hash1

没有。

git fsck --unreachable | grep hash1
unreachable commit hash1

这就是不可达的提交列表中的内容。

但是,这是一个很大的项目,git fsck --unreachable返回了大量的提交,如何通过关键字找到丢失的提交呢?如果我们没有第三方工具来记录git活动,也许我会尝试将git fsck的输出以某种方式输送回git show并根据结果进行grepping,但这似乎是要做很多事情,只是为了找到我提交的提交知道在这里某处。

PS:很抱歉,我无法共享该回购协议,这是一个私人项目,但以下内容可以重现此情况:

用户A:

git clone <repo>
git checkout -b feature/something
# add something to commit
git commit -m “special-keyword"
git push origin feature/something

用户B:

git clone <repo>
git push origin :feature/something

现在,用户B工作了几周,然后尝试查找用户A推送的提交“特殊关键字”。

星期二

删除分支时,还将删除其引用日志。有一个单独的reflogHEAD将保留对已删除分支上的提交的引用,但前提是您已将它们检出

--lost-found之间的区别--unreachable很细微:1请参见git词汇表和/或以下插图。通常,使用--lost-found和/或--unreachable将找到此类提交(并且使用--lost-found,还将ID写入.git/lost-found/commit目录,我认为这具有保护其免受垃圾回收的副作用)。

在这种情况下,您要查找的提交不是已删除分支的最尖端提交。也就是说,假设在删除之前feature/something我们已经在功能分支上进行了两次最新提交:

A <- B <- C   <-- master
  \
    D <- E    <-- feature/something

现在,我们删除feature/something,同时丢失提交IDED两者。这两个ID都将显示在的输出中git fsck --unreachable,但只有E的ID将通过显示(并保存)git fsck --lost-found,因为DE/如果恢复该提交,提交是“可访问的”

找到你的承诺

我怎么能找到这个丢失的关键字提交?

这有点棘手。也许您最好的选择是git show对所有无法到达的提交使用,例如:

git show $(git fsck --unreachable | git cat-file --batch-check |
    awk '/commit/ { print $3 }')

现在,您可以在日志消息(或差异)中搜索关键字。内部$(...)序列是提取所有候选ID的方法:我们只需要提交,而不是标签,树和Blob。一旦你的ID,所有的常规Git命令(git log -1git show,等)可与那些使用。


1实际上,我是自己写这个答案才学到的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过关键字提取

通过关键字搜索json

如何使用LoDash通过关键字过滤对象数组?

如何通过关键字识别相似的字符串

如何在列表中创建可以通过关键字访问的列表

如何通过关键字在 Google Play 搜索中获得正确的应用位置?

通过关键字对单元格进行分类

Spring Data Rest通过关键字搜索

Twilio-AvailablePhoneNumbers通过关键字搜索

通过关键字搜索网站内的网页

如何使用SubGit在同步的SVN存储库中找到Git修订哈希?

如何通过提交哈希查询git存储库中的提交文件和每个文件的大小?

如何在 Git 存储库中找到第一个版本的提交

在未找到预期的自连接错误的关键字中找到关键字

如何通过文件哈希从git存储库查找文件修订或提交?

如何在Visual Studio项目中找到关键字

如何在excel中找到带有某个关键字的最后一行

在用户输入中搜索关键字并在字典中找到相应的关键字

在SQL中找到类似的关键字

在HTMLtag内部文字中找到关键字的VBA“ If ... Then”

如何从 Git 命令中找到 Git 哈希?

如何使用SourceTree在git存储库中找到文件?

RobotFramework/RIDE 无法通过示例测试 - “未找到名为 'Run ${sakura}' 的关键字。”

如何在文档中找到一组关键字,全部/某些关键字处于一定距离范围内?

通过关键字提取在熊猫中动态创建列

通过关键字在Django多对多中查询模型继承中的父级

通过关键字将这样的文本子集化的最佳方法是什么?

Laravel 搜索功能通过关键字过滤外键数据

通过关键字重命名熊猫中的多列