云效代碼管理的AGit-Flow模式,支持使用git pr
來通過命令行直接創建代碼評審,解決了創建評審的效率問題。使用該模式需要開發者在本地安裝git-repo
工具,并執行指定的命令。另一方面,不少開發者也會關注是否可以針對提交的代碼進行審核,通過審核的代碼才可以被推送進目標分支。那么有沒有這樣一種方式,在不需要安裝任何工具的情況下,執行git push
就可以自動創建評審,并且能夠支持對提交進行評審?使用推送評審模式,可以實現這一目標。
推送評審模式及其優勢
推送評審模式,是Codeup新推出的一種代碼協同方式,可以為用戶帶來全新、高效的代碼評審體驗:
從開發者的角度,發起代碼評審不再需要創建新分支,也不必在開發完成后切換至瀏覽器來創建代碼評審,直接執行
git push
即可一鍵發起評審。從管理者的角度,可以設置讓開發人員向倉庫
push
代碼時,不再直接更新分支的代碼,而是自動創建代碼評審,通過評審的方式,保障代碼質量。
推送評審模式與現有分支模式對比:
分支開發模式 | 推送評審模式 | |
提交代碼 | 在特性分支中提交 | 直接在主干上提交 |
發起代碼評審 | Codeup網頁端操作 | 執行 |
更新代碼評審 | 更新特性分支 | 繼續執行 |
貢獻代碼所需權限 | 開發者及以上角色 | 瀏覽者及以上權限 |
代碼質量 | 僅保護分支受管控 | 所有分支的 push 均受管控 |
在代碼庫設置中開啟推送評審模式后,具有以下優勢:
向倉庫貢獻代碼,發起代碼評審,不再需要創建新的分支,直接在主干上進行修改并提交即可,避免了冗余的分支管理成本。
git push
不再直接推送分支內容,而是創建/更新代碼評審。如果代碼需要修補,提交后繼續執行
git push
,已發起的評審會自動更新。向倉庫貢獻代碼不再需要授予開發者權限,擁有倉庫的瀏覽者權限即可貢獻代碼,而且貢獻的代碼需要經過評審才能正式合入代碼庫。因此可以將直接寫庫的權限最小化到少數管理者手中,而大部分開發者僅需要讀權限即可,降低了代碼庫被意外修改的風險。
支持指定
push option
來控制具體的推送行為,見 使用推送評審模式進行協作 一節。
開啟方式
在
中,可以看到推送評審模式的開關,單擊此開關即可開啟/關閉推送評審模式的功能:開啟推送評審模式后,會改變git push
的行為,請先知悉并理解后再開啟推送評審模式:
開啟推送評審模式后,執行
git push
不再直接更新遠端的代碼(即便擁有倉庫的開發者權限),而是自動創建/更新代碼評審。倉庫的瀏覽者,可以通過
git push
發起評審,但請放心此時代碼還未合入分支,需要根據分支評審和合并要求通過后才可手動合入。由于
git push
并不直接更新代碼而是創建評審,因此不會觸發推送事件的webhook。用戶可以在Codeup網頁端以評審的方式新建,編輯或刪除文件。
使用推送評審模式進行協作
下面,用幾個實際的例子,說明如何使用推送評審模式進行開發協作。
自動創建評審
假設現在接到了一個開發任務,需要開發一個新的特性,使用傳統的分支模式,需要檢出一個分支,并在分支上進行開發,推送分支后再發起特性分支至主干的評審。在使用推送評審模式后,這個過程被簡化為只需要兩步:
在主干上進行開發。
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
枚舉對象中: 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
。此代碼評審的源為本地最新的提交,目標則是當前的分支。可以通過代碼評審的詳情來確認:
通過這種方式,不再需要創建特性分支,也不必切換至瀏覽器創建評審,極大簡化了創建代碼評審的步驟。同時,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-id
為31644
,所以需要執行的命令是: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: +---------------------------------------------------------------------+