在程式碼審查之前重新定位

摘要

此目標是將所有分散的提交重新組織為更有意義的提交,以便更輕鬆地進行程式碼審查。如果同時在太多檔案中存在太多層次的更改,則執行程式碼審查會更加困難。如果你可以將按時間順序建立的提交重新組織到主題提交中,那麼程式碼審查過程會更容易(並且可能會減少錯誤,因為程式碼審查過程中會出現錯誤)。

這個過於簡化的示例並不是使用 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 的知識。