Git无意中撤消了远程分支的更改

Git无意中撤消了远程分支的更改,git,version-control,Git,Version Control,我们有一个我认为是典型的git设置,有一个“源”存储库,多个用户,每个用户都有自己的存储库,获取和推送到,每个用户管理自己的分支,然后合并到主分支 然而,来自某个用户的提交和推送导致另一个用户的更改被撤消:两个用户都修改了相同的文件,我希望并期望这些更改合并在一起,我相当肯定这次提交与冲突没有任何关系 我不知道如何调查发生了什么,更不用说如何防止这种情况再次发生。我怎样才能知道发生了什么,以及将来可以做些什么来防止它 编辑:从@antak请求澄清的回答来看,这些更改是“撤消”的,不是从历史记录中

我们有一个我认为是典型的git设置,有一个“源”存储库,多个用户,每个用户都有自己的存储库,获取和推送到,每个用户管理自己的分支,然后合并到主分支

然而,来自某个用户的提交和推送导致另一个用户的更改被撤消:两个用户都修改了相同的文件,我希望并期望这些更改合并在一起,我相当肯定这次提交与冲突没有任何关系

我不知道如何调查发生了什么,更不用说如何防止这种情况再次发生。我怎样才能知道发生了什么,以及将来可以做些什么来防止它


编辑:从@antak请求澄清的回答来看,这些更改是“撤消”的,不是从历史记录中删除提交,而是从git节目中看,他们手动删除了更改(但他们不是故意这么做的)。

询问他们是否使用了push-f?如果使用-f标志,它将用您的更改覆盖分支,而不考虑其他更改。可能有一个开发人员尝试推送,git拒绝了推送,因为在他开始工作后已经发生了其他更改,并且不知道他应该使用fetch/pull/merge,只是做了一个push-f


如果是这样的话,可以考虑在Git服务器上设置收件人.dNyNoNoFrdFrue到true,这将禁止重写历史(反过来,使用推-F来禁止其他更改)

< P>用户>代码> A/<代码>的推送和未撤消的用户<代码> B/<代码>文件>代码> C <代码>…< /P> 你如何定义“撤销”?
B
的提交是否从历史记录中消失

如果答案是否定的,以下可能是发生的情况:

  • 用户
    A
  • 用户
    A
    在工作树中用他/她在别处修改的旧版本重写文件
    C
  • 用户
    A
    提交并推送
  • 您可以通过查看
    C
    的历史记录,使用类似于
    git log-p
    的选项,轻松确定是否存在这种情况


    如果答案是肯定的,那么唯一可能发生这种情况的方法(除了
    git
    中的故障)是
    a
    使用
    git push-f
    进行推送。如果是这种情况,您可以通过拒绝对
    源站的非快进推送来防止将来发生这种情况。这可以通过在存放
    origin
    的存储库中将
    git config
    变量
    receive.denynonfastforts
    设置为
    true
    来实现。我们发现了发生的事情。一个用户正在从自己的git存储库远程编辑文件,并通过SCP上传更改的文件。他们还获取/合并到此存储库中,但并不总是将更改的文件下载到本地工作区。因此,事件链:

    • 从git repo下载到本地工作区
    • 对当地工作区域进行一些更改
    • 在git repo中获取并合并来自其他用户的所有更改
    • 从本地工作区上传到git回购(从而丢失上一步的更改)
    • 承诺

    我不能完全确定,但我怀疑没有。我们最终发现了这一点,因为用户正在(不必要地)从自己的git repo远程工作,并通过SCP上传到它。我将在另一个答案中发布详细信息,但接受这个答案。