Git 更安全的强制推送,--force-with-lease

Git 更安全的强制推送,--force-with-lease

发布于 2018-05-07 11:16 更新于 2018-09-01 00:08

由于 git rebase 命令的存在,强制将提交推送到远端仓库似乎也有些必要。不过都知道 git push --force 是不安全的,这让 git rebase 命令显得有些鸡肋。

本文将推荐 --force-with-lease 参数,让我们可以更安全地进行强制推送。


--force-with-lease 参数自 Git 的 1.8.5 版本开始提供,只在解决 git push --force 命令造成的安全问题。

那么 git push --force 命令有什么安全问题?

--force 会使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!就算在强制推送之前先 fetch 并且 mergerebase 了也是不安全的,因为这些操作到推送之间依然存在时间差,别人的提交可能发生在这个时间差之内。

--force-with-lease 将解决这种安全问题

使用了 --force-with-lease 参数之后,上面那种安全问题就没有那么危险了。

使用此参数推送,如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加 --force 参数时的拒绝是一样的。

walterlv$ git push --force-with-lease To https://github.com/walterlv/walterlv.github.io.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/walterlv/walterlv.github.io.git'

请特别注意——如果你 fetch 之后在本地的 origin 相关分支上已经看到了别人的提交,依然进行强制推送,你还是会覆盖别人的提交。也就是说,--force-with-lease 解决的是本地仓库不够新时,依然覆盖了远端新仓库的问题,如果你执意想要覆盖远端提交,只需要先 fetch 再推送,它也不会拒绝的

在使用 git push --force-with-lease 命令被拒绝时,你需要 fetch 仓库,然后确认其他人是否对此分支有新的修改,如果没有,你才可以继续强制推送。

walterlv$ git fetch remote: Counting objects: 46, done. remote: Compressing objects: 100% (29/29), done. remote: Total 46 (delta 21), reused 40 (delta 15), pack-reused 0 Unpacking objects: 100% (46/46), done. From https://github.com/walterlv/walterlv.github.io e75edf0..217a49d master -> origin/master

fetch 完毕之后,请一定检查此分支是否已经被其他人修改,如果有新的提交,你应该进行一次 merge 或者 rebase

walterlv$ git rebase First, rewinding head to replay your work on top of it... Applying: Add post "safe push using force with lease".

此后,再次进行推送或强制推送即可。

walterlv$ git push --force-with-lease Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 363 bytes | 363.00 KiB/s, done. Total 4 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), completed with 3 local objects. To https://github.com/walterlv/walterlv.github.io.git 219a6d5..dff94a5 master -> master

额外的问题:为什么推送到远端的提交还依然要用 rebase?

Git 官方文档对 rebase 有如下描述:

▲ 如果你想吐槽那段中文翻译,我只想说——那是 Git 的官方中文文档

既然已经推送的提交不应该再进行 rebase,那本不应该会遇到本文提到的问题。但是——GitHub 的工作流或者 GitLab 的工作流中,都有一种行为是 rebase 自己的分支到 origin/master 上,以保证 master 分支上的提交是纯粹的干净的。也就是说,本意是禁止对合并到 masterdevelop 分支上的提交进行 rebase;但对于自己的 temp 分支或者 feature 分支,因为提交还没有合并到主干中,随时删除掉或者将历史进行美化也不会造成太大的问题。

▲ 这是 GitLab 上的设置,可以要求提交者必须进行 rebase 才允许合并

参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/safe-push-using-force-with-lease.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

CVE-2018-8174 “双杀”0day漏洞复现

最近360核心安全事业部高级威胁应对团队在全球范围内率先监控到了一例使用0day漏洞的APT攻击,捕获到了全球首例利用浏览器0day漏洞的新型Office文档攻...

26800
来自专栏Jed的技术阶梯

Kafka 核心组件之协调器

假设某 topic 有4个分区,消费者组中只有一个消费者,那么这个消费者将消费全部 partition 中的数据。

80740
来自专栏nice_每一天

转载《分布式任务调度平台XXL-JOB》

XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

27720
来自专栏腾讯云存储团队

使用 s3browser 管理腾讯云 COS 存储桶文件

腾讯云 COS 有提供一个桌面工具 cosbrowser,可以可视化管理 COS 存储桶文件,支持 Windows、macOS。

58160
来自专栏北京马哥教育

黑客的Linux神技能:使用环境变量进行提权

在这篇文章中,我将会为大家介绍一些使用环境变量进行Linux提权的方法,包括在CTF challenges中使用到一些的技术。话不多说,让我们进入正题!

21200
来自专栏FreeBuf

数字取证技术 | Windows内存信息提取

0×00概述 后面会花一部分时间,写一些数字取证相关的文章。攻击技术贴多如牛毛,眼下不管是网安,还是安全厂商, 欠缺的是对取证技术的研究。 大致想了一下,主要会...

42960
来自专栏walterlv - 吕毅的博客

Windows 无法删除文件夹 —— 访问被拒绝 / 因为目录不是空的

发布于 2018-08-13 09:21 更新于 2018-09...

1.6K10
来自专栏FreeBuf

LaserCrack:一款可扩展的暴力破解框架

lasercrack是一款爆力破解工具,现如今市面上常见的暴力工具如hydra,medusa都有着不错的破解效率,不过我还没有找到ruby写的,一方面是想从原理...

15620
来自专栏.net core新时代

在线文档预览方案-office web apps

  最近在做项目时,要在手机端实现在线文档预览的功能。于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览。这些方案没有具体实现代码,也没有...

1.5K90
来自专栏云计算教程系列

如何在CentOS 7上使用MEAN.JS安装MEAN堆栈

术语MEAN最初由Valeri Karpov创造,该术语源自每个组件的第一个字母。Valeri在这篇博客文章中定义了MEAN ,其中他给出了选择在MEAN堆栈的...

8300

扫码关注云+社区

领取腾讯云代金券