使用rebase避免公共分支出現不必要的提交記錄

回首郑板桥發表於2024-07-19

當前每個版本使用一個分支(比如2.0.2SP3H01),團隊成員在這個分支上提交程式碼。
當成員jack拉取程式碼之後,成員James提交程式碼,成員jack再提交程式碼,則會產生一條合併提交的記錄,分支提交記錄變得不整潔。

Merge remote-tracking branch 'origin/2.0.2SP3H01' into 2.0.2SP3H01

為了不產生新的提交記錄,可以讓每個成員在自己的個人分支(比如2.0.2SP3H01_dev_jack)上開發,在2.0.2SP3H01_dev_jack上提交程式碼後,rebase到公共分支2.0.2SP3H01,然後merge到2.0.2SP3H01。

rebase合併提交示意圖

上面操作涉及到好幾步操作,可以簡化成為一個指令碼:

#!/bin/bash
# 合併本地分支的提交到公共分支,避免產生新的merge記錄
exec_dir=$(pwd)
my_branch_suffix=_dev_heyc # 個人開發分支的固定字尾

# 至少有一個引數
if [ $# -lt 1 ]; then
    echo "Usage: $0 <main_branch>"
    exit 1
fi

# 判斷當前處於git倉庫
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
    echo "錯誤,當前不是git倉庫"
    exit 1
fi

# 當前分支作為個人開發分支
my_branch=$(git branch --show-current)
main_branch=$1

# my_branch是main_branch加字尾,校驗避免不適當的提交
if [ "${my_branch}" != "${main_branch}${my_branch_suffix}" ]; then
    echo "錯誤,當前分支不是遠端分支的個人開發分支"
    exit 1
fi

# 判斷main_branch是否是遠端分支
if git ls-remote --heads origin ${main_branch} | grep -q ${main_branch}; then
    echo -n
else
    echo "錯誤,${main_branch}不是一個合法的遠端分支"
    exit 1
fi

# 判斷my_branch是否是遠端分支
if git ls-remote --heads origin ${my_branch} | grep -q ${my_branch}; then
    echo "錯誤,${my_branch}是一個遠端分支"
    exit 1
fi

# 判斷本地分支是否乾淨
if [ -n "$(git status --porcelain)" ]; then
    echo "錯誤,本地分支${my_branch}不是乾淨的"
    exit 1
fi

# 互動式確認,預設
read -p "確認是否要將本地分支 [${my_branch}] 合併到遠端分支 [${main_branch}] ? [Y/n]" answer
if [ -z "$answer" ] || [[ $answer == [Yy] ]]; then
    echo
else
    echo "使用者中斷..."
    # 處理使用者選擇退出的情況
fi

# 嚴格模式
set -euo pipefail

echo ">>> 1. 切換到分支${main_branch},並拉取最新程式碼"
git checkout ${main_branch}
git pull
echo

echo ">>> 2. 切換到分支${my_branch},並rebase到${main_branch}"
git checkout ${my_branch}
git rebase ${main_branch}
echo

echo ">>> 3. 切換到分支${main_branch},併合並${my_branch}"
git checkout ${main_branch}
# 步驟1後遠端分支可能又提交了程式碼。在合併之前,先檢查本地分支是否最新
git fetch
if [ -n "$( git diff --stat --cached origin/${main_branch})" ]; then
    echo "錯誤,遠端分支已更新,請重新pull"
    exit 1
fi
git merge ${my_branch}
git push
echo

echo ">>> 4. 回到分支${my_branch}"
git checkout ${my_branch}

linux下可以直接使用,將指令碼目錄新增到環境變數。windows下推薦使用git的官方客戶端git bash
執行示例

參考:
Rebase - 廖雪峰的官方網站

相關文章