Angular 規(guī)范其實(shí)是一種語(yǔ)義化的提交規(guī)范(Semantic Commit Messages)寸爆,所謂語(yǔ)義化的提交規(guī)范包含以下內(nèi)容:Commit Message 是語(yǔ)義化的:Commit Message 都會(huì)被歸為一個(gè)有意義的類型莱预,用來(lái)說(shuō)明本次 commit 的類型崔梗。Commit Message 是規(guī)范化的:Commit Message 遵循預(yù)先定義好的規(guī)范珍语,比如 Commit Message 格式固定盯滚、都屬于某個(gè)類型嫉到,這些規(guī)范不僅可被開(kāi)發(fā)者識(shí)別也可以被工具識(shí)別哩都。
在 Angular 規(guī)范中税娜,Commit Message 包含三個(gè)部分坐搔,分別是 Header、Body 和 Footer敬矩,格式如下:
其中概行,Header 是必需的,Body 和 Footer 可以省略弧岳。在以上規(guī)范中凳忙,必須用括號(hào) () 括起來(lái),?[] 后必須緊跟冒號(hào) 禽炬,冒號(hào)后必須緊跟空格涧卵,2 個(gè)空行也是必需的。在實(shí)際開(kāi)發(fā)中腹尖,為了使 Commit Message 在 GitHub 或者其他 Git 工具上更加易讀柳恐,我們往往會(huì)限制每行 message 的長(zhǎng)度。根據(jù)需要热幔,可以限制為 50/72/100 個(gè)字符乐设,這里我將長(zhǎng)度限制在 72 個(gè)字符以內(nèi)(也有一些開(kāi)發(fā)者會(huì)將長(zhǎng)度限制為 100,你可根據(jù)需要自行選擇)断凶。
? ? ? ? 以下是一個(gè)符合 Angular 規(guī)范的 Commit Message:fix($compile): couple of unit tests for IE9# Please enter the Commit Message for your changes. Lines starting# with '#' will be ignored, and an empty message aborts the commit.# On branch master# Changes to be committed:# ...Older IEs serialize html uppercased, but IE9 does not...Would be better to expect case insensitive, unfortunately jasmine doesnot allow to user regexps for throw expectations.Closes #392Breaks foo.bar api, foo.baz should be used instead
? ? ? ? Header 部分只有一行伤提,包括三個(gè)字段:type(必選)巫俺、scope(可選)和 subject(必選)认烁。我們先來(lái)說(shuō) type,它用來(lái)說(shuō)明 commit 的類型。為了方便記憶却嗡,我把這些類型做了歸納舶沛,它們主要可以歸為 Development 和 Production 共兩類。它們的含義是:Development:這類修改一般是項(xiàng)目管理類的變更窗价,不會(huì)影響最終用戶和生產(chǎn)環(huán)境的代碼如庭,比如 CI 流程、構(gòu)建方式等的撼港。
Header
Header 部分只有一行坪它,包括三個(gè)字段:type(必選)、scope(可選)和 subject(必選)帝牡。
? ? ? ? 接下來(lái)往毡,我們說(shuō)說(shuō) Header 的第二個(gè)字段 scope。scope 是用來(lái)說(shuō)明 commit 的影響范圍的靶溜,它必須是名詞开瞭。顯然,不同項(xiàng)目會(huì)有不同的 scope罩息。在項(xiàng)目初期嗤详,我們可以設(shè)置一些粒度比較大的 scope,比如可以按組件名或者功能來(lái)設(shè)置 scope瓷炮;后續(xù)葱色,如果項(xiàng)目有變動(dòng)或者有新功能,我們可以再用追加的方式添加新的 scope娘香。主要是根據(jù)組件名和功能來(lái)設(shè)置的冬筒。例如,支持 某個(gè)模塊茅主,java如dao或者model等舞痰。
subject
? ? ? subject 是 commit 的簡(jiǎn)短描述,必須以動(dòng)詞開(kāi)頭诀姚、使用現(xiàn)在時(shí)响牛。比如,我們可以用 change赫段,卻不能用 changed 或 changes呀打,而且這個(gè)動(dòng)詞的第一個(gè)字母必須是小寫(xiě)。通過(guò)這個(gè)動(dòng)詞糯笙,我們可以明確地知道 commit 所執(zhí)行的操作贬丛。此外我們還要注意,subject 的結(jié)尾不能加英文句號(hào)给涕。BodyHeader 對(duì) commit 做了高度概括豺憔,可以方便我們查看 Commit Message额获。那我們?nèi)绾沃谰唧w做了哪些變更呢?答案就是恭应,可以通過(guò) Body 部分抄邀,它是對(duì)本次 commit 的更詳細(xì)描述,是可選的昼榛。Body 部分可以分成多行境肾,而且格式也比較自由。不過(guò)胆屿,和 Header 里的一樣奥喻,它也要以動(dòng)詞開(kāi)頭,使用現(xiàn)在時(shí)非迹。此外衫嵌,它還必須要包括修改的動(dòng)機(jī),以及和跟上一版本相比的改動(dòng)點(diǎn)彻秆。
body
? ? ? 通過(guò) Body 部分楔绞,它是對(duì)本次 commit 的更詳細(xì)描述,是可選的唇兑。Body 部分可以分成多行酒朵,而且格式也比較自由。不過(guò)扎附,和 Header 里的一樣蔫耽,它也要以動(dòng)詞開(kāi)頭,使用現(xiàn)在時(shí)留夜。此外匙铡,它還必須要包括修改的動(dòng)機(jī),以及和跟上一版本相比的改動(dòng)點(diǎn)碍粥。
合并提交
合并提交鳖眼,就是將多個(gè) commit 合并為一個(gè) commit 提交。這里嚼摩,我建議你把新的 commit 合并到主干時(shí)钦讳,只保留 2~3 個(gè) commit 記錄。那具體怎么做呢枕面?在 Git 中愿卒,我們主要使用 git rebase 命令來(lái)合并。git rebase 也是我們?nèi)蘸箝_(kāi)發(fā)需要經(jīng)常使用的一個(gè)命令潮秘,所以我們一定要掌握好它的使用方法琼开。git rebase 命令介紹
eg:
git項(xiàng)目add了三個(gè)文件,對(duì)應(yīng)下圖的commit信息
現(xiàn)在要將以feat開(kāi)頭的commit合并為一個(gè)枕荞,commit ID為cce4ff3為開(kāi)始柜候,父ID為20c3aae.
執(zhí)行g(shù)it rebase -i?20c3aae
需要合并的 3 個(gè) commit搞动,都執(zhí)行 squash 操作,如下圖所示:
修改完成后執(zhí)行:wq 保存改橘,會(huì)跳轉(zhuǎn)到一個(gè)新的交互頁(yè)面,在該頁(yè)面玉控,我們可以編輯 Commit Message飞主,編輯后的內(nèi)容如下圖所示:
修改完后wq保存。 git rebase -i?這里的一定要是需要合并 commit 中最舊 commit 的父 commit ID
檢查合并是否成功執(zhí)行 git log --oneline
三個(gè)合并為一個(gè)了
修改 Commit Message
git commit --amend:修改最近一次 commit 的 message
git rebase -i:修改某次 commit 的 message
git commit --amend 比較簡(jiǎn)單高诺,主要是修改最近一次commit的值碌识,執(zhí)行后修改保存即可。
git rebase -i?修改的 Commit Message 不是最近一次的 Commit Message虱而,可以通過(guò) git rebase -i <父 commit ID>命令來(lái)修改筏餐。比如
修改add find 變?yōu)?find add, 執(zhí)行?git rebase -i? c730f8e 輸入后將pick變?yōu)閞,wq保存,后進(jìn)入另一個(gè)頁(yè)面牡拇,修改信息魁瞪,保存后結(jié)果如下:
結(jié)果已經(jīng)改變。