背景

前段时间给 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的一个奇技淫巧的更多相关文章

  1. C++的一个奇技淫巧

    C++如何写一个函数,得到一个数组的长度呢? size_t GetArrayLength(int Array []) { return sizeof(Array)/sizeof(Array[0]);  ...

  2. [git 学习篇]自己在github创建一个远程服务器创库

    现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...

  3. Git系列 —— github提交一个空目录

    转载自github提交一个空目录 github默认不上传空目录,有的时候需要空目录来保持程序的结构. 两种场景 1.始终保持空目录,即时里面有文件,也全部忽略掉. 建立一个.gitignore文件放到 ...

  4. utils02_使用github创建一个远程仓库

    1.注册github账号 https://github.com/ 2.第一次登陆需要创建一个仓库 3.在本地生成密钥和公钥 ssh-keygen -t rsa 会在当前用户下生成2个文件就是公钥和密钥 ...

  5. Github不为人知的一个功能,一个小彩蛋

    Github 是一个基于Git的代码托管平台,相信很多人都用过,当然这些"很多人"中大部分都是程序员.当你在Github上创建仓库时(Github称项目为仓库),你会给这个仓库添加 ...

  6. 基于hexo+github搭建一个独立博客

    一直听说用hexo搭建一个拥有自己域名的博客是很酷炫的事情~,在这十一花上半个小时整个hexo博客岂不美哉. 使用Hexo吸引我的是,其简单优雅, 而且风格多变, 适合程序员搭建个人博客,而且支持多平 ...

  7. 第二章-如何使用github建立一个HelloWorld项目,git的add/commit/push/pull/fetch/clone等基本命令用法。--答题人:杨宇杰

    1.配置Git 首先在本地创建ssh 秘钥:在git bash输入: $ ssh-keygen -t rsa -C "your_email@youremail.com" eg:$ ...

  8. 怎样在Github参与一个开源项目

    转载:http://www.csdn.net/article/2014-04-14/2819293-Contributing-to-Open-Source-on-GitHub 最近一年开源项目特别的热 ...

  9. 用命令行在github新建一个项目

    Github Repository API中说明了可以通过发送一个请求来认证,之后就能通过命令行自动新建远程仓库了. 认证 curl -u 'username' https://api.github. ...

  10. 如何在github制作一个网页

    1.首先得先注册一个github账号,官网:https://github.com/ 2.注册完,登录账号进入首页,点右上角的 ‘+’ 创建新的仓库 3. 点击setting,选择一个主题, 4. 选完 ...

随机推荐

  1. hw面试常见中间件漏洞

    apache漏洞 未知扩展名解析漏洞 漏洞原理:Apache对文件名后缀的识别是从后往前进行的,当遇到不认识的后缀时,继续往前,直到识别 影响版本:使用module模式与php结合的所有版本,apac ...

  2. Application of Permutation and Combination

    Reference https://www.shuxuele.com/combinatorics/combinations-permutations.html Online Tool https:// ...

  3. MySQL读取的记录和我想象的不一致

    摘要:并发的事务在运行过程中会出现一些可能引发一致性问题的现象,本篇将详细分析一下. 本文分享自华为云社区<MySQL读取的记录和我想象的不一致--事物隔离级别和MVCC>,作者:砖业洋_ ...

  4. C++内敛函数,构造函数,析构函数,浅拷贝

    inline //inline函数可以有声明和实现,但是必须在同一文件//inline函数不能分成头文件和实现文件 inline int add(int x, int y){ //一般不要放循环语句 ...

  5. 天下苦 Spring 久矣,Solon v2.3.3 发布

    Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...

  6. Python asyncio 库源码分析

    Python asyncio 库源码分析 前言 本着 「路漫漫其修远兮, 吾将上下而求索」 的精神.终于要开始深入研究 Python 中 asyncio 的源码实现啦. 本文章可能篇幅较长,因为是逐行 ...

  7. 反转链表 Java版 图文并茂思路分析带答案(力扣第206题)

    反转链表 力扣第206题 我们不只是简单的学习(背诵)一个数据结构,而是要分析他的思路,以及为什么要有不同的指针等等 非递归方式: 思路分析:首先要链表有个头指针没有任何问题 然后,我们要将1的下一个 ...

  8. Pinot2的无人机任务和数据处理实践

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...

  9. 【Azure 媒体服务】Azure Media Player 在Edge浏览器中不能播放视频问题的分析与解决

    问题描述 使用Azure Media Service 制作视频点播服务,在客户端使用 Azure Media Player 播放器在 Edge 浏览器中播放视频时候遇见无法播放的问题: 错误信息: T ...

  10. 从钢铁行业数字化管控与超自动化融合,看华为WeAutomate能力进化

    文/王吉伟 钢铁行业的数字化转型,历来都是值得探讨的热点话题. 2022年,我国粗钢产量10.13亿吨,占据了全球钢铁供给市场的半壁江山. 这组数据可谓非常抢眼,但仍旧难掩诸多企业的各种经营问题. 钢 ...