首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0070. Git - 找出來源分支與合併目標分支尚未 Cherry Pick 的 Commit

日期:2024年 07月 27日

標籤: C# Asp.net Core Web MVC Web Git GitHub

摘要:C# 學習筆記


使用軟體:TortoiseGit
範例檔案:範例Git
執行工具:.bat檔案
解決問題:找出 Git 分支尚未 Cherry Pick 的簽入
     ※備註:本篇分享自己常用的手法
基本介紹:本篇分為三大部分。
第一部分:問題描述 - 手動檢查
第二部分:解法1 - TortoesGit 工具 Compare
第三部分:解法2 - Windows 腳本執行 (.bat)






第一部分:問題描述 - 手動檢查

Step 1:問題描述

延續上篇,最後將代碼簽入到 develop 分支
但是尚未合併到 release 分支,目標是找出 develop 分支中尚未簽入的代碼
如圖:是當前分支狀態


Step 2:手動檢查

最基本的方法是手動開啟 2 個分支
左邊:develop 分支 / 右邊:release 分支,共 3 個簽入未合併
這方法在資料量少時還沒問題,但是資料量多時就不好比對了
※可以想像有10幾個開發者,每個開發完就 Cherry Pick 自己的代碼到 release




第二部分:解法1 - TortoesGit 工具 Compare


Step 1:CheckOut 合併目標 - release - 1

我們目標將 develop 合併 到 release,因此先將目標 Switch CheckOUt


Step 2:CheckOut 合併目標 - release - 2

選擇 OK 切換完成


Step 3:打開 Show Log

接著將 Git Show Log


Step 4:打開來源目錄

選擇左上角的 release (當前),點擊


Step 5:目標與來源比較

remote -> 選擇 origine/develop -> 滑鼠右鍵 -> compare with working tree


Step 6:找出未合併到 release 的簽入 - 1

這時下方列出所有 develop 尚未合併到 release 的有差異的檔案
我們目的是找出 develop 的未簽入版號,因此再選擇右上角切換


Step 7:找出未合併到 release 的簽入 - 2

切換後,下方的檔案 -> 滑鼠右鍵 -> Blame Revisions


Step 8:獲取未簽入的 Git 版號

展開後,可以輕鬆比對尚未簽入到 release 的 develop 簽入版號


第三部分:解法2 - Windows 腳本執行 (.bat)

Step 1:CheckOut 來源、目標分支

如果使用腳本比對的方式,需將來源、目標同時 CheckOut 下來
develop 分支:

release 分支:


Step 2:貼上 .bat執行檔案

這邊有寫好的 .bat 檔案
貼在 git 目錄上 (有.git 的隱藏資料夾)


Step 3:.bat執行檔案說明

以下是代碼簡要說明:

@echo off
setlocal

REM 1. 輸入來源分支
set /p source_branch="Enter source branch name: "

REM 2. 輸入目標分支
set /p target_branch="Enter target branch name: "

REM 3. 找出"來源分支"不在"目標分支"的簽入
for /f "tokens=*" %%i in ('git cherry %target_branch% %source_branch% ^| findstr /B "+"') do (
    set "commit=%%i"
	REM 4-1. 呼叫比對函式
    call :process_commit 
)

REM 5. 找完後等待跳出
endlocal
pause 
exit /b

REM 4-2. 執行比對
:process_commit
REM 4-3. 提取出簽入的 Git Hash
for /f "tokens=2" %%a in ("%commit%") do (
    set "commit_hash=%%a"
)

REM 4-4. 找出的來源 Git Hash 比對是否在 目標的Log中出現
git log %target_branch% | findstr /C:"%commit_hash%" >nul
if %errorlevel%==0 (
    echo Commit %commit_hash% has been cherry-picked.
) else (
    echo Commit %commit_hash% has not been cherry-picked.
)
exit /b



Step 4:執行檔案

執行後依序填入分支名稱

source branch 輸入來源分支名稱,這邊是 develop
target branch 輸入目標分支名稱,這邊是 release




Step 5:執行結果

可以快速得知 develop 分支有 4個 GitHash 尚未合併到 release 分支




Step 6:執行結果 - 補充說明

多出來未合併的是以下這項,原因是 GitFlow 分支策略,會將已開發完成的分支刪除
這個 GitHash 的內容本質上每次都可以忽略

6004b8f988f8a7423e4bad5e198d9ab73f2b6984 


透過腳本方法,可以快速比對出尚未 Cherry Pick 的簽入