当前位置: 首页 > news >正文

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

由于 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 的描述
▲ 如果你想吐槽那段中文翻译,我只想说——那是 Git 的官方中文文档

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

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

参考资料

  • Git - git-push Documentation
  • How do I properly force a Git push? - Stack Overflow
  • Force-with-lease: an alternative to force push - Weiqing
  • –force considered harmful; understanding git’s –force-with-lease - Atlassian Developers

相关文章:

  • 项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)
  • 理解 C# 项目 csproj 文件格式的本质和编译流程
  • 如何创建一个基于命令行工具的跨平台的 NuGet 工具包
  • 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包
  • 如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference)
  • 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译
  • C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖
  • 神器如 dnSpy,无需源码也能修改 .NET 程序
  • Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的
  • 如何根据一个绝对文件路径生成一个相对文件路径
  • 如何使用 MSBuild Target(Exec)中的控制台输出
  • C#/.NET 中推荐的 Dispose 模式的实现
  • Windows 10 四月更新,文件夹名称也能区分大小写?
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • js对象的深浅拷贝
  • js如何打印object对象
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • 百度地图API标注+时间轴组件
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于Java中分层中遇到的一些问题
  • 机器学习 vs. 深度学习
  • 记一次删除Git记录中的大文件的过程
  • 讲清楚之javascript作用域
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端之React实战:创建跨平台的项目架构
  • 少走弯路,给Java 1~5 年程序员的建议
  • 微信开源mars源码分析1—上层samples分析
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一个项目push到多个远程Git仓库
  • 云大使推广中的常见热门问题
  • Prometheus VS InfluxDB
  • ​iOS实时查看App运行日志
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​什么是bug?bug的源头在哪里?
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #Ubuntu(修改root信息)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • %@ page import=%的用法
  • (pojstep1.1.2)2654(直叙式模拟)
  • (离散数学)逻辑连接词
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)uboot源码分析
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net 调用php,php 调用.net com组件 --
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .sdf和.msp文件读取
  • /boot 内存空间不够
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka