背景
前段時間給 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 的效果一樣。
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
,這個倒沒有好壞之分,只要同組的開發者都達成一致即可。