使用rebase避免公共分支出现不必要的提交记录
当前每个版本使用一个分支(比如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