给定以下提交图:
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
,然后在提交之前将它们压缩成一个,但我正在寻找一个更优雅的解决方案,如果可能的话。
1条答案
按热度按时间2vuwiymt1#
对于更改应用部分,如果
D-E
是 * 两个 * 提交,则可以尝试git cherry-pick E
。如果它们代表了大量的提交,首先在它们之间创建补丁,然后贴上贴片
这两种方式都可能存在冲突。
最终将整个远程HEAD状态替换为本地状态(foo@{E})
你的意思是你希望F的文件和E的完全一样吗?如果是,则应用D和E之间的更改不起作用。相反,您需要创建一个提交,它的树与E的树相同,其父节点是C。
它创建一个提交并打印其sha1值。然后更新
foo
以指向新提交。如果
foo
当前已检出,则还可以运行git reset $newcommit --hard
。