在代码审查之前重新定位
摘要
此目标是将所有分散的提交重新组织为更有意义的提交,以便更轻松地进行代码审查。如果同时在太多文件中存在太多层次的更改,则执行代码审查会更加困难。如果你可以将按时间顺序创建的提交重新组织到主题提交中,那么代码审查过程会更容易(并且可能会减少错误,因为代码审查过程中会出现错误)。
这个过于简化的示例并不是使用 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 的知识。