在程式碼審查之前重新定位
摘要
此目標是將所有分散的提交重新組織為更有意義的提交,以便更輕鬆地進行程式碼審查。如果同時在太多檔案中存在太多層次的更改,則執行程式碼審查會更加困難。如果你可以將按時間順序建立的提交重新組織到主題提交中,那麼程式碼審查過程會更容易(並且可能會減少錯誤,因為程式碼審查過程中會出現錯誤)。
這個過於簡化的示例並不是使用 git 進行更好的程式碼審查的唯一策略。這是我的方式,它是激勵他人考慮如何更容易/更好地進行程式碼審查和 git 歷史記錄的東西。
這也教學上證明了一般的變形能力。
此示例假定你瞭解互動式變基。
假設:
- 你正在從主人的一個功能分支上工作
- 你的功能有三個主要層:前端,後端,DB
- 在處理功能分支時,你已經做了很多提交。每次提交一次觸控多個圖層
- 你想(最後)你的分支中只有三個提交
- 一個包含所有前端更改
- 一個包含所有後端更改
- 一個包含所有資料庫更改
策略:
- 我們將把我們的時間順序改為區域性提交。
- 首先,將所有提交拆分為多個較小的提交 - 每個提交一次只包含一個主題(在我們的示例中,主題是前端,後端,資料庫更改)
- 然後將我們的主題提交重新排序並將它們壓縮為單個主題提交
例:
$ git log --oneline master..
975430b db adding works: db.sql logic.rb
3702650 trying to allow adding todo items: page.html logic.rb
43b075a first draft: page.html and db.sql
$ git rebase -i master
這將在文字編輯器中顯示:
pick 43b075a first draft: page.html and db.sql
pick 3702650 trying to allow adding todo items: page.html logic.rb
pick 975430b db adding works: db.sql logic.rb
把它改成這個:
e 43b075a first draft: page.html and db.sql
e 3702650 trying to allow adding todo items: page.html logic.rb
e 975430b db adding works: db.sql logic.rb
然後 git 將一次應用一個提交。每次提交後,它都會顯示提示,然後你可以執行以下操作:
Stopped at 43b075a92a952faf999e76c4e4d7fa0f44576579... first draft: page.html and db.sql
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$ git status
rebase in progress; onto 4975ae9
You are currently editing a commit while rebasing branch 'feature' on '4975ae9'.
(use "git commit --amend" to amend the current commit)
(use "git rebase --continue" once you are satisfied with your changes)
nothing to commit, working directory clean
$ git reset HEAD^ #This 'uncommits' all the changes in this commit.
$ git status -s
M db.sql
M page.html
$ git add db.sql #now we will create the smaller topical commits
$ git commit -m "first draft: db.sql"
$ git add page.html
$ git commit -m "first draft: page.html"
$ git rebase --continue
然後,你將為每次提交重複這些步驟。最後,你有這個:
$ git log --oneline
0309336 db adding works: logic.rb
06f81c9 db adding works: db.sql
3264de2 adding todo items: page.html
675a02b adding todo items: logic.rb
272c674 first draft: page.html
08c275d first draft: db.sql
現在我們再次執行 rebase 來重新排序和壓縮:
$ git rebase -i master
這將在文字編輯器中顯示:
pick 08c275d first draft: db.sql
pick 272c674 first draft: page.html
pick 675a02b adding todo items: logic.rb
pick 3264de2 adding todo items: page.html
pick 06f81c9 db adding works: db.sql
pick 0309336 db adding works: logic.rb
把它改成這個:
pick 08c275d first draft: db.sql
s 06f81c9 db adding works: db.sql
pick 675a02b adding todo items: logic.rb
s 0309336 db adding works: logic.rb
pick 272c674 first draft: page.html
s 3264de2 adding todo items: page.html
注意:請確保告訴 git rebase 按照按時間順序提交的順序應用/壓縮較小的主題提交。否則,你可能會遇到錯誤的,不必要的合併衝突。
當這個互動式的 rebase 完成後,你會得到這個:
$ git log --oneline master..
74bdd5f adding todos: GUI layer
e8d8f7e adding todos: business logic layer
121c578 adding todos: DB layer
概括
你現在已經將你的時間順序重新設定為主題提交。在現實生活中,你可能不需要每次都這樣做,但是當你確實想要或需要這樣做時,現在就可以。另外,希望你能學到更多關於 git rebase 的知識。