0

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

但是,来自用户的提交和推送导致来自另一个用户的更改被撤消:两个用户都修改了相同的文件,我希望并且期望这些更改将合并在一起,我相当确定这一点commit 与冲突没有任何关系。

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

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

4

3 回答 3

1

用户A的 推送 和 撤消 用户B在 文件 中 的 工作C...

你如何定义“撤消”?的提交是否B从历史中消失了?

如果答案是否定的,这可能是发生了什么:

  1. 用户A拉。
  2. 用户用他/她在别处修改过的旧版本A 覆盖了工作树中的文件。C
  3. 用户A提交并推送。

您可以通过C使用类似git log -p.

如果答案是肯定的,那么可能发生这种情况的唯一方法(没有出现故障git)是A使用git push -f. 如果是这种情况,您可以通过拒绝非快进推送来防止它在将来发生origin。这可以通过将git config变量设置receive.denyNonFastForwardstrue包含origin.

于 2013-04-12T09:58:05.130 回答
1

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

如果事实证明是这种情况,您可以考虑在 git 服务器上将 receive.denyNonFastForwards 设置为 true,这将禁止重写历史记录(反过来,使用 push -f 来破坏其他更改)

于 2013-04-12T09:32:06.963 回答
0

我们发现了正在发生的事情。一位用户正在从他们自己的 git 存储库远程编辑文件,并通过 SCP 上传更改的文件。他们也在获取/合并到这个存储库,但并不总是将更改的文件下载到他们的本地工作区。所以事件链:

  • 从他们的 git repo 下载到他们的本地工作区
  • 对他们的本地工作区进行一些更改
  • 在他们的 git repo 中获取 + 合并来自其他用户的所有更改
  • 从他们的本地工作区上传到他们的 git repo(从而丢​​失上一步的更改)
  • 犯罪
于 2013-12-30T12:03:39.777 回答