Git:在git中查找已删除的文件,未在日志中记录的提交

3
我犯了一个错误,需要恢复一个从我的GitHub仓库中某种方式被删除的文件。该文件是在GitHub在线界面上编辑和创建的markdown文件,因此它没有显示在我的本地日志中,在git fetchgit pull后也没有出现。我阅读了这里的许多其他帖子,以查找已删除的文件,但它们并不适用于我的情况:
例如,对于此帖子:Git:如何在项目提交历史记录中搜索已删除的文件? 运行建议的命令: git log --all -- **/thefile.* 没有产生任何结果(根本没有打印任何内容)。我还运行了查找所有文件删除的git历史记录的命令: git log --all --diff-filter=D --summary 但没有找到我要找的内容。
我认为这与我直接在GitHub远程仓库中创建和编辑文件有关。它可能从未出现在我的本地仓库中,并且可能已经通过推送某种方式被覆盖。我对Git相对不熟悉,所以不确定如何继续。有没有关于如何继续的建议,或者我只能认命了?是否有一系列事件可以导致这种情况,我可以在未来避免?谢谢!

2
只要你在某个时间点提交了该文件,它可能就在附近。您是否运行了 git fetch 以确保您拥有本地的所有内容?您的存储库是否公共,以便我们可以帮助查看? - Kristján
1个回答

4

如何查找仓库的更改时间?

最终结论:您应该使用git bisect来完成此任务。


详细解释:

如果您希望像以前一样手动搜索日志,您可以使用git log --cc命令(git版本> 2.X)。它将显示每个提交中的更改列表。

当然,您也可以将其转储到文件并搜索文件内容或屏幕。

enter image description here


如果我有太多的提交要手动查看怎么办?

这就是git bisect发挥作用的地方。 git bisect会搜索您的存储库,并根据给定的退出代码确定哪个提交开始了“问题”。

您可以手动使用bisect,也可以将脚本传递给它以自动化该过程(请参见下面的bisect run)。


“bisect”命令通过二分搜索您的提交历史记录,帮助您尽快确定哪个提交引入了问题。 假设您刚刚将代码发布到生产环境中,您收到关于某些在开发环境中未发生的问题的错误报告,并且您无法想象为什么代码会这样做。您回到代码,结果发现可以重现该问题,但是无法弄清楚出了什么问题。 您可以使用“bisect”命令找出问题所在。 首先运行“git bisect start”以启动过程,然后使用“git bisect bad”告诉系统当前提交有问题。接下来,必须使用“git bisect good [good_commit]”告诉bisect上一个已知的良好状态是什么...

二分运行

如果您有一个可以判断当前源代码是好还是坏的脚本,则可以通过发出以下命令进行二分运行:

git bisect run my_script arguments

请注意,脚本(在上面的示例中为my_script)应该在当前源代码是好/旧时以0代码退出,并且在当前源代码是坏/新时以1到127(含)之间的代码退出,除了125。任何其他退出代码都将中止二分过程。特殊的退出代码125应该用于当前源代码无法测试的情况。如果脚本以此代码退出,则将跳过当前修订版(请参见git bisect skip)。选择125作为此目的的最高合理值,因为126和127由POSIX shell用于信号特定的错误状态(127是命令未找到,126是命令已找到但不可执行-就bisect run而言,这些细节并不重要)。

这里有一个关于它如何工作的图形演示
http://www.effectiveperlprogramming.com/wp-content/uploads/bisect1.png

enter image description here

这里是我在 GitHub 仓库中的样例代码,可以看看如何使用它。

enter image description here


很棒的答案,我之前没有考虑过使用这种方法。我的唯一问题是我在标记“好”和“坏”的版本时遇到了麻烦。我在历史记录中根本找不到该文件,我只是在GitHub上写了一个长长的Markdown页面与同事分享。我的脚本测试了该文件是否存在,但我认为为了让“好”的提交通过二分查找,我必须能够找到包含该文件的提交。有什么解决办法吗?非常感谢你如此深入思考并给出的答案! - kingb12
3
嘿,我制作了那张图片,多年后在寻求关于我已经写过的东西的帮助。当我搜索某些东西并找到自己的答案时,情况变得更糟了。 :) - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接