git rebase在HEAD之上,删除之前的所有内容

hfyxw5xn  于 2023-05-12  发布在  Git
关注(0)|答案(1)|浏览(115)

给定以下提交图:

A--B--C (origin/foo)

D--E (foo)

我想做到这一点:

A--B--C--F (foo origin/foo)

F是一个rebase提交,它本质上包含了我的本地历史D--E的更改,并撤消/清空了它之前的所有其他内容。最终用我的本地状态(foo@{E})替换整个远程HEAD状态,只是改变历史记录以重新基于远程提交。我的环境不允许简单的git push --force,我必须保留远程提交。
我尝试了git rebase -X theirs origin/foo(使用反向策略选项),但它保留了来自远程的所有非冲突更改,我希望在相同的diff中删除这些更改。git rebase -s theirs origin/foo未按预期工作(git: 'merge-theirs' is not a git command. See 'git --help'.)。
我可以在做了rebase之后每隔一次提交git revert,然后在提交之前将它们压缩成一个,但我正在寻找一个更优雅的解决方案,如果可能的话。

2vuwiymt

2vuwiymt1#

对于更改应用部分,如果D-E是 * 两个 * 提交,则可以尝试git cherry-pick E。如果它们代表了大量的提交,首先在它们之间创建补丁,

git diff --binary D E > patch.diff

然后贴上贴片

git apply -3 patch.diff

这两种方式都可能存在冲突。
最终将整个远程HEAD状态替换为本地状态(foo@{E})
你的意思是你希望F的文件和E的完全一样吗?如果是,则应用D和E之间的更改不起作用。相反,您需要创建一个提交,它的树与E的树相同,其父节点是C。

# Replace C and E with their sha1 values
git commit-tree -p C -m "some message" E^{tree}

它创建一个提交并打印其sha1值。然后更新foo以指向新提交。

git update-ref refs/heads/foo $newcommit

如果foo当前已检出,则还可以运行git reset $newcommit --hard

相关问题