3 ポイント 投稿者 GN⁺ 2024-09-12 | 1件のコメント | WhatsAppで共有

なぜ一部の人は「interdiff」コードレビューを好むのか

Gerritコードレビューツールの評価

  • Gerritはオープンソースのコードレビューツールで、Gitリポジトリとともに動作する
  • リポジトリにパッチを作成し、レビューのために提出できる
  • 他の人が書いたコードを確認し、修正すべき問題を指摘する
  • コードレビューは一般的に良いアイデアである
  • オープンソースプロジェクトではコードがマージされうるが、これは責任と技術的負債を増加させる

さまざまなコードレビューツール

  • Gerrit、GitHub、Phabricator、バグトラッカーへの.patchファイルのアップロード、git send-emailによるメール送信など、さまざまなツールがある
  • 各ツールはそれぞれ異なる度合いで機能する

理想的なパッチシリーズ

  • 3つのパッチシリーズは、コードベースの進化を段階的に示す
  • 変更は論理的に分離されているべきであり、各パッチが個別に適用されたものとして読めるべきである
  • コードレビューを通じて、このような理想的なシリーズが検討される

GitHubのコードレビュー方式: 「diff soup」

  • GitHubはもともと、元のコミットの上に新しいコミットを追加してレビューを行うことを推奨している
  • これはUXデザインやさまざまな理由によって生じている
  • レビュー過程で複数のコミットが追加されると、コミット間の暗黙的な関係が複雑になる
  • git blamegit bisectツールの利用が難しくなる

より良い方法: 「interdiff」レビュー(別名 git range-diff

  • 新しいコミットを追加する代わりに、元のコミットの新しいバージョンを公開する
  • git range-diffを使って、コミットのバージョン間の差分を比較する
  • レビュアーはdiff全体を読み直す必要なく、増分レビューを行える
  • git blamegit bisectツールはより信頼性高く動作する

補足説明: パッチのマージ戦略

  • 上記の方法はマージ戦略とは独立している(例: git rebase vs 複数親のgit mergeコミット)

補足説明: git rebaseは悪なのか

  • git rebaseは問題ない。ただし、他の人がコミットを基にする公開ブランチでは使うべきではない

その他のメモ

結論

  • interdiffレビューシステムは、より小さく、より速くメインブランチへマージされるパッチを促進する
  • レビュアーと作者の双方に、より良いコードレビュー体験を提供する

GN⁺のまとめ

  • この記事は、コードレビューツールと方法論についての踏み込んだ分析を提供する
  • interdiffレビュー方式は、コードレビューの効率を大幅に向上させうる
  • GitHubの「diff soup」問題の解決に役立つ
  • コードレビューツールを選ぶ際に考慮すべき重要な要素を提示している
  • 類似した機能を持つツールとしては、GitHub、Gerrit、Phabricatorなどがある

1件のコメント

 
GN⁺ 2024-09-12
Hacker Newsの意見
  • GitHubで主に使われているワークフローは手間が多く、共同作業者にとって明確ではない

    • レビュアーがフィードバックを反映した差分を確認できるようにし、git blamegit bisectを壊さない
    • レビュアーのフィードバックを反映する際は、git commit --fixup <更新するコミットのハッシュ>を使う
    • PRが承認されたら、git rebase --interactive origin/main --autosquashを使ってfixupコミットを元のコミットにまとめる
    • 最後にgit push --force-with-leaseを使ってマージする
    • 長いコマンドは自動補完機能を使って簡単に入力する
  • GitHubのコードレビュー方式は非効率で、Phabricatorを使って手動で対処していた

    • 明示的なUIがあればもっと良いはず
  • GitHubのコードレビュー方式より良いシステムを望んでいる

    • 小さなバグ修正パッチを素早くマージし、レビュー範囲を狭めたい
    • 別のレビュー/PRにしろという意見もあるが、パッチセット間の依存関係の問題が生じる
  • 新しいコードレビューのアプローチを見るのは常に興味深い

    • パッチを別々の依存PRに分けることを検討したことがある
    • GitContextのようなツールを使えば、PRを小さく保ちながら依存関係を維持できる
    • AIを使ってPRとレビューを要約し、正確なコミットメッセージを生成できる
    • レビュアーは最後のレビュー以降の変更だけを確認できる
  • Review Boardでinterdiffsが最初に導入され、これはコードレビューで非常に有用だった

    • fix-itコミットは適切な代替ではない
      1. アップストリームの変更を把握できない
      2. コミットグラフが複雑になる
      3. 全員がGitを使っているわけではない
    • interdiffsにより、レビュアーは最初のレビュー依頼からすべての更新を追跡できる
    • 複数のコミットを1つのレビュー依頼として投稿する際に便利
  • Gerritコードレビューシステムを使った経験があり、GitHubのコードレビューは非効率的だと感じる

    • Gerritは複数のパッチをスタックすることをサポートしており、小さなパッチを簡単にレビューできる
    • GitHubのインターフェースはフォーラムのスレッドのように見え、rebaseを追跡できない
  • さまざまなコードレビューシステムを使ってきた経験があり、それぞれに長所と短所がある

    • CritiqueはGoogleのモノレポとカスタムVCS向けに最適化されている
    • Gerritはレビュアーには良いが、作成者には使いにくい
    • GitHubは作成者には親しみやすいが、レビュアーやチームにとっては非効率的
    • より良いコードレビューツールを使うことが重要
  • Gerritコードレビューシステムを使った後では、GitHubのスタックPRは使いづらい

    • GitHubはコードレビューコメントに対する変更を適切に表示しない
    • いくつかのスクリプトを使ってスタックPR作業をより簡単にしている
    • ejoffe/sprやspacedentist/sprのようなツールが役立つ