Git、Gerrit、Repo使用及其關係
Git、Gerrit、Repo使用
三者各自功能
- gii,版本管理庫,在git庫中沒有中心伺服器的概念,真正的分散式。
- repo,repo就是多個git庫的管理工具。如果是多個git庫同時管理,可以使用repo。當然使用gerrit,就必須用repo。
- gerrit,提交稽核程式碼,圖形化的介面,簡單的操作
使用三者管理程式碼流程
- repo init xxx初始化
- repo sync xxx同步要改動的專案
- 在該專案下面repo start xxx新建一個本地分支
- 做好改動以後git commit本地提交改動
- repo upload xxx將改動上傳,等別人通過gerrit review
- review如果有需要改動的地方,那本地改好後,git commit –amend來儲存新的修改
- repo upload 將新的改動上傳
- 重複5-7步,直到review通過,然後merge改動,完畢
Git 基礎操作
git add 檔名
將當前更改或者新增的檔案加入到Git的索引中eg:
git add readme.txt
git commit
提交當前工作空間的修改內容,,提交的時候必須用-m來輸入一條提交資訊eg:
git commit -m "add model"
git status
倉庫當前的狀態eg :
git status
git diff
命令- eg:
git diff
- eg:
git diff master..test
顯示兩個分支間的差異 - eg :
git diff master...test
‘master’,‘test’的共有 父分支和’test’分支之間的差異 - eg:
git diff --stat
統計那些檔案被改動
- eg:
git log
顯示最近提交日誌eg:
git log
如果需要一行顯示git log --pretty=oneline
git reset
版本回退eg:
git reset --hard HEAD~X
如果回退之後還想回來,可以使用
eg:
git reset --hard "commit ID"
ID可以使用
eg:
git reflog
檢視歷史命令獲得IDgit checkout -- file
丟棄工作區修改,撤銷修改到最近一次git commit
orgit add
,即用版本庫裡的版本替換工作區的版本eg:
git checkout -- readme.txt
注:不要遺忘 –git rm
刪除版本庫中檔案eg:
git rm
刪除本地版本庫檔案,再使用git commit
提交git checkout -b "xxx"
建立一個分支
eg:
git checkout -b dev
建立dev分支並切換到dev分支,相當於
git branch dev
建立dev分支
git checkout dev
切換到dev分支
git branch -d dev
刪除dev分支
git checkout . ``#本地所有修改的。沒有的提交的,都返回到原來的狀態
git branch
命令會列出所有分支,並在當前分支上標*
git merge
合併指定分支到當前分支eg:
git merge dev
把dev分支合併到master分支上git log --graph
可以看到分支合併圖,如果git無法合併,必須先解決衝突才能提交。git stash
儲藏當前工作現場,建立新分支修改緊急任務git stash
隱藏當前工作區git checkout master
切換到master分支git checkout -b issue
新建分支解決完,並提交後
git checkout dev
切回到以前工作分支git stash list
檢視隱藏工作區git stash pop
恢復當前儲藏的工作區新增新功能最好新建feature分支,在上面開發,合併
git pull
從其他的版本庫(既可以是遠端的也可以是本地的)將程式碼更新到本地eg:
git pull origin master
origin版本庫的程式碼更新到本地的master主枝git push
:將本地commit的程式碼更新到遠端版本庫中eg:
git push origin git push localbranch master:refs/for/master
將本地的程式碼更新到orgin的遠端版本庫中git checkout HEAD <some file> [<some file>]
,清除工作目錄樹中的修改
打補丁
將commit打包成patch
- 修改程式碼
$ vi drivers/bluetooth/btusb.c
- 把程式碼新增到git管理倉庫
git add .
- 提交修改
git commit -m "some message"
- 檢視日誌,獲取到hash
git log
- 生成patch
git format-patch -s 1bbe3c8c19
- 或者–
git format-patch HEAD^
# 最近的1次commit的patch測試,應用patch
- 檢查patch檔案
git apply --stat xxx.patch
- 檢視是否能應用成功
git apply --check xxx.patch
- 應用patch
git am xxx.patch
注:1. 之前應,
git am -abort
放棄之前am資訊, 有可能會遇到 .git/rebase-apply still exists but mbox given修改以及commit並且以及push的描述
- 修改最近一次的commit
git commit --amend
- 修改commit歷史,
git rebase -i HEAD~X
orgit rebase -i (commit -id)
接著會出現pick:*******
pick:*******
pick:*******
ls將pick改為edit就可以修改,利用`git commit –amend命令
最後
git rebase --continue
搞定如果需要刪除已經push的可以將pick改為drop
Repo
repo擔任角色
- 和主程式碼伺服器互動
- 用manifest.xml管理多個git倉庫
repo init -u url -b branchname
初始化命令,主要幹兩件事- 在當前目錄裡面下載安裝 repo,因為最初從網上下載的那個 repo 檔案並不是一個完整的 repo,它主要負責初始化工作,並且在初始化完成以後將命令移交給完整的 repo 來執行
- 根據命令中指定的地址(-u url)去下載專案的管理檔案 manifest.xml ,這裡 -b branchname 就是指的 manifest.xml 的相應 branch
repo sync
同步所有專案repo sync project
主要乾的事情是- 同步 .repo/manifests/,再根據最新的manifest.xml來執行操作
- 找到想要下載專案,然後下載專案
repo start branch project
如果希望這個 branch 是被 repo 管理起來的,那麼我們就要使用
repo start
命令來新建一個 branch。比如這個 branch 改好了後,你是需要上傳到 gerrit 進行 review,那麼就該使用
repo start
。如果只是一個臨時實驗性的分支的話,就無所謂了。但是使用
repo start
也不會有什麼壞處,所以放心的使用。如果建立失敗,可以使用 repo start branch project –all
刪除 branch 的時候,依然是使用
git branch -d branchname
repo upload project
當準備好一個 commit 以後,就需要把這個改動傳到 gerrit 上面等待別人 review,就需要用到
repo upload
,如果branch不是repo start
建立,就必須使用repo start
建立新的branch,再使用git cherry-pick commitd
把剛才改動好的拿到repo建立的分支repo forall -c git reset --hard HEAD
repo forall -p =c git branch
repo branches
檢視當前有多少分支
Gerrit
Review流程
- 上傳程式碼
- reviewer review 當change +2 就可以merge ,但是在+2之前,先有普通reviewer檢視+1,以減輕主reviewer負擔
- verify:可以人工完成,也可以用自動化工具,如自動化編譯,自動化測試
- merge:通過review之後,就可以merge change,儲存到中心程式碼倉庫。如果程式碼有衝突,需要手動處理再重新上傳
從 gerrit 上面下載一個正在 review 的 change
有時候,需要將一個還沒有merge 的 change 下載下來,這時,可以到一個 change 的頁面,裡面有 download 的地方,裡面有很多下載選項。其中 cherry-pick 是比較常用的方式,你選了下載方式後,gerrit 會智慧的生成相應的命令,只需要複製下來,然後在專案目錄下面執行這個命令就可以了。
比較不同的 patch set
每個 change 通常需要重複“review - 改程式碼 - 上傳新 patch”多次才能最終完成,每一次上傳就稱為一個 patch。gerrit 會方便的把你的改動內容列出來方便 review,而且你還可以選擇比較不同的 patch set,在一個change 的頁面,仔細看看還是比較容易找到地方。
查詢 change
gerrit 在頁面右上角有一個搜尋框,通過搜尋匹配,你可以找到你想要的 change。比如 owner,project,status,branch 等等。比如:
status:open project:xxx
owener:”xxxxx
安卓原生編譯
source ./build/envsetup.sh
or. ./build/envsetup.sh```</li>
<li>```lunchmake ...
- 快捷方式
- croot:用於改變當前路徑到Android根目錄。
- m:用於從Android根目錄開始編譯。
- mm:用於編譯當前目錄下的所有模組。
- mmm:用於編譯特定目錄下的所有模組。
- cgrep:用於在C/C++檔案中查詢。
- jgrep:用於在Java檔案中查詢。
- resgrep:用於在資原始檔中查詢。
- godir:用於跳轉到某個目錄。