プッシュレビューモードは、git push ワークフローを簡素化し、追加のツールなしでコードレビューを自動的に作成および管理することで、コード品質とコラボレーション効率を向上させます。
背景
Codeup の AGit-Flow モードは、git pr を使用したコマンドライン経由のコードレビューの作成をサポートしています。 このモードでは、開発者は git-repo ツールをローカルにインストールする必要があります。
しかし、ほとんどの開発者は、追加のツールなしで承認されたコードをターゲットブランチにマージしたいと考えています。これを達成するために、Codeup はプッシュレビューモードを導入しました。これにより、開発者は git-repo のような外部ツールを使用せずに、git push を実行するだけでコードレビューを作成できます。
プッシュレビューモードとその利点
プッシュレビューモードは、Codeup によって導入された新しいコードコラボレーション方法であり、ユーザーに新しく効率的なコードレビューエクスペリエンスを提供します。
開発者の場合、コードレビューを開始するために、新しいブランチを作成したり、開発完了後にブラウザに切り替えてレビューを作成したりする必要がなくなりました。
git pushを実行するだけで、レビューを開始できます。管理者の場合、開発者がリポジトリにコードを
pushするときに、ブランチコードを直接更新する代わりに、コードレビューを自動的に作成するシステムをセットアップするだけです。 このプロセスにより、レビューメカニズムを通じてコード品質が保証されます。
プッシュレビューモードと既存のブランチモードの比較:
ブランチ開発モード | プッシュレビューモード | |
コードのコミット | フィーチャー ブランチにコードをコミットします。 | マスター ブランチに直接コードをコミットします。 |
コードレビューの開始 | Codeup ウェブページでコードレビューを開始します。 |
|
コードレビューの更新 | フィーチャーブランチの更新 |
|
コードの提供に必要な権限 | 開発者ロール以上 | 閲覧者権限以上 |
コード品質 | 保護されたブランチのみが制御される | すべてのブランチへのプッシュが制御される |
リポジトリ設定でプッシュレビューモードを有効にすると、次の利点があります。
リポジトリにコードを提供してコードレビューを開始するために、新しいブランチを作成する必要がなくなりました。メインブランチで直接変更とコミットを行うことができ、冗長なブランチ管理のオーバーヘッドを回避できます。
git pushは、ブランチコンテンツを直接プッシュするのではなく、コードレビューを作成または更新します。コードを変更する必要がある場合は、コードをコミットした後、
git pushを引き続き実行できます。開始されたレビューは自動的に更新されます。リポジトリへのコードの提供に、開発者権限は不要になりました。リポジトリへの閲覧者権限があればコードを提供でき、提供されたコードは正式にコードベースにマージされる前にレビューされる必要があります。そのため、リポジトリへの直接書き込み権限は少数の管理者に最小限に抑えることができ、ほとんどの開発者は読み取り権限のみを必要とするため、コードベースを誤って変更するリスクを軽減できます。
このモードでは、
push オプションを指定して、特定のプッシュ動作を制御できます。 詳細については、「コラボレーションにプッシュレビューモードを使用する」セクションをご参照ください。
有効化する方法
で、プッシュレビューモードのスイッチを確認できます。このスイッチをクリックして、プッシュレビューモード機能を有効/無効にします。

プッシュレビューモードを有効にすると、git push の動作が変わります。 プッシュレビューモードを有効にする前に、次の変更点を確認してください。
プッシュレビューモードを有効にした後、
git pushを実行しても、リモートコードは直接更新されなくなります(リポジトリに対する開発者権限がある場合でも)。 代わりに、コードレビューが自動的に作成または更新されます。リポジトリ閲覧者は
git pushを介してレビューを開始できますが、コードはまだブランチにマージされていないので安心してください。 ブランチのレビューとマージの要件を満たした後、手動でマージする必要があります。git pushはコードを直接更新するのではなくレビューを作成するため、プッシュイベント Webhook はトリガーされません。ユーザーは、Codeup Web インターフェイスでレビュープロセスを通じて、ファイルの作成、編集、または削除を実行できます。
プッシュレビューモードを使ったコラボレーション
以下では、プッシュレビューモードを使った開発コラボレーションの方法を、いくつかの実践的な例を使って説明します。
レビューの自動作成
開発タスクがあるとします。プッシュレビューモードを使用すると、2 つのステップで簡略化できます。
メインブランチで開発する。
git pushを実行します。
詳しく見てみましょう。
サンプルリポジトリのマスターブランチで開発し、
27e76f58をコミットします。$ git log commit 27e76f582ca7207a695dd8762b66ef443adcc572 (HEAD -> master) Author: Codeup User <codeup.user@example.com> Date: Tue Oct 11 10:16:18 2022 +0800 feat: new feature // 新機能 Signed-off-by: Codeup User <codeup.user@example.com> commit 44094ec92eb122deab5a0367552bd081540c4353 (origin/master, origin/HEAD) Author: Codeup User <codeup.user@example.com> Date: Tue Oct 11 10:09:39 2022 +0800 Initial commit // 初期コミット次に、
git pushを実行して、変更をリモートリポジトリにプッシュします。$ git push Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Compressing objects using 12 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 310 bytes | 310.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 remote: +-----------------------------------------------------------------------------------+ remote: | The following tips are provided by Codeup: | remote: +-----------------------------------------------------------------------------------+ remote: | Merge request #31620 has been created, please visit: | // マージリクエスト #31620 が作成されました。アクセスしてください: remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 | remote: +-----------------------------------------------------------------------------------+ To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git * [new reference] master -> refs/merge-requests/31620/head
プッシュレビューモードを有効にすると、git push はリモートコードを直接更新するのではなく、ID 31620 のコードレビューを作成します。 このコードレビューのソースは最新のローカルコミットであり、宛先は現在のブランチです。 これは、コードレビューの詳細で確認できます。

