當前每個版本使用一個分支(比如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。
上面操作涉及到好幾步操作,可以簡化成為一個指令碼:
#!/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 - 廖雪峰的官方網站