(十三)在自己的功能分支上重放修改
1. 把功能接到更新后的主线上
另一种场景是功能分支尚未分享,同伴已经更新 main。先在自己的分支中分两次保存导出设计:
# 从当前主线建立尚未分享的功能分支。
git switch main
git pull --ff-only
git switch -c feat/export
# 新建 export-plan.md,写入导出目标后保存,形成第一次提交 C。
git add -- export-plan.md
git commit -m "增加导出目标说明"
# 新建 format-plan.md,写入格式约定后保存,形成第二次提交 D。
git add -- format-plan.md
git commit -m "增加导出格式说明"
这两次提交从 B 出发;同伴在另一份克隆中更新主线并推送,远程主线到了 E。想让功能在 E 的基础上继续,可以重放自己的两次修改:
# 取回主线,再切到自己的功能分支进行重放。
git fetch origin
git switch feat/export
git rebase origin/main
python check_reading.py
git log --oneline --graph --decorate -10
Git 先找共同提交 B,依次取出 C、D 的改动,接到 E 后面,形成 C′、D′。新提交的父关系不同,因此提交哈希也改变;feat/export 改为指向 D′。这不是把原来的 C、D 整个平移而保留标识。rebase
2. 逐次解决重放中的冲突
冲突可能发生在正在重放的某一次提交。检查这次改动和新基线,编辑最终内容后继续:
# 解决当前重放提交的冲突后暂存,再由 rebase 继续处理后续提交。
git add -- README.md
git rebase --continue
# 决定取消本次重放时,使用相应的取消命令。
git rebase --abort
上面 continue 和 abort 是两种选择,不是按顺序都执行。重放时的“当前”是新基线与此前已重放内容,“传入”是当前功能提交;要比较实际文字。功能还没有推送过时,完成后普通 git push -u origin feat/export 即可建立远程分支。
已经分享的旧功能提交若被别人继续使用,再重放并推送就涉及共同历史的协调。需要改写远程分支时,先确认双方工作位置,再研究 --force-with-lease 对预期远程位置的检查;本章的协作主线用合并保留双方已分享的提交。