この方法では、フィーチャーブランチを作成したり、ブラウザに切り替えてレビューを作成したりする必要がなくなるため、ワークフローが大幅に簡素化されます。 さらに、git push は、マージされる前にレビューを通過する必要があるため、コード品質が保証されます。
レビューの自動更新
コードレビュープロセス中に、コードがコード受け入れ基準を満たす前に、レビュー担当者のコメントに基づいてコードを繰り返し変更する必要があることがよくあります。 では、コードが変更された後、対応するコードレビューはどのように更新されるのでしょうか? 次のセクションでは、git push を使用してレビューを自動的に更新する方法について説明します。
まず、27e76f58 に基づいて、レビューコメントに従ってコードをいくつか変更し、e00db452 をコミットします。
$ git log
commit e00db4522f2d6ca5b42377ca76c7b3a7e12db8a5 (HEAD -> master)
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 11:09:42 2022 +0800
feat: fix comment // コメント修正
Signed-off-by: Codeup User <codeup.user@example.com>
commit 27e76f582ca7207a695dd8762b66ef443adcc572
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 10:16:18 2022 +0800
feat: new feature // 新機能
Signed-off-by: Codeup User <codeup.user@example.com>
commit 44094ec92eb122deab5a0367552bd081540c4353 (origin/master, origin/HEAD)
Author: Codeup User <codeup.user@example.com>
Date: Tue Oct 11 10:09:39 2022 +0800
Initial commit // 初期コミット次に、git push を実行すると、システムはコードレビューのステータスを自動的に更新し、関連するプロンプト情報を表示します。
$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 340 bytes | 340.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31620 has been updated, please visit: | // マージリクエスト #31620 が更新されました。アクセスしてください:
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
27e76f582c..e00db4522f master -> refs/merge-requests/31620/headプロンプト情報によると、このプッシュは ID 31620 のコードレビューを更新します。 レビューの詳細を確認すると、コードレビューのソースバージョンが e00db4522 に変更され、コミット数が 2 に変更されていることがわかります。 コードをさらに変更する必要がある場合は、前のプロセスを繰り返すだけです。
新しいレビューの作成
git push コマンドを繰り返し実行すると、既存のレビューが自動的に更新されます。 レビューを更新せずに新しいレビューを作成する場合は、push コマンドに push オプションを追加します。 具体的には、git push -o review=new を実行すると、新しいコードレビューが作成されます。
ローカルコードをいくつか変更した後、git push -o review=new を実行します。 その後、ID 31626 のコードレビューが正常に作成されます。
$ git push -o review=new
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 361 bytes | 361.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31626 has been created, please visit: | // マージリクエスト #31626 が作成されました。アクセスしてください:
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
* [new reference] master -> refs/merge-requests/31626/head注: プッシュ時に同じターゲットのレビューが既に存在する場合は、新しいレビューを作成できません。
$ git push -o review=new
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request create failed. There exists a same merge request in progress: | // マージリクエストの作成に失敗しました。同じマージリクエストが進行中です:
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (create MR failed) // (MR の作成に失敗しました)
error: Failed to push some references to 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'特定のレビューの更新
複数のオープンコードレビューがある場合、git push を実行すると、どのレビューを更新したいかを判断できないため、失敗します。
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 294 bytes | 294.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: +-------------------------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |
remote: +-------------------------------------------------------------------------------------------------+
remote: | You need to manually specify the merge request to update because there are already | // 同じターゲットブランチに対して以前に作成したマージリクエストが複数あるため、更新するマージリクエストを手動で指定する必要があります。
remote: | multiple merge requests that you created earlier for the same target branch: |
remote: | |
remote: | * [ID: 31626] https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: | * [ID: 31620] https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31620 |
remote: | |
remote: | Then, update specific merge request based on it's ID (MR-ID): | // その後、ID (MR-ID) に基づいて特定のマージリクエストを更新します。
remote: | git push -o review=<MR-ID> |
remote: | |
remote: | Or you can create a new one: | // または、新しいものを作成できます。
remote: | git push -o review=new |
remote: +-------------------------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (unable to determine which mr to update) // (更新する MR を特定できません)
error: Failed to push some references to 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'プロンプト情報には、同じターゲットブランチに対する 2 つのレビュー(ID 31626 と 31620)があることが示されています。 したがって、システムはどのレビューを更新したいかを判断できません。 この問題には、2 つの解決策があります。
-o review=newを使用して、新しいコードレビューを作成します。-o review=<MR-ID>を使用して、更新するレビュー ID を指定します。
最初のメソッドは、[新しいレビューの作成] セクションですでにデモされています。特定のレビューを更新する方法を見てみましょう。
ID 31626 のレビューを更新するとします。 コマンドは git push -o review=31626 になります。
$ git push -o review=31626
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: | // Codeup から次のヒントが提供されています。
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31626 has been updated, please visit: | // マージリクエスト #31626 が更新されました。次の URL をご覧ください。
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31626 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
0ba010f2ff..037578c634 master -> refs/merge-requests/31626/headこのようにして、ID 31626 のコードレビューを更新しました。
レビュー更新時の競合の解決
コードレビューを更新しようとすると、レビューが別のユーザーによってすでに更新されていることがわかる場合があります。 この場合、システムは、ユーザーによって行われた変更が上書きされるのを防ぐために、更新が実行されないようにします。 レビュー 31644 を更新するとします。 git push -o review=31644 コマンドを実行します。
$ git push -o review=31644
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 326 bytes | 326.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +--------------------------------------------+
remote: | The following tips are provided by Codeup: | // Codeup からのヒントを以下に示します。
remote: +--------------------------------------------+
remote: | MR is diverged with this push | // このプッシュにより MR が分岐します
remote: +--------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (MR is diverged with this push) // (このプッシュにより MR が分岐します)
error: Failed to push some references to 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'プロンプト情報はこのプッシュがレビューで競合を引き起こすことを示しているため、更新は失敗しました。この時点で 2 つのオプションがあります。
他のユーザーの更新をプルし、ローカルで解決してから、レビューを更新します。
レビューを強制的にリフレッシュします。
最初の方法を例に取ります。
まず、git fetch origin refs/merge-requests/<mr-id>/head を実行します。 この例では、mr-id を 31644 に置き換えます。 その結果、実行するコマンドは git fetch origin refs/merge-requests/31644/head になります。
$ git fetch origin refs/merge-requests/31644/head
From https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo
* branch refs/merge-requests/31644/head -> FETCH_HEAD次に、ローカルの変更をレビューに対応する参照にリベースします。 git rebase FETCH_HEAD を実行します。 リベース操作で競合が発生する場合があります。 特定の状況に応じて競合を解決します。
$ git rebase FETCH_HEAD
Successfully rebased and updated refs/heads/master. // refs/heads/master のリベースと更新が完了しました。これで、ローカルリポジトリにリモートコードがあります。プッシュを再度実行します。
$ git push -o review=31644
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects using 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 331 bytes | 331.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: | // Codeup からのヒントを以下に示します。
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31644 has been updated, please visit: | // マージリクエスト #31644 が更新されました。次の URL をご覧ください。
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
a4a2cad45c..8da076fb44 master -> refs/merge-requests/31644/headレビューを強制的にリフレッシュする
他のユーザーの変更をマージせずに、レビューをローカルバージョンに強制的にリフレッシュしたい場合があります。どのようにすればよいでしょうか。
この場合、2 つの値を知る必要があります。
1 つはコードレビューの ID で、コードレビュー URL の最後の数字セグメントです。 たとえば、コードレビュー URL が
https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644の場合、レビューの ID は31644です。もう 1 つはコードレビューのソースバージョンです。 これは、コードレビューの詳細ページから取得できます。 この場合、対応するソースバージョンは
8da076fbです。
次に、git push -o review=<mr-id> -o old-oid=<old-oid> を実行できます。 この例では、コマンドは git push -o review=31644 -o old-oid=8da076fb になります。
このようにして、ローカルバージョンで 31644 レビューをリフレッシュしました。 このプロセス中に、他のユーザーによって行われた変更が上書きされることに注意してください。 これらの変更が失われないようにするには、バージョンを強制的にリフレッシュする場合にのみ、このコマンドを実行します。
$ git push -o review=31644 -o old-oid=8da076fb
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: +-----------------------------------------------------------------------------------+
remote: | Codeup から次のヒントが提供されています: | // 翻訳済みコメント
remote: +-----------------------------------------------------------------------------------+
remote: | マージリクエスト #31644 が更新されました。アクセスしてください: | // 翻訳済みコメント
remote: | https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644 |
remote: +-----------------------------------------------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
8da076fb44..8da076fb44 master -> refs/merge-requests/31644/headレビューをスキップしてコードを直接更新する
コードコメントのタイプミスを修正するなど、軽微な変更のみをコミットし、コードレビューをスキップしたい場合があります。 この場合、git push -o review=no コマンドを使用して、コードレビューの作成をスキップできます。 コマンドの動作は、プッシュレビューモードが有効になっていないときに git push を実行した場合と同じです。 review=no を使用してコードを直接プッシュするには、対応するブランチに対するプッシュ権限が必要です。
追加の注意事項
レビューを更新するには、レビュー担当者または作成者である必要があります。そうでない場合、更新は失敗します。
remote: +---------------------------------------------------------------------+
remote: | The following tips are provided by Codeup: |