プッシュレビューモードは、追加のツールなしでマージリクエストを自動的に作成・管理することで `git push` ワークフローを簡素化し、コードの品質とコラボレーションの両方を向上させます。
コードレビューの自動化
Codeup では、AGit-Flow モードを使用すると、コマンドラインから git pr を実行してコードレビューを作成でき、レビュー作成の効率が向上します。しかし、このモードでは、ローカルに git-repo ツールをインストールし、特定のコマンドを実行する必要があります。多くの開発者は、送信されたコードがターゲットブランチにプッシュされる前にレビューされるワークフローも求めています。プッシュレビューモードは、git push を実行する際に追加のツールを必要とせず、コミットに対してマージリクエストを自動的に作成することでこれを実現します。
プッシュレビューモードの利点
プッシュレビューモードは、効率的なコードレビュー体験を提供する Codeup の新しいコードコラボレーションメソッドです。
開発者向け:コードレビューを開始するために、新しいブランチを作成したり、Web ブラウザーに切り替えたりする必要はもうありません。
git pushを実行するだけで、ワンステップでマージリクエストを作成できます。管理者向け:開発者がコードを
pushしたときにブランチが直接更新されるのではなく、マージリクエストが自動的に作成されるようにリポジトリを設定できます。これにより、必須のレビュープロセスを通じてコードの品質が保証されます。
次の表は、プッシュレビューモードと標準のブランチ開発モードを比較したものです。
ブランチ開発モード | プッシュレビューモード | |
コードのコミット | フィーチャーブランチにコミットします。 | master ブランチに直接コミットします。 |
コードレビューの開始 | Codeup の Web UI を使用します。 |
|
コードレビューの更新 | フィーチャーブランチを更新します。 | 再度 |
コントリビュートに必要な権限 | 開発者以上 | 閲覧者以上 |
コードの品質 | 保護されたブランチへのプッシュのみがレビューされます。 | すべてのブランチへのすべてのプッシュがレビューされます。 |
リポジトリ設定でプッシュレビューモードを有効にすると、次の利点があります。
新しいブランチを作成せずに、コードをコントリビュートしてマージリクエストを作成できます。master ブランチに直接変更をコミットできるため、冗長なブランチを管理するオーバーヘッドを回避できます。
git pushを実行すると、変更をブランチに直接プッシュする代わりに、マージリクエストが作成または更新されます。レビュー後にコードの変更が必要になった場合、さらにコミットを作成して再度
git pushを実行すると、既存のマージリクエストが自動的に更新されます。閲覧者権限のみを持つユーザーもコードをコントリビュートできます。プッシュはコードを直接マージするのではなくマージリクエストを作成するため、少数の管理者に書き込み権限を付与し、ほとんどの開発者には読み取り権限のみを付与することができます。このモデルにより、リポジトリへの偶発的な変更のリスクが軽減されます。
プッシュオプションを使用して git push の動作をコントロールできます。詳細については、「プッシュレビューモードでのコラボレーション」セクションをご参照ください。
プッシュレビューモードの有効化
で、スイッチをクリックしてプッシュレビューモードを有効または無効にします。

