使用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。

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 - 廖雪峰的官方网站

posted @ 2024-07-19 11:29  回首郑板桥  阅读(3)  评论(0编辑  收藏  举报