1. 程式人生 > >Git、Gerrit、Repo使用及其關係

Git、Gerrit、Repo使用及其關係

Git、Gerrit、Repo使用

三者各自功能

  1. gii,版本管理庫,在git庫中沒有中心伺服器的概念,真正的分散式。
  2. repo,repo就是多個git庫的管理工具。如果是多個git庫同時管理,可以使用repo。當然使用gerrit,就必須用repo。
  3. gerrit,提交稽核程式碼,圖形化的介面,簡單的操作

使用三者管理程式碼流程

  1. repo init xxx初始化
  2. repo sync xxx同步要改動的專案
  3. 在該專案下面repo start xxx新建一個本地分支
  4. 做好改動以後git commit本地提交改動
  5. repo upload xxx將改動上傳,等別人通過gerrit review
  6. review如果有需要改動的地方,那本地改好後,git commit –amend來儲存新的修改
  7. repo upload 將新的改動上傳
  8. 重複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
      比較的是工作目錄(Working tree)和暫存區域快照(index)之間的差異,即修改之後還沒有暫存起來的變化內容。
    • eg:git diff master..test 顯示兩個分支間的差異
    • eg : git diff master...test ‘master’,‘test’的共有 父分支和’test’分支之間的差異
    • eg: git diff --stat 統計那些檔案被改動
  • git log 顯示最近提交日誌

    eg:git log 如果需要一行顯示 git log --pretty=oneline

  • git reset 版本回退

    eg:git reset --hard HEAD~X

    會退到之前X版本

    如果回退之後還想回來,可以使用

    eg:git reset --hard "commit ID"

    ID可以使用

    eg:git reflog 檢視歷史命令獲得ID

  • git checkout -- file 丟棄工作區修改,撤銷修改到最近一次 git commit or git 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 or git rebase -i (commit -id)接著會出現

     pick:*******

     pick:*******

     pick:*******ls

    將pick改為edit就可以修改,利用`git commit –amend命令

    最後git rebase --continue 搞定

    如果需要刪除已經push的可以將pick改為drop

Repo

  • repo擔任角色

    1. 和主程式碼伺服器互動
    2. 用manifest.xml管理多個git倉庫
  • repo init -u url -b branchname 初始化命令,主要幹兩件事

    1. 在當前目錄裡面下載安裝 repo,因為最初從網上下載的那個 repo 檔案並不是一個完整的 repo,它主要負責初始化工作,並且在初始化完成以後將命令移交給完整的 repo 來執行
    2. 根據命令中指定的地址(-u url)去下載專案的管理檔案 manifest.xml ,這裡 -b branchname 就是指的 manifest.xml 的相應 branch
  • repo sync 同步所有專案

  • repo sync project 主要乾的事情是

    1. 同步 .repo/manifests/,再根據最新的manifest.xml來執行操作
    2. 找到想要下載專案,然後下載專案
  • 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流程

    1. 上傳程式碼
    2. reviewer review 當change +2 就可以merge ,但是在+2之前,先有普通reviewer檢視+1,以減輕主reviewer負擔
    3. verify:可以人工完成,也可以用自動化工具,如自動化編譯,自動化測試
    4. 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

安卓原生編譯

    1. source ./build/envsetup.shor. ./build/envsetup.sh```</li>
      <li>```lunch
    2. make ...
  • 快捷方式
    • croot:用於改變當前路徑到Android根目錄。
    • m:用於從Android根目錄開始編譯。
    • mm:用於編譯當前目錄下的所有模組。
    • mmm:用於編譯特定目錄下的所有模組。
    • cgrep:用於在C/C++檔案中查詢。
    • jgrep:用於在Java檔案中查詢。
    • resgrep:用於在資原始檔中查詢。
    • godir:用於跳轉到某個目錄。