Git rebase时如何阻止已丢弃提交恢复,仅通过分支名实现快进?
解决方案
你的核心问题是普通git rebase Branch2会把Branch1中未在Branch2出现的提交(包括被丢弃的C)重新应用,导致C回到历史中。由于只能获取分支名称,需要通过自动化脚本识别关键提交来实现需求:
实现步骤
定位Branch1中最后一个与Branch2内容一致的提交
这个提交(示例中的F)的变更已经存在于Branch2中,我们需要从它之后的提交(G、H)开始搬移。可以通过对比提交的patch-id来自动查找:last_matching_commit="" # 从旧到新遍历Branch1的所有提交 for commit in $(git rev-list --reverse Branch1); do # 生成当前提交的patch-id commit_patch_id=$(git show "$commit" | git patch-id | awk '{print $1}') # 检查Branch2中是否存在相同patch-id的提交 if git log --format="%H" Branch2 | xargs -I {} git show {} | git patch-id | awk '{print $1}' | grep -q "$commit_patch_id"; then last_matching_commit="$commit" fi done执行定向变基
找到目标提交后,将Branch1中该提交之后的部分搬移到Branch2上:git checkout Branch1 git rebase --onto Branch2 "$last_matching_commit"
执行完成后,Branch1的历史会变为:A → B → D → E → F → G → H,彻底移除了提交C,符合你仅保留可快进部分的需求。
内容的提问来源于stack exchange,提问作者Jay Joshi
相关产品推荐
相关产品推荐

