[Git] How to Update the Old Commit with Git and to Push a New Patch Set on the Gerrit?
簡述:
Version Control 及 Code Review 在軟體開發流程上,是非常重要的兩個部份。因為在 Android Open Source Project 上,是使用 Git 並搭配 Gerrit Code Review 來進行開發,所以這邊也來談談該怎麼善用這兩個工具的功能,方便做 Code Review。
既然是 Code Review,便有可能出現不被接受的 commit,此時可知,如果是因為同樣目的而修改的部份,卻是每次都要在 Gerrit 上產生一個新的 change,顯然是很麻煩,而且容易造成 Gerrit 及 Git 的歷史紀錄混亂,所以,Gerrit 提供了 Change-Id 的使用,讓 Gerrit 協助你管理這些同樣的修改目標,使得這些修改都可以歸類於一個 change 紀錄中,存放成一個一個的 Patch Set。
首先,我們一定要先取得 Gerrit 的 commit-msg hook,使得我們在 commit 時,Git 可以自動幫我們加上 Change-Id,這個 Id 會作為 Gerrit 整理 Patch Set 的依據。
參考 Gerrit Documentation – Change-Id – Create,可以得到下列指令,
$> scp -p -P 29418 review.example.com:hooks/commit-msg .git/hooks/
然後,我們有兩種狀況要討論,
第一種,要修改的 commit 剛好就是現在 HEAD 指向的那個 commit:
按照一般作業方式,修改 Source Code,並且加到這次的 Commit Stage 中,並進行 Commit 動作,這邊要注意的是,這次下的 commit 指令,需要給予額外的參數,如下所示,
$> git commit –amend
這時候會跳出Editor讓你對既有的 commit message 作修改,只要儲存後即可 Push 到 Gerrit 上,就會在 Gerrit 上的同個 Change 裡,出現了 “Patch Set 2″。
第二種,要修改的 commit 在好幾個 commit 之前:
這部份需要借助 Rebase,以下是幾個小步驟(在操作的過程中,Git 也會提示你相對應的操作步驟與方式),
$> git rebase <commit-id>~5 -i
以上可以列出包含該 commit-id ,以及在它之前的5個 commit。這步驟會出現下列畫面,
在 Editor,提示要針對 commit 下指令。如上圖,下方的 comment 解釋了有幾種 command,並且告知各個 command 的意涵,針對要修改的 commit,我們將它的 “pick” 改成 “edit”,並且離開 Editor。此時看 git log,變會發現自己已經身在該 commit 上,所以就接著進行需要的 Source Code 修改,修改完成後,往下面的步驟走,
$> git add <file>
$> git commit –amend
編輯完 commit message 後,便接著下列指令操作,
$> git rebase –continue
這時會將整個HEAD指到最終的 commit,回復到原有的修改歷程上,唯一的差異,就在於剛剛修改的 commit message 已經列在 git log 中了,而且 Source Code 修改也存在於內。最後只要 push 到 Gerrit 上即可。
結論:
透過這樣的方式,我們就不需要一直在 Gerrit 上面放棄修改,就 local 端來說,也不用一直 reset 到之前的 commit,採用 rebase 的作法,也可以跳躍式的修改之前的 commit,顯然方便許多,也較能避免錯誤操作產生的問題。
發佈留言
很抱歉,必須登入網站才能發佈留言。