在代码审查之前重新定位

摘要

此目标是将所有分散的提交重新组织为更有意义的提交,以便更轻松地进行代码审查。如果同时在太多文件中存在太多层次的更改,则执行代码审查会更加困难。如果你可以将按时间顺序创建的提交重新组织到主题提交中,那么代码审查过程会更容易(并且可能会减少错误,因为代码审查过程中会出现错误)。

这个过于简化的示例并不是使用 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 的知识。