Git支持對每次提交的日志信息進行規范,可以通過設置提交模板實現。
建立一個gitCommitTemplate文件,內容為:
#commit message包含三部分,header, body和footer,其中header必選,body和footer可選。
# type(<scope>): <subject>
#<body>
#<footer>
#type字段包含:
# feature:新功能開發
# update:功能修改
# bugfix:bug修復
# refactor:重構(非新增功能、非bug修復)
# docs:文檔(documentation)
# style:格式(不影響代碼運行的變動)
# test:增加測試
# chore:構建過程或輔助工具的變動
#scope用于說明commit影響的范圍,比如數據層、控制層、視圖層等等,不同項目不同。
#subject是commit目的的簡短描述,不超過50個字符。
#以動詞開頭,使用第一人稱現在時,比如change,而不是changed或changes。
#第一個字母小寫。
#結尾不加句號(.)。
#body部分是對本次commit的詳細描述,可以分成多行。
#使用第一人稱現在時,比如使用change而不是changed或changes。
#應該說明代碼變動的動機以及與以前行為的對比。
#footer
#A、如果當前代碼與上一個版本不兼容,則footer部分以BREAKING CHANGE開頭,
# 后跟對變動的描述、變動理由以及遷移方法。
#B、關閉Issue,關閉某個issue可以:close #issue_id,多個使用逗號分隔
Revert撤銷操作
如果當前commit用于撤銷以前的commit,則必須以revert:開頭,后面跟著被撤銷Commit的Header。
revert: feat(pencil): add 'graphiteWidth' option
This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必須寫成?This?reverts commit?commit_id.?,其中的hash是被撤銷commit的?SHA?標識符?。 如果當前commit與被撤銷的commit,在同一個發布(release)里面, 那么都不會出現在Change log 里面。如果兩者在不同的發布,那么當前commit,會出現在Change log的Reverts小標題下面。
設置當前分支的提交模板
git config commit.template [模板文件名]
git config commit.template gitcommit_template
設置全局的提交模板
git config --global commit.template [模板文件名]
git config --global commit.template gitcommit_template
設置文本編輯器
git config --global core.editor [編輯器名稱]
git config --global core.editor vim
使用git commit -a提交時,Git會用設置的編輯器打開設置的提交日志模板,然后按照格式添加相應的備注,保存提交到遠程分支。
Git可以通過對log的分析進行代碼統計。
git log參數說明:
--author
指定作者
--stat 顯示每次更新的文件修改統計信息,會列出具體文件列表
--shortstat 統計每個commit 的文件修改行數,包括增加,刪除,但不列出文件列表:
--numstat 統計每個commit 的文件修改行數,包括增加,刪除,并列出文件列表:
-p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新,例如:git log -p -2
--name-only 僅在提交信息后顯示已修改的文件清單
--name-status 顯示新增、修改、刪除的文件清單
--abbrev-commit 僅顯示SHA-1的前幾個字符,而非所有的40個字符
--relative-date 使用較短的相對時間顯示
--graph 顯示ASCII圖形表示的分支合并歷史
--since 限制顯示輸出的范圍,
例如:git log --since=2.weeks 顯示最近兩周的提交
選項說明
-(n) 僅顯示最近的 n 條提交
--since, --after 僅顯示指定時間之后的提交。
--until, --before 僅顯示指定時間之前的提交。
--author 僅顯示指定作者相關的提交。
--committer 僅顯示指定提交者相關的提交。
git log --until=1.minute.ago // 一分鐘之前的所有 log
git log --since=1.day.ago //一天之內的log
git log --since=1.hour.ago //一個小時之內的 log
git log --since=`.month.ago --until=2.weeks.ago //一個月之前到半個月之前的log
git log --since ==2013-08.01 --until=2013-09-07 //某個時間段的log
git blame //看看某一個文件的相關歷史記錄
git blame index.html --date short
--pretty 使用其它格式顯示歷史提交信息??捎玫倪x項包括 oneline,short,full,fuller 和 format(后跟指定格式)。
git log --pretty=oneline ;
git log --pretty=short ;
git log --pretty=full ;
git log --pretty=fuller
--pretty=tformat: 可以定制要顯示的記錄格式,便于后期編程提取分析。
git log --pretty=format:""%h - %an, %ar : %s""
%H 提交對象(commit)的完整哈希字串
%h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串
%t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串
%p 父對象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 -date= 選項定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說明git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
統計用戶名為username的開發者增刪的代碼行數git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'
統計當前用戶增刪的代碼行數git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
統計每個開發者增刪的代碼行數git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5
統計倉庫提交者排名前5的開發者git log --pretty='%aN' | sort -u | wc -l
統計倉庫貢獻者的數量git log --oneline | wc -l
倉庫提交數量統計
目前主流的Git在線代碼托管工具如下:
GitHub:https://github.com
GitHub是一個面向開源及私有軟件項目的托管平臺。
Gitee(碼云):https://gitee.com
中國本土的在線代碼托管協作開發平臺。
GitLab:https://gitlab.com
GitLab是一個用于倉庫管理系統的開源項目,支持無 限公有項目和私有項目,支持在局域網內使用GiLab CE搭建代碼托管服務器。
Pull Request是集成管理者工程流程在GitHub上的工程實踐,是開發者使用GitHub進行協作開發的一種通知機制,讓開發者通知項目成員一個功能已經完成。如果功能分支開發完畢,開發者使用GitHub賬號提交一個Pull Request,通知所有參與者需要進行代碼審查,并將代碼并入master分支。Pull Request還提供了專注于某個提交功能的討論版。
Pull Request的工作流程如下:
A、開發者從某個項目的官方倉庫Fork一份拷貝到自己GitHub賬戶,此時開發者的GitHub賬戶會有一份項目官方倉庫的拷貝。
B、開發者將自己遠程倉庫的項目副本克隆到本地
C、開發者在自己本地倉庫為某個功能創建一個專門的分支,并完成功能開發。
D、開發者將開發完成的功能分支推送到自己GitHub賬戶的公開倉庫。
E、開發者用GitHub發起一個Pull Request。
F、其他團隊成員審查代碼,討論并且做出修改。
G、項目維護者將功能并入官方倉庫,然后關閉Pull Request。
scorpio是HyperLedger Fabric的開發者,Mary是HyperLedger Fabric項目的維護者。HyperLedger Fabric在GitHub的官方倉庫地址如下:
https://github.com/hyperledger/fabric
A、將HyperLedger Fabric項目官方倉庫fork到自己的GHub賬戶。
為了參與HyperLedger Fabric項目,scorpio首先要fork HyperLedger Fabric項目在GitHub的官方倉庫。scorpio需要注冊登錄 GitHub,找到HyperLedger Fabric的官方倉庫,點擊Fork按鈕。
此時,GitHub會在scorpio賬戶中派生一份HyperLedger Fabric的官方倉庫的拷貝。
B、將自己GitHub賬戶中的HyperLedger Fabric項目副本克隆到本地。
scorpio需要將剛剛fork的GitHub倉庫克隆到本地。
git clone https://github.com/scorpiostudio/fabric
git clone自動創建一個名為origin的遠端倉庫,指向scorpio自己GitHub賬戶中的fabric倉庫(https://github.com/scorpiostudio/fabric)。
C、在本地倉庫創建feature分支
在進行開發前,scorpio需要創建一個新的功能分支some-feature。
git checkout -b some-feature
D、在新建的feature分支上完成功能開發
scorpio在當前分支some-feature上進行功能開發,最終完成。
E、將本地倉庫開發的功能分支推送到開發者自己的GitHub賬戶的遠程倉庫。
在完成some-feature功能開發后,scorpio將some-feature分支推送到自己的GitHub倉庫(https://github.com/scorpiostudio/fabric)上。
git push origin some-feature
此時,scorpio開發的some-feature功能就可以被其他人看到。
F、開發者在GitHub上的項目官方倉庫創建一個Pull Request
scorpio需要找到HyperLedger Fabric項目的官方倉庫(https://github.com/hyperledger/fabric),點擊項目簡介下的New pull request按鈕,使用自己的GitHub帳號創建一個Pull Request。
scorpio的倉庫會被默認設置為源倉庫(head fork),詢問指定源分支(compare)、目標倉庫(base fork)和目標分支(base)。
scorpio想要將自己開發的some-feature功能并入主代碼庫,所以源分支是scorpio的some-feature分支,目標倉庫就是HyperLedger Fabric項目的官方倉庫,目標分支為master。scorpio需要提供一個Pull Request的標題和簡介。
在scorpio創建一個Pull Request后,GitHub會給HyperLedger Fabric項目的維護者Mary發一個通知。
G、項目官方倉庫的維護者審查開發者提交的功能分支
Mary可以在自己的GitHub倉庫下的Pull Request選項卡中看到所有的 Pull Request。點擊scorpio的Pull Request會顯示Pull Request的簡介、some-feature分支的提交歷史以及包含的更改。
H、項目官方倉庫的維護者接受開發折提交的功能分支并關閉Pull Request
如果Mary認為some-feature分支已經可以合并,只需點擊Merge Pull Request按鈕來通過當前的Pull Request,將scorpio提交的some-feature分支并入HyperLedger Fabric官方倉庫的master分支。
如果Mary發現了scorpio代碼中的一個小bug,需要scorpio在合并前修復。Mary可以評論整個Pull Request,也可以評論some-feature分支中某個特定的提交。
為了修復錯誤,scorpio在自己本地倉庫some-feature分支后面添加了另一個提交,并將它推送到了GitHub遠程倉庫。此時修復bug的提交被自動添加到原來的Pull Request后面,Mary可以在評論下方再次審查scorpio的修改。
最終,經過多次修改后,Mary接受了scorpio提交的功能,將some-feature分支并入HyperLedger Fabric官方倉庫master分支,并關閉scorpio創建的Pull Request?,F在some-feature功能現在已經整合到了HyperLedger Fabric項目中,其他在master分支上工作的開發者可以使用標準的git pull命令將上述修改拉取到自己的本地倉庫。
Merge Request是集成管理者工程流程在GitLab上的工程實踐。
用Admin或Owner或Master賬號登錄,打開指定project -> Settings -> Repository -> Protected Branches,選擇要protect的branch (支持wildcard):
要求每個人都要通過Merge Request才能合并代碼進入public branch:選擇”Allowed to merge”為”Developers + Masters”,選擇”Allowed to push” 為”No one“。
Merge Request工作流程如下:
A、從項目的官方倉庫fork一份拷貝到GitLab的個人賬戶。此時個人賬戶有一份項目官方倉庫的拷貝。
B、將個人賬戶的項目倉庫克隆到本地
C、在本地倉庫創建一個新的本地分支,進行任務開發,開發完成后推送到個人GitLab賬戶的遠程倉庫,此時Git會提示進行Merge Request。
D、開發者登錄GitLab賬戶,在fork的官方項目副本上發起Merge Request。打開項目,點擊右側的Create merge request。
選擇Source branch和Target branch,Source branch分支為個人GitLab賬戶中的遠程倉庫分支,Target branch分支為GitLab官方倉庫的分支
點擊”Compare branches and continue“
填寫標題和表述信息。
選擇Assignee(指派給誰) (不要選擇Assign to me)
如果是臨時branch,勾選“Remove source branch when merge request is accepted”
檢查無誤后,點擊“Submit merge request”按鈕。
如果發起Merge Request后,在本Merge Request關閉前,繼續往source branch分支push代碼,后續commit也會被自動包含在本Merge Request里。
E、其他人進行代碼審查,通過Merge Request。
被指派者登錄GitLab個人賬戶,點擊由上角Merge Request,查看當前的Merge Request任務。
點擊Merge Request任務進入
點擊Commit查看詳細信息
點擊Changes查看具體的改動
寫comment,并和代碼提交者討論。
審查通過后,點擊”Merge”按鈕
如果審查不通過,寫清楚comment,并在和代碼提交者討論后,要求其進行修改。
F、結果查看
點擊GitLab上的項目官方倉庫,選擇相應的分支,可以看到,開發者Merge Request申請合并的分支已經并入了官方倉庫。
上述實驗在GitLab CE(社區版)中進行,因此實際上發起Merge Request申請的人或是其他人,只要具有Merge權限都可以進行Merge。
GitLab CE(社區版)發起Merge Request時,所有具備Merge的項目成員都可以Merge;
GitLab EE(企業版)加入了權限管理審批機制(Merge Request Approvals),只有指派的成員才可以Merge。
選擇分支策略的原則:
A、始終保持master處在可發布狀態
B、始終保持構建處在成功狀態
C、降低代碼合并的復雜度和風險
D、降低團隊溝通成本
E、符合團隊的現狀
代碼審查的原則:
A、不要既當運動員,又當裁判員。
B、審查代碼是否滿足功能、規范、測試結果、測試覆蓋等。
C、借助自動化代碼審查工具來提升代碼審查的效率。
D、審查合格才允許并入public branch,不合格的代碼退回重新修改。
E、不怕犯錯,但不要犯重復的錯。
F、提交審查前,自己先檢查一遍。
G、鼓勵使用同行評審(Peer Review)而不是上下級評審,鼓勵積極反饋、互動。
H、評審對事不對人,多建議,不批評
I、評審過程對reviewer和代碼提交者雙方都是一個學習提升的過程,保持開放的心態,相互學習,共同成長。
GUI Clients:https://www.git-scm.com/downloads/guis
部分提供免費版的Git客戶端如下:
SourceTree:Windows,Mac(支持Git Flow)
GitHub Desktop:Windows,Mac(支持Pull Request)
TortoiseGit:Windows
Git Extensions:Linux, Mac, Windows
GitKraken:Linux, Mac, Windows
SmartGit:Linux, Mac, Windows(支持Git Flow,Pull Request)
CodeReview:Linux, Mac, Windows
GitEye:Linux, Mac, Windows
GitGUI: Linux, Windows(Git官方GUI客戶端)
目前軟件開發的主流IDE通過插件方式支持Git。
Eclipse :通過Egit插件提供Git集成支持。
Visual Studio:通過Git Integration、GitHub Extension等Git插件提供Git集成支持。
QtCreator:通過Git插件提供Git集成支持(QtCreator高版本支持GitK,GitGUI)。
IntelliJ IDEA:通過GitXXX插件提供Git集成支持。
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網站欄目:Git工程開發實踐(六)——Git工程實踐擴展-創新互聯
文章URL:http://vcdvsql.cn/article32/dsdspc.html
成都網站建設公司_創新互聯,為您提供建站公司、網站導航、網站排名、關鍵詞優化、做網站、定制開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