全部產品
Search
文件中心

Alibaba Cloud DevOps:推送評審模式

更新時間:Jun 18, 2025

推送評審模式通過簡化 git push 流程,無需額外工具即可自動建立和管理程式碼檢閱,提升代碼品質和協作效率。

自動化程式碼檢閱

雲效代碼管理的AGit-Flow模式,支援使用git pr來通過命令列直接建立程式碼檢閱,解決了建立評審的效率問題。使用該模式需要開發人員在本地安裝git-repo工具,並執行指定的命令。另一方面,不少開發人員也會關注是否可以針對提交的代碼進行審核,通過審核的代碼才可以被推送進目標分支。那麼有沒有這樣一種方式,在不需要安裝任何工具的情況下,執行git push就可以自動建立評審,並且能夠支援對提交進行評審?使用推送評審模式,可以實現這一目標。

推送評審模式及其優勢

推送評審模式,是Codeup新推出的一種代碼協同方式,可以為使用者帶來全新、高效的程式碼檢閱體驗:

  • 從開發人員的角度,發起程式碼檢閱不再需要建立新分支,也不必在開發完成後切換至瀏覽器來建立程式碼檢閱,直接執行git push即可一鍵發起評審。

  • 從管理者的角度,可以設定讓開發人員向倉庫push代碼時,不再直接更新分支的代碼,而是自動建立程式碼檢閱,通過評審的方式,保障代碼品質。

推送評審模式與現有分支模式對比:

分支開發模式

推送評審模式

提交代碼

在特性分支中提交

直接在主幹上提交

發起程式碼檢閱

Codeup網頁端操作

執行git push

更新程式碼檢閱

更新特性分支

繼續執行git push

貢獻代碼要求的權限

開發人員及以上角色

瀏覽者及以上許可權

代碼品質

僅保護分支受管控

所有分支的 push 均受管控

在程式碼程式庫設定中開啟推送評審模式後,具有以下優勢:

  • 向倉庫貢獻代碼,發起程式碼檢閱,不再需要建立新的分支,直接在主幹上進行修改並提交即可,避免了冗餘的分支管理成本。

  • git push不再直接推送分支內容,而是建立/更新程式碼檢閱。

  • 如果代碼需要修補,提交後繼續執行git push,已發起的評審會自動更新。

  • 向倉庫貢獻代碼不再需要授予開發人員許可權,擁有倉庫的瀏覽者許可權即可貢獻代碼,而且貢獻的代碼需要經過評審才能正式合入程式碼程式庫。因此可以將直接寫庫的許可權最小化到少數管理者手中,而大部分開發人員僅需要讀許可權即可,降低了程式碼程式庫被意外修改的風險。

  • 支援指定push option來控制具體的推送行為,見 使用推送評審模式進行協作 一節。

開啟方式

倉庫設定 > 推送規則設定中,可以看到推送評審模式的開關,單擊此開關即可開啟/關閉推送評審模式的功能:

image

重要

開啟推送評審模式後,會改變git push的行為,請Crowdsourced Security Testing悉並理解後再開啟推送評審模式:

  • 開啟推送評審模式後,執行git push不再直接更新遠端的代碼(即便擁有倉庫的開發人員許可權),而是自動建立/更新程式碼檢閱。

  • 倉庫的瀏覽者,可以通過git push發起評審,但請放心此時代碼還未合入分支,需要根據分支評審和合并要求通過後才可手動合入。

  • 由於git push並不直接更新代碼而是建立評審,因此不會觸發推送事件的webhook。

  • 使用者可以在Codeup網頁端以評審的方式建立,編輯或刪除檔案。

使用推送評審模式進行協作

下面,用幾個實際的例子,說明如何使用推送評審模式進行開發協作。

自動建立評審

假設現在接到了一個開發工作單位,使用推送評審模式可以簡化為兩步:

  • 在主幹上進行開發。

  • git push

下面我們來具體看看。

  1. 在樣本倉庫的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
  2. 然後,我們將改動推送至遠端,執行git push

    $ git push
    枚舉對象中: 4, 完成.
    對象計數中: 100% (4/4), 完成.
    使用 12 個線程進行壓縮
    壓縮對象中: 100% (2/2), 完成.
    寫入對象中: 100% (3/3), 310 位元組 | 310.00 KiB/s, 完成.
    總共 3(差異 0),複用 0(差異 0),包複用 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沒有直接更新遠端的代碼,而是建立了一個程式碼檢閱,ID 是31620。此程式碼檢閱的源為本地最新的提交,目標則是當前的分支。可以通過程式碼檢閱的詳情來確認:

