Github的一个奇技淫巧

背景
前段时间给 VictoriaLogs 提交了一个 PR:
https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4934
本来一切都很顺利,只等合并了,但在临门一脚的时候社区维护人员问我可否给 git commit 加上签名。
于是我就默默的调试到了凌晨四点

以前我也没怎么注意过这个选项,经过 Google 后发现 Idea 在提交的时候可以自行设置。

当我勾选了这个提交新的代码后,依然被告知没有正确的签名,这时我才发现理解错误了。
为 GitHub 的提交签名
结合这位社区大佬给的文档,他所需要的是每次提交的代码都是有签名的,类似于这样:

如果我们想要 GitHub 现实 Verified 这个标签,那就需要对 commit 或者是打的 tag 进行签名。
而签名的方式有三种:GPG, SSH, S/MIME,这里我以 GPG 签名为例,整体流程如下:

先在https://www.gnupg.org/download/这里下载安装 GPG 的命令行程序。
gpg --full-generate-key
使用这个命令生成 key,之后会根据提示录入一些信息,包含你的 ID 和邮箱,建议都和 GitHub 的 ID 邮箱保持一致即可,然后一路回车完事。
之后可以使用这个命令查看刚才创建的 Key:
gpg --list-secret-keys --keyid-format=long
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot <hubot@example.com>
ssb 4096R/4BB6D45482678BE3 2016-03-10
我们需要将 3AA5C34371567BD2 这个 Key 的 ID 字符串复制,之后执行:
gpg --armor --export 3AA5C34371567BD2
# Prints the GPG key ID, in ASCII armor format
此时会打印出公钥,我们将
-----BEGIN PGP PUBLIC KEY BLOCK-----
-----END PGP PUBLIC KEY BLOCK-----
这些数据复制到 GitHub 的个人设置页面:

此时还没完,如果我们直接提交代码的也不会有 Verified 的标签。

我们还需要打开 git 的 config 设置:
git config commit.gpgsign true
# 全局打开
git config --global commit.gpgsign true
git commit -S -m "YOUR_COMMIT_MESSAGE"
git push
这样提交的 Commit 就会打上验证的标签了。

-S 的效果和在 idea 中选中 Sign-off 的效果一样。
官方文档也有详细的步骤:
https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
Squash 合并提交
不过在我这个 PR 的背景下还有一个步骤没有完成,就是我之前提交的 Commit 都没要验证,我需要将他们都合并为一个验证的 Commit 然后在强制推送上去,这样整个 git log 看起来才足够简洁。
最终效果如下,只有一个 Commit 存在。

这时候就得需要 git rebase 出马了。

以刚才测试的这两个提交为例,我需要将他们合并为一个提交。
我们先使用这个命令:
git rebase -i HEAD~N
git rebase -i HEAD~2
N 就是我们需要合并几个提交,在我这里就是 2.

我们需要将除了第一个 commit 之外的都修改为 s,也就是下面注释里的 squash 的简写(压缩的意思)。
这是一个 vim 的交互编辑模式,编辑完成之后保存退出。
不会还有程序员不知道如何保存 vim 退出吧。
保存后又会弹出一个编辑页面,让我们填写这次压缩之后的提交记录,默认会帮我生成好,当然你也可以全部删掉后重写。

我这里就直接使用它生成好的就可以了,依然还是保存退出。
最后再强行推送到我所在的分支即可:
git push origin test-rebase -f
在这个分支的提交页面也只会看到刚才强行推送的记录了,刚才的两个提交已经合并为这一个了。

