我对GIT的情况感到有些困惑.
我正在开发一个GIT版本的项目,我只是注意到我们认为几周前已经在主分支上的一些提交实际上已经丢失了.我记得这些提交是由其他人在功能分支"功能/某事"上推动的,不再存在.
我试图找到那些丢失的提交来修复我们的错误并将它们推到永久分支上.在此团队中,每个开发人员都会在提交消息中提供他正在处理的故障单的ID.所以我肯定知道票证ID(例如1234)在我正在寻找的提交消息中,所以我尝试了:
git log --all --grep=1234
git log -g --grep=1234
git log --all | grep 1234
git reflog | grep 1234
Run Code Online (Sandbox Code Playgroud)
所有这些命令都没有返回.
此时,我正要放弃,然后我记得我们的git repo与Slack集成,所以我在松弛的历史中搜索了1234并发现了提交哈希值.我马上试过了:
git show hash1
git show hash2
Run Code Online (Sandbox Code Playgroud)
令人惊讶的工作!它显示了所有提交信息.所以提交就在那里,不知何故仍在我的本地存储库中.所以我想仔细检查一下我是如何错过它们的:
git reflog | grep hash1
git branch --contains hash1
git fsck --lost-found | grep hash1
Run Code Online (Sandbox Code Playgroud)
没有.
git fsck --unreachable | grep hash1
unreachable commit hash1
Run Code Online (Sandbox Code Playgroud)
在这里,它是在无法访问的提交列表中.
但这是一个很大的项目,并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
Run Code Online (Sandbox Code Playgroud)
用户B:
git clone <repo>
git push origin :feature/something
Run Code Online (Sandbox Code Playgroud)
现在用户B工作数周,然后尝试查找用户A推送的提交"特殊关键字".
tor*_*rek 11
删除分支时,还会删除其reflog.有一个单独的reflog HEAD,它将保留对已删除分支上的提交的引用,但前提是您已将它们签出.
--lost-found和之间的区别--unreachable是微妙的:1请参阅git词汇表和/或下图.一般来说,使用--lost-found和/或--unreachable将会发现这样的提交(并且--lost-found还会在.git/lost-found/commit目录中写入ID ,我认为它具有保护它们免受垃圾收集的副作用).
在这种特殊情况下,您正在寻找的提交不是已删除分支的最尖端提交.也就是说,假设在删除之前feature/something我们有这个,并且在功能分支上进行了两次最近的提交:
A <- B <- C <-- master
\
D <- E <-- feature/something
Run Code Online (Sandbox Code Playgroud)
现在我们删除feature/something,丢失提交的ID E和D两者.两个ID都将显示在输出中git fsck --unreachable,但只有EID会显示(并保存)git fsck --lost-found,因为提交D是从E/ if恢复该提交时"可达" .
我怎么能通过关键字找到这个丢失的提交?
这有点棘手.可能你最好的选择是git show在所有无法访问的提交中使用,例如:
git show $(git fsck --unreachable | git cat-file --batch-check |
awk '/commit/ { print $3 }')
Run Code Online (Sandbox Code Playgroud)
现在,您可以在日志消息(或差异)中搜索关键字.内部$(...)序列是提取所有候选ID的方法:我们只需要提交,而不是标签,树和blob.一旦你的ID,所有的常规Git命令(git log -1,git show,等)可与那些使用.
1事实上,我自己刚刚学会了这个答案.
| 归档时间: |
|
| 查看次数: |
2640 次 |
| 最近记录: |