プッシュレビューモードを有効にすると、git push の動作が変更されます。このモードを有効にする前に、この変更を認識し、理解してください。
有効にすると、
git pushを実行すると、リモートブランチを直接更新する代わりに、マージリクエストが自動的に作成または更新されます。これは、リポジトリの開発者権限を持っている場合でも適用されます。閲覧者ロールを持つユーザーは、
git pushを実行してマージリクエストを作成できます。コードは、ブランチの要件に従って承認およびマージされた後にのみ、ブランチにマージされます。git pushはコードを直接更新するのではなくマージリクエストを作成するため、プッシュイベントの Webhook はトリガーされません。レビューワークフローの一環として、引き続き Codeup の Web UI を使用してファイルを作成、編集、または削除できます。
プッシュレビューモードでのコラボレーション
次の例は、開発コラボレーションでプッシュレビューモードを使用する方法を示しています。
マージリクエストの自動作成
新しい開発タスクがあるとします。プッシュレビューモードでは、ワークフローはわずか 2 ステップです。
master ブランチで開発します。
git pushを実行します。
例を見ていきましょう。
サンプルリポジトリの `master` ブランチで開発し、コミット (例:
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: 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: | 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 はリモートブランチを直接更新しませんでした。代わりに、マージリクエスト #31620 が作成されました。このマージリクエストのソースは最新のローカルコミットで、ターゲットは現在のブランチです。これはマージリクエストの詳細ページで確認できます。

このワークフローにより、フィーチャーブランチを作成したり、Web ブラウザーを使用してマージリクエストを作成したりする必要がなくなり、プロセスが大幅に簡素化されます。さらに、すべてのプッシュはマージ前にレビューされる必要があるため、code quality (コードの品質) が保証されます。
マージリクエストの自動更新
コードレビュー中、レビュー担当者からのフィードバックに基づいてコードを複数回修正する必要がよくあります。対応するマージリクエストを更新するには、再度 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: 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: |
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この出力は、このプッシュがマージリクエスト #31620 を更新したことを示しています。詳細ページを確認すると、マージリクエストのソースバージョンが e00db4522 に変更され、コミット履歴に 2 つのコミットが表示されるようになります。さらに変更が必要な場合は、このプロセスを繰り返します。
新しいマージリクエストの作成
git 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: 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: |
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)
error: failed to push some refs to 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'特定のマージリクエストの更新
同じターゲットブランチに対して複数のオープンなマージリクエストがある場合、システムがどれを更新すべきか判断できないため、git push は失敗します。
$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
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): |
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)
error: failed to push some refs to 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'出力には、同じターゲットブランチに対して 2 つのオープンなマージリクエスト (ID 31626 と 31620) が表示されます。システムは、どちらを更新しようとしているのか判断できません。2 つのオプションがあります。
-o review=newを使用して新しいマージリクエストを作成します。-o review=<MR-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: 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: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31626 has been updated, please visit: |
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 のマージリクエストが更新されます。
更新の競合の解決
マージリクエストを更新しようとすると、別のユーザーがすでに更新している場合があります。プッシュによってそのユーザーの変更が上書きされるのを防ぐため、更新は失敗します。たとえば、git push -o review=31644 を実行してマージリクエスト #31644 を更新しようとすると、次のエラーが表示されることがあります。
$ git push -o review=31644
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
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: |
remote: +--------------------------------------------+
remote: | MR is diverged with this push |
remote: +--------------------------------------------+
To https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git
! [remote rejected] master -> master (MR is diverged with this push)
error: failed to push some refs 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.リベースが成功すると、ローカルブランチにリモートの変更が含まれます。これで、再度プッシュできます。
$ git push -o review=31644
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
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: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31644 has been updated, please visit: |
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これで、マージリクエスト #31644 の更新に成功しました。
マージリクエストの強制更新
場合によっては、マージリクエストのリモートの変更をローカルバージョンで上書きしたいことがあります。これを行うには、強制更新を実行する必要があります。
2 つの情報が必要になります。
マージリクエスト ID。これはマージリクエスト URL の末尾にある番号です。たとえば、URL が
https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo/merge_request/31644の場合、ID は31644です。マージリクエストの現在のソースバージョン。これはマージリクエストの詳細ページで確認できます。この例では、ソースバージョンは
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: | The following tips are provided by Codeup: |
remote: +-----------------------------------------------------------------------------------+
remote: | Merge request #31644 has been updated, please visit: |
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: |
remote: +---------------------------------------------------------------------+
remote: | Merge request #31644 update failed. |
remote: | You need to be the author or reviewer to update this merge request. |
remote: +---------------------------------------------------------------------+