总结
借着这个机会也了解了 rebase 的骚操作挺多的,不过我平时用的最多的还是 merge,这个倒没有好坏之分,只要同组的开发者都达成一致即可。
Github的一个奇技淫巧的更多相关文章
- C++的一个奇技淫巧
C++如何写一个函数,得到一个数组的长度呢? size_t GetArrayLength(int Array []) { return sizeof(Array)/sizeof(Array[0]); ...
- [git 学习篇]自己在github创建一个远程服务器创库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- Git系列 —— github提交一个空目录
转载自github提交一个空目录 github默认不上传空目录,有的时候需要空目录来保持程序的结构. 两种场景 1.始终保持空目录,即时里面有文件,也全部忽略掉. 建立一个.gitignore文件放到 ...
- utils02_使用github创建一个远程仓库
1.注册github账号 https://github.com/ 2.第一次登陆需要创建一个仓库 3.在本地生成密钥和公钥 ssh-keygen -t rsa 会在当前用户下生成2个文件就是公钥和密钥 ...
- Github不为人知的一个功能,一个小彩蛋
Github 是一个基于Git的代码托管平台,相信很多人都用过,当然这些"很多人"中大部分都是程序员.当你在Github上创建仓库时(Github称项目为仓库),你会给这个仓库添加 ...
- 基于hexo+github搭建一个独立博客
一直听说用hexo搭建一个拥有自己域名的博客是很酷炫的事情~,在这十一花上半个小时整个hexo博客岂不美哉. 使用Hexo吸引我的是,其简单优雅, 而且风格多变, 适合程序员搭建个人博客,而且支持多平 ...
- 第二章-如何使用github建立一个HelloWorld项目,git的add/commit/push/pull/fetch/clone等基本命令用法。--答题人:杨宇杰
1.配置Git 首先在本地创建ssh 秘钥:在git bash输入: $ ssh-keygen -t rsa -C "your_email@youremail.com" eg:$ ...
- 怎样在Github参与一个开源项目
转载:http://www.csdn.net/article/2014-04-14/2819293-Contributing-to-Open-Source-on-GitHub 最近一年开源项目特别的热 ...
- 用命令行在github新建一个项目
Github Repository API中说明了可以通过发送一个请求来认证,之后就能通过命令行自动新建远程仓库了. 认证 curl -u 'username' https://api.github. ...
- 如何在github制作一个网页
1.首先得先注册一个github账号,官网:https://github.com/ 2.注册完,登录账号进入首页,点右上角的 ‘+’ 创建新的仓库 3. 点击setting,选择一个主题, 4. 选完 ...
随机推荐
- hw面试常见中间件漏洞
apache漏洞 未知扩展名解析漏洞 漏洞原理:Apache对文件名后缀的识别是从后往前进行的,当遇到不认识的后缀时,继续往前,直到识别 影响版本:使用module模式与php结合的所有版本,apac ...
- Application of Permutation and Combination
Reference https://www.shuxuele.com/combinatorics/combinations-permutations.html Online Tool https:// ...
- MySQL读取的记录和我想象的不一致
摘要:并发的事务在运行过程中会出现一些可能引发一致性问题的现象,本篇将详细分析一下. 本文分享自华为云社区<MySQL读取的记录和我想象的不一致--事物隔离级别和MVCC>,作者:砖业洋_ ...
- C++内敛函数,构造函数,析构函数,浅拷贝
inline //inline函数可以有声明和实现,但是必须在同一文件//inline函数不能分成头文件和实现文件 inline int add(int x, int y){ //一般不要放循环语句 ...
- 天下苦 Spring 久矣,Solon v2.3.3 发布
Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...
- Python asyncio 库源码分析
Python asyncio 库源码分析 前言 本着 「路漫漫其修远兮, 吾将上下而求索」 的精神.终于要开始深入研究 Python 中 asyncio 的源码实现啦. 本文章可能篇幅较长,因为是逐行 ...
- 反转链表 Java版 图文并茂思路分析带答案(力扣第206题)
反转链表 力扣第206题 我们不只是简单的学习(背诵)一个数据结构,而是要分析他的思路,以及为什么要有不同的指针等等 非递归方式: 思路分析:首先要链表有个头指针没有任何问题 然后,我们要将1的下一个 ...
- Pinot2的无人机任务和数据处理实践
目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...
- 【Azure 媒体服务】Azure Media Player 在Edge浏览器中不能播放视频问题的分析与解决
问题描述 使用Azure Media Service 制作视频点播服务,在客户端使用 Azure Media Player 播放器在 Edge 浏览器中播放视频时候遇见无法播放的问题: 错误信息: T ...
- 从钢铁行业数字化管控与超自动化融合,看华为WeAutomate能力进化
文/王吉伟 钢铁行业的数字化转型,历来都是值得探讨的热点话题. 2022年,我国粗钢产量10.13亿吨,占据了全球钢铁供给市场的半壁江山. 这组数据可谓非常抢眼,但仍旧难掩诸多企业的各种经营问题. 钢 ...