git rebase 是一个充满争议的命令, 推崇者赞不绝口, 反对者避而远之;

命令方式

1
2
3
4
5
6
7
8
# 在目标分支上实施 rebase
git rebase <被 rebase 分支>

# 在其他分支上 rebase 目标分支
git rebase <目标分支> <被 rebase 分支>

#
git rebase --onto <目标分支> <排除分支> <被 rebase 分支>
1
2
# 作为选项使用
git pull --rebase origin target_branch

配置方式

1
2
# 分支级别配置
git config branch.<branch_name>.rebase true

具体场景实战

如果线上有人发布完成, 主干分支已更新, 此时另一个待发布的分支想要 rebase master, 步骤如下:

(1) 提前拉取最新 commit, 保证本地 master 和 origin/master 同步,
并保证当前分支是需要 rebase 的目标分支:

1
2
git pull origin master
git checkout target_branch

(2) 执行 rebase:

1
git rebase master

(3) 对每个 commit 处理冲突:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
foreach (commit in target_branch from forked_position) {
# 需分三种情况:

# 情况一: 对于冲突文件, 完全采纳 master 分支的变更
git add <conflicted_files>
git rebase --skip

# 情况二: 对于冲突文件, target_branch 和 master 各有部分被采纳
git add <conflicted_files>
git rebase --continue

# 情况三: 对于冲突文件, 完全采纳 target_branch 分支的变更
git rebase --skip
}

(4) rebase 结束, 分三种情况:

  • rebase 成功, 推送变更:

    1
    2
    # 一定要加 --force, 否则提示与 orgin 分支冲突
    git push --force origin target_branch
  • 中途不想再继续 rebase, 直接取消, 没有副作用, 恢复如初:

    1
    git rebase --abort
  • rebase 终止:

    git rebase --quit
    

参考链接