Git 在代码审查之前重新评估

示例

概要

这个目标是将您所有分散的提交重组为更有意义的提交,以简化代码审查。如果一次要对太多文件进行太多更改,则很难进行代码审查。如果您可以将按时间顺序创建的提交重新组织为主题提交,则代码复审过程会更容易(并且可能会在代码复审过程中漏出更少的错误)。

这个过度简化的示例并不是使用git进行更好的代码审查的唯一策略。这就是我这样做的方式,它激发了其他人去思考如何使代码审查和git历史更容易/更好。

这也从教学上证明了重新设置的强大功能。

本示例假定您了解交互式重新基准化。


假设:

  • 您正在从master进行功能分支

  • 您的功能具有三个主要层:前端,后端,数据库

  • 在功能分支上进行了大量提交。每个提交一次触及多层

  • 您想要(最后)分支中只有三个提交

    • 一个包含所有前端更改的

    • 一个包含所有后端更改的

    • 一个包含所有数据库更改

战略:

  • 我们将按时间顺序将提交更改为“主题”提交。

  • 首先,将所有提交分成多个较小的提交-每个提交一次仅包含一个主题(在我们的示例中,主题是前端,后端,数据库更改)

  • 然后将我们的主题提交重新排序,并将它们“压缩”为单个主题提交

例:

$ git log --oneline master..
975430b db adding works:db.sqllogic.rb
3702650 trying to allow adding todo items:page.htmllogic.rb
43b075a first draft:page.htmland db.sql
$ git rebase -i master

这将显示在文本编辑器中:

pick 43b075a first draft:page.htmland db.sql
pick 3702650 trying to allow adding todo items:page.htmllogic.rb
pick 975430b db adding works:db.sqllogic.rb

更改为此:

e 43b075a first draft:page.htmland db.sql
e 3702650 trying to allow adding todo items:page.htmllogic.rb
e 975430b db adding works:db.sqllogic.rb

然后git将一次应用一次提交。每次提交后,都会显示提示,然后您可以执行以下操作:

Stopped at 43b075a92a952faf999e76c4e4d7fa0f44576579... first draft:page.htmland 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 adddb.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按时间顺序提交/压缩较小的主题提交。否则,您可能会有错误的不必要的合并冲突要处理。

说完该交互式基础后,您将获得:

$ git log --oneline master..
74bdd5f adding todos: GUI layer
e8d8f7e adding todos: business logic layer
121c578 adding todos: DB layer

回顾

现在,您已将按时间顺序的提交重新设置为主题提交。在现实生活中,您可能不需要每次都执行此操作,但是当您想要或需要执行此操作时,现在可以。另外,希望您了解了有关git rebase的更多信息。