Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Git 更安全的强制推送,--force-with-lease

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

作者头像
walterlv
发布于 2018-09-18 05:00:43
发布于 2018-09-18 05:00:43
3.5K0
举报

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)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
git初入门(四):远程仓库操作
申请到了 Git 远程仓库的帐号并创建了一个空的远程仓库现在我们就可以结合本地的仓库与远程仓库一起协同工作了,模拟多人协同开发,这里我们全部使用命令完成。
传说之下的花儿
2023/09/17
4870
git初入门(四):远程仓库操作
git 入门教程之协同开发 原
前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的保障手段,现在我们先简单回忆下相关概念,以便为接下来的协同开发做好铺垫!
雪之梦技术驿站
2019/04/03
8530
git 入门教程之协同开发
                                                                            原
Git 工作流的正确打开方式
前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候。这才注意到git 工作流并不是那么简单。比如,之前遇到的清理历史。百度到的资料很多,重复性也很多,但实践性操作很少,我很难直接理解其所表达的含义。直接望文生义经常得到错误的结论,只能用时间去检验真理了,不然看到的结果都是似懂非懂,最后还是一团糟。 学习git工作流 1. 最简单的使用,不推荐 1.1.创建仓库 $ pwd /home/ryan/workspace/l4git-workflow $ touch readme.md
Ryan-Miao
2018/03/14
1.8K0
Git 工作流的正确打开方式
git命令学习
git一键三连 git add . git commit -m "commit code" git push 查看本地库状态 git status 添加文件到暂存区 git add <file> 删除暂存区文件 git rm --cached <file> 将暂存区的文件提交到本地库 # "first commit" 提交信息 git commit -m "first commit" <file> 提交本地分支到远程库 git push 仓库别名/仓库地址 分支名 查看历史版本 # 查看历史版本日志 g
shaoshaossm
2022/12/26
3460
git命令学习
git的分支远程连接和远程分支的拉取推送及冲突处理
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
不会飞的小鸟
2020/07/22
2.4K0
Git入门学习到进阶3
但是在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正可以第一次自由参与各种开源项目了。
全栈工程师修炼指南
2022/09/28
5170
Git入门学习到进阶3
【Git】五、多人协作
​ 对于其中的开发者1,我们可以直接使用我们的云服务器,在上面进行新增;而对于开发者2,我们可以在 windows 下操作!
利刃大大
2025/02/22
1140
【Git】五、多人协作
iOS开发-git使用
配置全局的用户名和密码— 其他地方可以不配置 git config —global user.name “why" git config —global user.email “why@163.com" 正对整个项目的文件添加 git add .
孙寅
2020/06/02
8810
3.5 Git 分支 - 远程分支
远程引用是对远程仓库的引用(指针),包括分支、标签等等。 你可以通过 git ls-remote (remote)来显式地获得远程引用的完整列表,或者通过 git remote show (remote) 获得远程分支的更多信息。 然而,一个更常见的做法是利用远程跟踪分支。
shaonbean
2019/05/26
1.4K0
如何优雅的使用Git版本控制工具
 Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。
非著名运维
2022/06/22
1.3K0
如何优雅的使用Git版本控制工具
Git 常用命令清单笔记
这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加的,后面慢慢增加了许多内容,可以看出的的学习轨迹。分享出来方便自己查看,也许能帮助到你。
小弟调调
2018/09/11
7890
GIT
1 编写忽略文件 C:\Users\shiye\Java.gitignore 详细可以参考:https://github.com/github/gitignore
用户5927264
2019/10/28
4530
GIT
【linux命令讲解大全】013.Git:分布式版本控制系统的先驱和常用命令清单(二)
我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。
全栈若城
2024/03/02
1170
Git之Rebase
在上一节我们看到了,多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功。 每次合并再push后,分支变成了这样: $ git log --graph --pretty=oneline --abbrev-commit * d1be385 (HEAD -> master, origin/master) init hello * e5e69f1 Merge branch 'dev' |\ | * 57c53ab (or
兮动人
2021/06/11
4570
7.11 Git 工具 - 子模块
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。
shaonbean
2019/05/26
1.5K0
git 分支+标签+别名配置管理
一、来段大白话 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。 如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,
老七Linux
2018/05/31
1.1K0
【Git】三、远程管理
​ 我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统!什么意思呢❓❓❓
利刃大大
2025/02/14
870
[译]从仓库中移除敏感信息
如果你将敏感数据(如密码或 SSH 密钥)提交到 Git 仓库,你能够将其从历史记录中删除。 要从仓库的历史记录中完全删除不需要的文件,你可以使用 git filter-branch命令或 BFG Repo-Cleaner。
madneal
2022/03/11
1K0
杂篇:一首诗认识[- Git -]
本文用一首诗的版本控制,简单认识一下Git,源码可见: Git的安装,环境配置什么的我就不废话了(新手请进,高手慎入...) ---- 一、创建与提交 1.《应龙》: v0.01 捷特写了一首诗《
张风捷特烈
2020/04/30
6430
杂篇:一首诗认识[- Git -]
净化Git之rebase变基的使用
git rebase能够将分叉的分支重新合并,之前写过一篇文章介绍它的原理,下面主要介绍它的两个使用场景:
sunsky
2020/08/20
1.4K0
相关推荐
git初入门(四):远程仓库操作
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档