Git 文件从存储库中消失,但在提交历史记录中没有删除

Git 文件从存储库中消失,但在提交历史记录中没有删除,git,bitbucket,atlassian-sourcetree,sourcetree,Git,Bitbucket,Atlassian Sourcetree,Sourcetree,我手头有一个小难题:几个以前提交的文件一夜之间消失了,但没有一个提交表明它们被删除了。怎么会这样 情况如下: 我在BitBucket上有一个私有Git存储库,只有一个分支 我的团队中还有3个人,每个人都使用SourceTree作为git接口 昨天我推送了一个提交,之后存储库就正常了 从那时起,所有其他3名团队成员都推动了几次提交: 一个是本地合并 两个是在线的(即通过网页)README.md编辑 一个是在线(即通过网页)删除一个不相关的文件 其他的则是包含1或2个文件的多个提交 早上,我拉

我手头有一个小难题:几个以前提交的文件一夜之间消失了,但没有一个提交表明它们被删除了。怎么会这样

情况如下:

  • 我在BitBucket上有一个私有Git存储库,只有一个分支
  • 我的团队中还有3个人,每个人都使用SourceTree作为git接口
  • 昨天我推送了一个提交,之后存储库就正常了
  • 从那时起,所有其他3名团队成员都推动了几次提交:
    • 一个是本地合并
    • 两个是在线的(即通过网页)
      README.md
      编辑
    • 一个是在线(即通过网页)删除一个不相关的文件
    • 其他的则是包含1或2个文件的多个提交
  • 早上,我拉了拉存储库,结果发现几个不同的文件从存储库中消失了,这些文件是由不同的人在不同的时间提交的:
    • 它们从本地拷贝中消失了
    • 它们已从project的BitBucket网站的源页面消失
    • 它们从下载页面下载的.zip中消失
  • 然而:
    • 我之后的任何提交都不会删除这些文件
    • 我可以转到先前的提交,该提交修改了一个“消失”的文件,转到其摘要页面,查看其历史记录,并且其中的任何提交都不会删除该文件
  • 我仔细检查了一下,没有人乱动
    .gitignore
    ,但它自去年12月以来一直没有动过
另外,为了进一步混淆这个问题:几个月前,我在一次提交中添加了文件
A.R
test-A.R
。后来我将
test-A.R
重命名为
test.A.R
。现在
A.R
仍在存储库中,但
test-A.R
test.R
都不在存储库中

那么,什么可能会导致文件从Git存储库中删除,而没有任何实际删除它们的提交呢



当然,我向BitBucket support提交了一份支持通知单,但我不太相信他们会迅速响应。

很可能有人强制推送(即
git push-f…
),这意味着本地历史记录中的任何内容都会替换远程上的分支。不需要像您假设的那样,有一个删除东西的提交。如果开发人员从未同步其更改以查看服务器上的所有提交,然后强制推送其过期的历史记录,则可能会丢失提交。这都是假设“私有”存储库意味着您小组中的开发人员都可以写入回购协议

我会调整回购、分支或项目权限,这样就不会再发生这种情况。或者,如果您同意使用gitflow或featureflow方法,则可以要求所有用户使用pull请求。还要确保您的开发人员受过如何使用Git的教育


这里只是一个猜测,但如果每个人都做了更改,但有几个人丢失了提交,那么我的猜测是,没有丢失任何提交的人就是错误的人。

事实证明,其中一个提交确实导致文件消失。我会进一步调查,要么接受你的答案(如果他们真的接受了
git push-f
),要么写我自己的答案(如果问题结果不同)。@Dragomok:要补充这个答案,请查看你是否在其他地方有此回购协议的副本。如果一个开发人员强制推送,那么所有其他开发人员都会有好的原始版本,您可以使用它来重新创建树,因为它应该是这样的。@Dragomok:您可以在他们的机器上使用
git reflog
检查他们做了什么,除非他们删除了他们的repo。它应该给你一个发生的事情的描述。我个人更喜欢回放更改,而不仅仅是提交丢失的文件——保存文件历史和文件本身都很好。但是,这取决于您想在解决问题上花费多少精力。(您可能希望研究分支权限,在分支权限中,不能信任不执行破坏性操作的开发人员不允许推送到master).@Dragomok如果您从服务器中退出,并且具有提交的服务器历史记录,并且您可以进行硬重置以获取文件,那么是的,有人提交了一些内容以使文件消失,您的目标应该是检查每次提交,以找出问题发生的时间。