如果我理解正确的话,你的主要分支的样子:
master: 1 -> 2 -> 3 -> .. -> 20000 -> A (First non migrated commit) -> B -> C -> ..
你想获得到:
master: 1' (All your migrated commits) -> A' -> B' -> C' -> ..
我想你可以遵循使用git rebase HEAD~26000 (first commit hash probably easier)
并将pick
更改为squash
,但它可能很费力/费时。
一个潜在可行的解决方案是用你的第一个20000的内容创建一个新的提交。可能值得在备份分支上进行测试。
git checkout <last migrated commit hash> -b backup-master
backup-master: 1 -> 2 -> 3 -> .. -> [20000] -> A (First non migrated commit) -> B -> C -> ..
^- you are here.
git reset --soft <first migrated commit hash>
backup-master: [1] -> 2 -> 3 -> .. -> 20000 -> A (First non migrated commit) -> B -> C -> ..
^- you are here ^- the working directory tree/index reflects this commit
修改您最初提交的内容/消息(或创建一个新的提交如果你愿意)。
git commit --amend
现在backup-master
应该包含你压扁的迁移承诺,让我们继续前进的新的提交。
git checkout master
git checkout -b master-rebase
(以防万一,我们摆乌龙)。
git rebase backup-master
- 我相信这会起作用,因为git知道成功重新绑定所需的合并。如果这个工作,你应该完成,master-rebase
将包含你想要的结果。
如果失败,则可能有更好的成功与rebase --onto.
git rebase --onto <destination commit> <parent of first desired commit> <last desired commit>
即 git rebase --onto backup-master <A>~1
master`的
如果这个作品将放置于您提交当前未在任何分支,所以你需要创建一个:
git checkout -b rebase-success
。
rebase - 的更全面解释可以找到here。
谢谢,这是我一直在寻找的方法,即使实际重新平整速度不会更快,并且与交互式底视图解决方案不同,您无法看到其进展。注意:我必须在软重置后创建分支,因为这会导致分离头部状态。 – Qeebrato
啊,这是一个很好的观点,我忽略了'重置'步骤会让你分开一个头。更新了答案,在初始结账步骤中添加了“-b”。 –
Chris