我们见过平安因一个需求,程序员和产品经理打架被开除的个案。现在看来码农打架已经算温柔的了,前几天来自美国的一名程序员因同事不写注释,不遵循驼峰命名,括号换行,最主要还天天 git push -f 等因素枪击了 4 名同事,导致一人情况危急。凶手已死,身份现已由警方查明;一名员工情况危急,两人伤情严重。
本周,一名程序员在WTS Paradigm这家美国企业资源规划软件(ERP)开发商的办公楼持枪杀人,警方已查出了他的姓名。他向四名同事开火,导致一人情况危急。
周三上午10点20分左右,43岁的安东尼·汤(Anthony Tong)出现在办公室,拿出一把事先藏起来的半自动手枪开火。他在威斯康星州米德尔顿的这家公司工作了一年多。
工作人员纷纷逃离办公楼,跑到附近的公司避难。
行凶者随后向短短几分钟内赶到WTS Paradigm现场的警察开枪。四名警察随后开火,击中了嫌犯。嫌犯一送到医院就被宣布死亡。
WTS Paradigm的业务分析员朱迪·拉默斯(Judy Lahmers)说,当时自己正伏案工作,突然听到“像是有人把木板扔在地上,声音很响很响”。拉默斯说,她赶紧跑出大楼,躲在一辆汽车后面。
她说,办公楼的玻璃大门被打碎了。
她告诉美联社:“我头也不回地拼命跑。你只想知道‘该躲起来还是跑远?”
她表示她知道一名同事被子弹擦伤,但无大碍。她不知道关于枪击案的任何其他信息,但表示“完全出人意料。我们都是搞软件的。我们是很好的团队。”
2018年9月19日,紧急救援人员抵达威斯康星州米德尔顿WTS软件公司的枪击现场。据市政府官员称,四人在麦迪逊郊区的枪击事件中受枪伤。
这家ERP公司的营销经理赖安·梅兰德(Ryan Mayrand)在昨天的一份声明中说:“WTS Paradigm的整个团队对今天发生在米德尔顿办公室的这起事件感到震惊和伤心。”
“我们向我们的所有员工及其家属表示最诚挚的问候。遇到这种情况下,你明白抱团取暖有多重要。我们为米德尔顿警察局、戴恩县警长办公室及其他急救人员深表谢意,他们的反应非常迅速。”
在周四招开的记者招待会上,警方表示这名死者自去年4月以来一直在WTS工作,没有犯罪记录,枪击事件发生时独自作案。目前,没有任何迹象表明到底是什么原因引发了这起流血事件;警方已呼吁目击者与警方取得联系。
一名受害者仍情况危急,另外两人身受重伤。第四个人被子弹擦伤。受害者的身份尚未确定。如下是WTS公司官方网站首页:
这件事目前在国外引起了广泛的讨论,有人猜测说可能是:“同事不写注释,不遵循驼峰命名,括号换行,最主要还天天 git push -f 等因素”激怒了这名行凶者。还有人猜测是 PM 老改需求!不管真实情况如何,我们都应该具有认真的人生。
那么回到问题本身,如何规避这个问题呢?
Git 远程仓库简介
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
在这类系统中,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
Git Push
所以不可避免的远程仓库和本地仓库会有版本冲突,产生如何同步的问题,git 常用命令流程图如下:
git push命令用于将本地分支的更新,推送到远程主机。
$ git push <远程主机名> <本地分支名>:<远程分支名>
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
Git Push -f
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这是正常合理的代码提交流程。 这时,如果你一定要推送,可以使用--force选项。
$ git push --force origin
上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。同事之前推送的代码会被你抹掉,他可能刚刚提交了一整个功能模块的代码,也许是一周的工作量。如果大家都不小心更新你的版本,OMG,前功尽弃。 除非你很确定要这样做,否则应该尽量避免使用--force选项。
怎么样避免使用 –force 选项?
1.只给自己用,要坑就坑自己。
我自己在工作的时候,通常会开一个分支出去做,但做完发现Commit 太过琐碎,便会想使用Rebase 来整理一下这个分支。虽然Rebase 是修改历史没错,但因为这个历史影响的范围只有我自己这个分支,所以并不会影响其它人正常使用:
$ git push -f origin features/my_branch
这样只会强制更新features/my_branch这个分支的内容,不会影响其它分支。
2.设置保护机制
但总是有人可能不小心使用了-f参数来Push,GitHub网站有提供保护机制,可以避免某个分支被Force Push。请到仓库的「Settings」页签,左边选择「Branches」,添加保护的规则:
同样,码云gitee.com等有也有样的设置(不过要付费企业项目):
如何回滚?
如果不考虑刚才–force提交的代码,救回来其实还满简单的,就是换你或是其它有之前进度的队友,再次进行git push -f指令一次,把正确的内容强迫推上去,盖掉前一次的git push -f所造成的灾难。
感谢同事不杀之恩▼