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

Github签入会在未采用最新版本时覆盖更改,git,github,egit,tortoisegit,Git,Github,Egit,Tortoisegit,我的团队将存储库存储在GitHub中。如果developer1(在本地repo中)修改了文件(file1)并将其提交到远程存储库。现在,另一个人(developer2)在本地repo中修改同一个文件,而不同步来自远程repo的最新文件,更改将提交到远程repo(强制推送)。GitHub远程存储库或git客户端没有发出警告(我们使用的是Tortoise git客户端或eGit)。请建议是否有办法通过在远程存储库或git客户端中进行任何设置更改来防止这种情况 可能需要git钩子中的某些设置?更新-问

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


可能需要git钩子中的某些设置?

更新-问题最初没有指定强制推送。这完全改变了答案(尽管询问者可能不喜欢这种方式);保留原始答案以供参考,因为这仍然是协调更改的正确方法


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

由于强制推送意味着“我想覆盖历史”,git不会以警告来响应您即将覆盖历史

您可以使用
--force with lease
代替
--force
。这允许您明确地告诉git您希望从历史记录中覆盖什么,git将失败操作,并警告您实际覆盖的历史记录是否与此不同(即,因为有人推了您还不知道的内容)

但这种“增加的安全性”仍然不足以让强制推送成为您日常工作流程的一部分。在99.99999%的情况下,更好的解决方案是培训开发人员不要强制推送,而是尊重git在常规推送中给出的错误,它准确地告诉您需要做什么才能将您的更改与队友的更改同步


原始答复:

问题标题中的前提不正确;第二个开发人员更改不会“覆盖”第一个开发人员更改

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

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

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

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

将更改提交到远程回购(强制推送)

只有当推的人不辞辛劳地强迫推的时候才会发生这种情况

这就是你的问题:人们决定显式覆盖他们没有做的工作

在Git中,您需要

git config receive.denyNonFastForwards true
git config receive.denyDeletes true
(还有更多可用的粒度,请参阅git配置文档)在接收端阻止人们对回购进行这种操作


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

将名为execute_me.sh的文件添加到您的存储库中,其中包含以下内容:
echo“echo\”开始工作之前,请访问http://git-scm.com/doc\“>/etc/bashrc
-如果是认真的,拉取和合并是像git这样的分散版本控制系统的基本概念。为了更清楚,编辑了这个问题。如果开发人员在将更改推送到远程repo之前没有同步远程repo的最新版本,是否有方法发出警告或抛出错误。记得我以前的一个项目中使用了git钩子(pre-commit)来阻止它,但不记得到底做了什么。编辑了这个问题以使问题更清楚。如果开发人员在将更改推送到远程repo之前没有同步远程repo的最新版本,是否有方法发出警告或抛出错误。记得我以前的一个项目中使用了git钩子(pre-commit)来阻止它,但不记得到底做了什么。但是在我们的例子中,开发人员在提交时没有收到错误消息。他们也没有明确表示在推动变革的同时强制推进。那么默认设置是强制推送吗?如果他们在配置文件中进行更改,如@jthill所述:“git-config-receive.denynonfastforts-true”和“git-config-receive.denyDeletes-true”否,默认情况下不会强制推送。你不断地说,当他们犯错误时,你期望发生错误;这不是它的工作原理。提交操作不与远程服务器通信。如果需要,您可以将原始repo配置为完全禁止强制推送(您描述的设置),但通常没有理由这样做。