35 条回复  ·  3808 次点击
misdake 初学 2025-6-22 20:56:04
git replay 还不支持 merge commit ,所以还要自己写代码实现相似的功能。 从 head 往上抓所有 commit 的 parent ,尤其是 merge commit 的 2 个 parent (记好谁是 first 谁是 second ),形成一张有向图,并指定一个起点 checkout --orphan ,commit 作为起点。同时导出所有 merge commit 的 diff 文件和 message 备用。 从起点开始不停 cherry-pick ,在分叉点跟踪新的 commit hash 。 碰到 merge 的时候,先把其他 parent 都新建分支 cherry-pick 到底,回到 first parent ,然后: git merge --no-commit -s ours ${second parent 分支名} git apply ${这个 merge 的 diff 文件} git commit -F ${message 文件} 这样能完成 merge ,然后重复继续 cherry-pick ,一直走到 head 。 这样所有非 merge 的 commit 能保留原始的日期,但 merge commit 都是当前时间,也没有 3-way resolve 的信息了。
llxvs 小成 2025-6-22 21:00:51
在这里问还不如问 AI
lawler 小成 2025-6-22 21:03:49
有成功方案了记得回复一下最后成功方案。 这样,屌更大的兄弟,可以在加后门跑路的时候,多一种隐匿手段。(坏笑
coldfannn 初学 2025-6-22 21:06:12
原分支计为 origin ,切出来一个新分支 首先看你知不知道 hash ,不知道第 200 条 commit 的 hash ,先 git rev-list --reverse HEAD | sed -n '200p' | xargs git show 把 hash 拿到,reset 到这条(硬 reset 就可以了,提前备份),checkout --orphan 到一个新分支计为 new 最后切回 origin 分支,git rebase HEAD~*** --onto new 就可以了,***是你第 201 条 commit 的 hash 注意你的前 200 条提交如果和 201 条提交之后的提交有存在交集 merge 线,解决冲突可能是必然的,所以你这个第 200 条提交的选择很关键,尽量选那种 merge 树前后的节点
bowencool 初学 2025-6-22 21:24:45
git reset --soft 然后重新 commit 啊,最后 push -f
oaix 小成 2025-6-22 21:34:28
看下这样行不行, 开启 git rerere 功能: https://git-scm.com/book/zh/f/Git-%E5%B7%A5%E5%85%B7-Rerere ,使用 https://github.com/git/git/blob/master/contrib/rerere-train.sh 生成冲突解决缓存,再用你提到方法,比如 reset + cherry pick ,大多数冲突应该会自动解决掉
1234
返回顶部