一、簡(jiǎn)單介紹
1、Git
????????全稱Global Information Tracker,或者?stupid content tracker,分布式版本控制系統(tǒng)。
????????Git沒(méi)有中央服務(wù)器,每個(gè)協(xié)作開(kāi)發(fā)者的電腦都是一個(gè)完整的版本庫(kù),工作時(shí)無(wú)需聯(lián)網(wǎng)只需推送。Git可以記錄所有的變更記錄,可以方便查詢和回滾歷史版本。
2、Gerrit
????????Gerrit是建立在Git之上、基于Web的代碼審查工具。
????????Geriit同Git免費(fèi)、開(kāi)源,作為網(wǎng)頁(yè)版代碼審查軟件,向協(xié)助開(kāi)發(fā)者提供代碼審查平臺(tái),以審閱修改后的程序代碼決定是否能夠提交Merge,或者退回修改完善代碼,從而保證代碼質(zhì)量。
二、Gerrit服務(wù)器搭建
(23條消息) Gerrit代碼審核服務(wù)器搭建全過(guò)程_girret_hanpfei的博客-CSDN博客
三、本地開(kāi)發(fā)配置
1、安裝Git
????????下載鏈接:Git - Downloads (git-scm.com)。
????????根據(jù)本地機(jī)器OS版本下載相對(duì)應(yīng)版本,并根據(jù)個(gè)人偏好進(jìn)行Git設(shè)置。
2、配置Git
2.1、配置用戶名和郵箱
git config --global user.name "Your Name" git config --global user.email "Your E-mail Address"
2.2、本地創(chuàng)建SSH key
????????本地 Git 倉(cāng)和 GitHub 倉(cāng)通過(guò)SSH加密傳輸,因此需要配置驗(yàn)證信息。進(jìn)入Git工作目錄,郵件“Git Bash Here”打開(kāi)Git終端,執(zhí)行以下命令生成 SSH Key:?????
ssh-keygen -t rsa -b 2048 -C "郵箱地址"
這里rsa也可以換成其他的加密算法
???之后在Windows用戶目錄下生成.ssh文件夾。
2.3、Gerrit添加SSH key
·????????登錄遠(yuǎn)程Gerrit服務(wù)器,配置自己的賬戶信息,添加SSH key。
四、Git常用命令
1、本地倉(cāng)操作
1.1、git init
????????本地建倉(cāng),對(duì)本地當(dāng)前目錄進(jìn)行Git初始化。
????????如果需要建立本地倉(cāng)庫(kù)track自己的代碼修改,那么可以使用git init的方法建倉(cāng),然后將代碼拷貝至此文件夾中。
1.2、git add
????????將修改添加至?xí)捍鎱^(qū)。文件修改后,文件被保存在工作區(qū),通過(guò)git add命令將文件添加至?xí)捍鎱^(qū),以便于下一步commit。
# 將指定文件放入暫存區(qū)
$ git add <file>
# 將指定目錄下所有變化的文件,放入暫存區(qū)
$ git add <directory>
# 將當(dāng)前目錄下所有變化的文件,放入暫存區(qū)
$ git add .
1.3、git commit
????????將修改提交至倉(cāng)庫(kù)區(qū)。修改經(jīng)過(guò)git add之后被保留在暫存區(qū),之后通過(guò)git commit進(jìn)行提交。git commit使用語(yǔ)法:
git commit <filename> -m "message"
可以指定某一個(gè)<filename>,或者不加<filename>直接提交當(dāng)前所有暫存區(qū)的內(nèi)容
-s:添加commit簽名
-m:添加提交說(shuō)明
--amend:撤銷(xiāo)上一次 commit,然后生成一個(gè)新的 commit
--fixup:當(dāng)前commit是以前某個(gè)commit的修正,執(zhí)行g(shù)it rebase后兩個(gè)commit合并一個(gè)
--no-edit:commit不改變之前commit message的內(nèi)容
2、本地倉(cāng)查看
2.1、git diff
????????查看文件/分支之間的差異。
# 查看工作區(qū)與暫存區(qū)的差異(默認(rèn)為--staged)
$ git diff <filename> --staged
# 查看暫存區(qū)與倉(cāng)庫(kù)區(qū)(當(dāng)前 commit) 的差異
$ git diff --cached
# 查看兩個(gè)commit的差異
$ git diff <commitBefore> <commitAfter>
# 查看工作區(qū)與某個(gè) commit 的差異(上一次commit:HEAD)
$ git diff <commit>
# 顯示兩次提交之間的差異
$ git diff [first-branch]...[second-branch]
# 查看工作區(qū)與當(dāng)前分支上一次提交的差異,但是局限于test文件
$ git diff HEAD -- ./test
# 查看topic分支與master分支最新提交之間的差異
$ git diff topic master(或者$ git diff topic..master)
# 查看自從topic分支建立以后,master分支發(fā)生的變化
$ git diff topic...master
2.2、git show
????????查看commit的內(nèi)容。
# 輸出某次提交的元數(shù)據(jù)和內(nèi)容變化
$ git show [commit]
$ git show 12a86bc38 # By revision
$ git show v1.0.1 # By tag
$ git show feature132 # By branch name
$ git show 12a86bc38^ # Parent of a commit
$ git show 12a86bc38~2 # Grandparent of a commit
$ git show feature132@{yesterday} # Time relative
$ git show feature132@{2.hours.ago} # Time relative
2.3、git log
????????查看提交歷史。
# 列出當(dāng)前分支n條版本歷史,不加-n則列出所有版本歷史
$ git log -n
# 列出某個(gè)文件的版本歷史,包括文件改名
$ git log --follow [file]
3、本地與遠(yuǎn)程倉(cāng)交互
3.1、git clone
????????克隆遠(yuǎn)程倉(cāng)庫(kù)到本地目錄。
$ git clone 遠(yuǎn)程倉(cāng)鏈接
3.2、git fetch
????????獲取遠(yuǎn)程倉(cāng)最新內(nèi)容下載到本地,不直接執(zhí)行合并操作,用戶決定是否合并。
git fetch <遠(yuǎn)程主機(jī)名> <分支名>
如果省略分支名,那么將遠(yuǎn)程倉(cāng)更新全部取回本地
3.3、git pull
????????相當(dāng)于git fitch+git merge,獲取遠(yuǎn)程倉(cāng)最新內(nèi)容并直接合并,這樣可能會(huì)產(chǎn)生沖突,需要手動(dòng)解決。
3.4、git push
????????將本地分支推送到遠(yuǎn)程倉(cāng)并合并,在本地commit完成后需要推送到遠(yuǎn)程時(shí)使用。
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
如省略遠(yuǎn)程分支,那么本地分支將推送到與之存在追蹤關(guān)系的遠(yuǎn)程分支(通常兩者同名)
如該遠(yuǎn)程分支不存在,則會(huì)被新建
例如:
git push origin HEAD:refs/for/master
origin : 遠(yuǎn)程庫(kù)名
HEAD: 指向當(dāng)前本地工作分支的指針
refs/for: 提交代碼到服務(wù)器需code review才能merge
refs/heads:直接merge,無(wú)需code review
4、分支操作
4.1、git branch
????????用于分支操作。
# 列出所有分支,-a表示本地和遠(yuǎn)程所有分支,-r表示遠(yuǎn)程所有分支,不加參數(shù)表示本地
$ git branch [-a/-r]
# 新建分支
$ git branch 分支名
# 刪除分支,D表示強(qiáng)制刪除
$ git branch -d/D <分支名>
# 分支改名
$ git checkout -b 新名 舊名
$ git branch -d 舊名
4.2、git checkout
????????切換分支或者標(biāo)簽等。
# 創(chuàng)建并切換至新分支,不加-b則直接切換
$ git checkout -b 新分支名
5、撤銷(xiāo)與回退
5.1、三個(gè)恢復(fù)等級(jí)
????????--soft 、--mixed以及--hard是三個(gè)恢復(fù)等級(jí)。
--soft:僅將頭指針恢復(fù),已經(jīng)add的暫存區(qū)及工作空間的代碼都不變
--mixed:將頭恢復(fù)掉,已經(jīng)add的暫存區(qū)也會(huì)丟失掉,工作空間代碼不變。
--hard:一切就全都恢復(fù)了,頭變,aad的暫存區(qū)消失,代碼恢復(fù)到以前狀態(tài)。
5.2、撤銷(xiāo)上一次commit提交
# 撤銷(xiāo)上一次commit, 不會(huì)撤銷(xiāo)git add
$ git?reset?--soft head~1
# 撤銷(xiāo)上一次commit, 同時(shí)撤銷(xiāo)git add
$ git reset head~
5.3、回退到某一次commit提交
# 徹底回退到某一個(gè)commit
$ git reset --hard <Commit-ID>
5.4、回退到上n次commit提交
# 當(dāng)前版本
$ git reset --hard head
# 回退到上一個(gè)版本
$ git reset --hard HEAD^
# 回退到上上一個(gè)版本
$ git reset --hard HEAD^^
# 回退到往上3個(gè)版本
$ git reset --hard HEAD~3
# 回退到往上10個(gè)版本
$ git reset --hard HEAD~10
五、Gerrit使用流程
1、獲取服務(wù)器最新代碼
????????git clone "ssh:/用戶名@遠(yuǎn)程倉(cāng)IP:端口/倉(cāng)庫(kù)名" && scp -p -P 端口 用戶名@遠(yuǎn)程倉(cāng)IP:hooks/commit-msg "satool/.git/hooks/"。通過(guò)此命令獲取遠(yuǎn)程倉(cāng)代碼下載至本地,同時(shí)將commit-msg文件拷貝至本地。
2、本地修改與commit
????????本地完成修改之后通過(guò)git add添加至?xí)捍鎱^(qū),然后進(jìn)行commit提交。
3、推送至遠(yuǎn)程倉(cāng)
????????通過(guò)git push origin HEAD:refs/for/遠(yuǎn)程分支名,將本地修改提交至Gerrit進(jìn)行審視。refs/for的意義在于提交代碼到服務(wù)器之后需要經(jīng)過(guò)code review才能進(jìn)行merge,而refs/heads不需要,直接進(jìn)行merge。
4、添加Reviewers&CC
????????完成本地倉(cāng)推送至遠(yuǎn)程后,進(jìn)入Gerrit平臺(tái),添加Reviewers&CC,添加代碼代碼協(xié)作者進(jìn)行代碼審閱。
5、Merge合入
????????代碼提交完成審閱并+2確認(rèn)后,將顯示Ready to Submit狀態(tài),這個(gè)時(shí)候點(diǎn)擊Submit即可Merge合入。
六、常見(jiàn)問(wèn)題
1、commit message缺少Signed-off-by信息
問(wèn)題原因:git commit提交的時(shí)候沒(méi)有帶上-s簽名參數(shù)。
解決辦法:git commit -s --amend --no-edit。
2、commit message缺少Change-Id信息
?問(wèn)題原因:.git/hooks目錄下缺少commit-msg文件,往往是初次從遠(yuǎn)程服務(wù)器下載的時(shí)候沒(méi)有通過(guò)scp命令拷貝commit-msg文件。
解決辦法:scp -p -P 端口 用戶名@遠(yuǎn)程倉(cāng)庫(kù)IP:hooks/commit-msg "本地hooks目錄",先獲取commit-msg文件,然后再進(jìn)行ammend,git commit --amend --no-edit,那么將會(huì)附加一行Change-Id信息。
3、獲取遠(yuǎn)程倉(cāng)后無(wú)法看到其他分支源碼
問(wèn)題原因:初次獲取遠(yuǎn)程倉(cāng)庫(kù)后默認(rèn)master主分支,顯示主分支源碼內(nèi)容。其他分支源碼需本地切換到其他分支方可顯示。
解決辦法:git checkout -b readmmio origin/readmmio,創(chuàng)建并切換與遠(yuǎn)程分支對(duì)應(yīng)的本地分支,之后便可以看到本地文件夾顯示遠(yuǎn)程倉(cāng)分支源碼。
七、參考資料
1、https://blog.csdn.net/u011086209/article/details/116593218
2、https://blog.csdn.net/u010312474/article/details/107915694
3、https://git-scm.com/docs/git-init/zh_HANS-CN
4、https://www.bookstack.cn/read/git-tutorial/docs-commands-git-commit.md文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-695614.html
5、https://www.cnblogs.com/runnerjack/p/9342362.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695614.html
到了這里,關(guān)于Git&Gerrit使用筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!