Github 签入会在未采用最新时覆盖更改

Github checkins overrides changes when latest is not taken

我的团队将存储库存储在 GitHub 中。如果文件 (file1) 已被 developer1(在本地存储库中)修改并提交到远程存储库。现在,另一个人(developer2)修改了他本地仓库中的同一个文件,但没有从远程仓库同步最新的文件,这些更改被提交到远程仓库(强制推送)。 GitHub 远程存储库或 git 客户端(我们使用 Tortoise Git 客户端或 eGit)没有警告。请建议是否有办法通过在远程存储库或 git 客户端中进行任何设置更改来防止这种情况。

可能需要 git 挂钩中的一些设置?

UPDATE - 问题最初没有指定强制推送。这完全改变了答案(虽然不是以提问者可能会欣赏的方式);保留原答案以供参考,因为它仍然是协调变化的正确方法。


强制推送具体是指推送的人想要覆盖历史。如果这不是故意的,那么就不应该使用力推。通常这种问题组合意味着有人尝试推送,当他们遇到需要先同步的错误时,认为强制推送听起来更容易。

由于强制推送意味着 "I want to override history",git 不会以您即将覆盖历史记录的警告作为响应。

您可以使用 --force-with-lease 而不是 --force。这允许你明确地告诉 git 你希望从历史中覆盖什么 什么 ,并且 git 将失败操作并警告你如果你的历史是 实际上覆盖与此不同(即因为有人推送了你还不知道的东西)。

但是 "added safety" 仍然不足以让强制推送属于您的日常工作流程。在 99.99999% 的所有情况下,更好的解决方案是培训您的开发人员不要强制推送,而是尊重 git 在定期推送时给出的错误,它会告诉您确切需要发生什么才能将您的更改与那些同步你的队友。


原答案:

你题中的前提不正确;第二个开发人员更改 not "override" 第一个开发人员更改。

集成更改的时间点是在回购与推送和获取(或拉取)之间同步时。每个本地回购(克隆)都是一个独立的回购,用户可以 - 必须能够 - 提交而不用担心其他人是否可能已经提交到不同回购中的相应分支.

由于您希望 GitHub 警告 developer2,我认为这意味着 developer1 已提交并推送了他们的更改。这很好。所以现在 developer2 提交了一些更改,还没有从远程更新。还可以。现在 当 developer2 尝试推送 时,会出现一个错误,提示 developer2 的分支不是最新的。 是git 避免丢失 developer1 的更改的方法。

因此 developer2 将被告知在允许推送之前获取并合并(或变基)或拉取最新的更改。

git模型是分布式开发的一种。开发人员能够独立提交是必不可少的,事实上,您不希望尝试合并尚未提交的更改,因为如果出现问题,您可能会丢失这些更改。所以合并总是在本地完成,并且总是在提交的更改之间进行。

the changes get committed to remote repo (force pushed)

只有当推动者不遗余力地强制推动时,才会发生这种情况。

那是你的问题:人们决定明确覆盖他们没有做的工作。

在Git,你做

git config receive.denyNonFastForwards true
git config receive.denyDeletes true

(并且有更多可用的粒度,请参阅 git 配置文档)在接收端阻止人们对 repo 这样做。

GitHub 不允许直接访问该级别的存储库管理,它们是前端。他们称他们的调味品为“protected branches”。