高的 (55)

通過這種方式,我們不再需要建立特性分支,也不必切換至瀏覽器建立評審,極大簡化了步驟。並且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
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 340 位元組 | 340.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 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

根據提示資訊,這次推送更新了 ID 為31620的程式碼檢閱。查看評審詳情,看到程式碼檢閱的源版本已經變為了e00db4522,並且提交歷史也變為了2。如果代碼仍然需要修改,重複以上流程即可。

建立新的評審

重複執行git push命令,會自動更新已經存在的評審。如果並不想更新評審,而是想要建立一個新的評審,那要如何操作呢?這可以通過在 push 命令中添加push option來實現。具體來說,執行 git push -o review=new,就可以建立新的程式碼檢閱。

在本地改動一些代碼,執行git push -o review=new,成功建立了 ID 為31626的程式碼檢閱。

$ git push -o review=new
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 361 位元組 | 361.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 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
總共 0(差異 0),複用 0(差異 0),包複用 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: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'

更新指定的評審

在同時有多個開啟的程式碼檢閱的情況下,執行git push時,會因無法判斷想要更新哪一個評審而失敗。

$ git push
枚舉對象中: 5, 完成.
對象計數中: 100% (5/5), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 294 位元組 | 294.00 KiB/s, 完成.
總共 3(差異 1),複用 0(差異 0),包複用 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: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'

提示資訊顯示同一目標分支有兩個評審,ID分別為31626以及31620,因此無法判斷想要更新的是哪一個評審。有兩種解決方式:

  • 使用 -o review=new,建立一個新的程式碼檢閱。

  • 使用 -o review=<MR-ID>,指定要更新的評審ID。

第一種方式在建立新的評審一節中已經示範過了,我們來看如何更新指定的評審。

假如此時要更新31626評審,命令為:git push -o review=31626

$ git push -o review=31626
枚舉對象中: 5, 完成.
對象計數中: 100% (5/5), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 303 位元組 | 303.00 KiB/s, 完成.
總共 3(差異 1),複用 0(差異 0),包複用 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的程式碼檢閱。

更新評審的衝突解決

有時,想要更新程式碼檢閱時,會發現評審可能已被其他使用者更新,此時,為了避免其他使用者的更新被覆蓋,會導致更新失敗。假設我們要更新31644評審,執行:git push -o review=31644

$ git push -o review=31644
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 326 位元組 | 326.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 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: 無法推送一些引用到 'https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo.git'

提示資訊表明此次push會引起評審的衝突,更新失敗。此時有兩種選擇:

  • 拉取其他使用者的更新,在本地解決後再更新評審。

  • 強制重新整理評審。

先來看第一種方式。拉取更新在本地解決後再更新評審。

首先,執行 git fetch origin refs/merge-requests/<mr-id>/head,這裡mr-id31644,所以需要執行的命令是:git fetch origin refs/merge-requests/31644/head

$ git fetch origin refs/merge-requests/31644/head
來自 https://codeup.aliyun.com/61234c2d1bd96aa110f27b9c/demo
 * branch                  refs/merge-requests/31644/head -> FETCH_HEAD

然後,rebase本地的改動到評審對應的引用上。執行git rebase FETCH_HEAD。rebase操作可能會出現衝突,請根據實際情況解決。

$ git rebase FETCH_HEAD
成功變基並更新 refs/heads/master。

這樣,本地就擁有了遠端的代碼,然後重新執行push。

$ git push -o review=31644
枚舉對象中: 4, 完成.
對象計數中: 100% (4/4), 完成.
使用 12 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 331 位元組 | 331.00 KiB/s, 完成.
總共 3(差異 0),複用 0(差異 0),包複用 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這個程式碼檢閱。

強制重新整理評審

有時,不想合并其他使用者的改動,想要把評審強制重新整理成本地的版本,這個時候應該如何操作呢?

此時,需要知道兩個值。

  • 一個是程式碼檢閱的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
總共 0(差異 0),複用 0(差異 0),包複用 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: +---------------------------------------------------------------------+