我对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
,同时丢失提交IDE
和D
两者。这两个ID都将显示在的输出中git fsck --unreachable
,但只有E
的ID将通过显示(并保存)git fsck --lost-found
,因为D
从E
/如果恢复该提交,提交是“可访问的” 。
我怎么能找到这个丢失的关键字提交?
这有点棘手。也许您最好的选择是git show
对所有无法到达的提交使用,例如:
git show $(git fsck --unreachable | git cat-file --batch-check |
awk '/commit/ { print $3 }')
现在,您可以在日志消息(或差异)中搜索关键字。内部$(...)
序列是提取所有候选ID的方法:我们只需要提交,而不是标签,树和Blob。一旦你的ID,所有的常规Git命令(git log -1
,git show
,等)可与那些使用。
1实际上,我是自己写这个答案才学到的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句