name: git-rebase-sync description: 通过git rebase将功能分支同步到最新的origin基础分支,包含安全防护、冲突解决和安全的强制推送。 metadata: short-description: 变基分支同步
git-rebase-sync
当你需要通过git rebase将功能分支同步到最新的origin/{base_branch}时使用此技能,包括在意图不明确时通过明确澄清问题进行冲突解决。
目标
- 将当前分支变基到指定的基础分支(通常是仓库的默认分支,如
dev或main)。 - 谨慎解决冲突,不进行猜测。
- 保持安全防护:备份引用、在执行历史重写命令前确认、安全推送。
硬性规则
- 不要创建或切换到其他功能分支。除非我明确要求,否则在当前分支上操作。
- 在执行任何历史重写命令(
git rebase ...、git push --force*)之前,打印你将运行的确切命令并等待我的确认。 - 在开始变基之前创建本地备份引用(首选带注释的标签)。除非我明确要求,否则不要推送备份引用。
- 优先使用
git push --force-with-lease,绝不使用普通的--force。 - 如果正确的冲突解决方案不明确,请停止并提出有针对性的问题。不要臆测产品行为。
工作流程
1) 识别基础分支和当前分支
- 确定当前分支:
git branch --show-current
- 确定你将变基到的基础分支:
- 如果未提供,使用GitHub默认分支:
gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'
- 如果未提供,使用GitHub默认分支:
- 获取最新内容:
git fetch origin
2) 飞行前安全检查
- 确保工作树干净且没有进行中的操作:
git status
- 如果
git status显示有进行中的合并/变基/拣选操作,请停止并询问如何处理(中止或继续)。
3) 创建本地备份引用(不推送)
- 在当前
HEAD处创建带注释的标签:git tag -a {branch_name}-rebase-backup-$(date +%Y%m%d-%H%M%S) -m "pre-rebase backup" HEAD
- 将标签名称记录为
{backup_ref}以便恢复。
4) 选择变基模式(普通模式与保留合并)
- 检查分支是否包含合并提交:
git rev-list --count --merges origin/{base_branch}..HEAD
- 如果存在合并提交,询问是保留它们(
--rebase-merges)还是扁平化它们(普通变基)。
5) 运行变基(需要确认)
- 打印你打算运行的确切命令,然后等待确认:
- 典型命令:
git rebase origin/{base_branch}
- 保留合并:
git rebase --rebase-merges origin/{base_branch}
- 典型命令:
6) 冲突处理循环
当发生冲突时:
- 收集上下文:
git status- 识别冲突文件(从状态输出中)。
- 对于每个冲突文件:
- 打开文件并理解周围的代码和意图。
- 优先采用最小化、机械化的冲突解决方案:
- 除非功能分支有意覆盖,否则保留上游更改。
- 在适当时重新运行生成器(锁文件、代码生成)而不是手动编辑。
- 如果意图不明确,提出一个有针对性的问题,例如:
- “我们应该保留新的上游行为X,还是保留功能行为Y?”
- “这个文件是生成的并且可以安全地重新生成,还是你想要手动解决?”
- 应用解决方案,然后仅暂存已解决的文件:
git add <file...>
- 继续:
git rebase --continue
- 如果你到达一个解决风险太大/太不明确的点:
- 停止并询问;可以选择建议中止变基。
冲突期间有用的命令:
- 检查当前冲突块:
git diff - 查看正在重放的提交:
git show - 如果需要回退:
git rebase --abort(这是安全的,应优先于破坏性重置)
7) 变基后验证
- 显示新的提交范围:
git log --oneline --decorate origin/{base_branch}..HEAD
- 如果可用,运行适当的仓库检查(测试、类型检查、代码检查)。
8) 推送更新后的分支(需要确认)
- 如果分支已存在于origin上,变基会重写历史,因此推送需要使用force-with-lease。
- 打印确切命令并等待确认:
git push --force-with-lease origin HEAD:{branch_name}
恢复
- 如果出现问题,使用
{backup_ref}恢复变基前的状态。 - 除非我在你显示确切命令后明确确认,否则不要运行破坏性命令(例如
git reset --hard)。