我有一个Git存储库“B”,其分支为clean
,它是另一个Git存储库“A”的分支,其分支为main
。
我的B存储库提交历史记录包括一个来自上游存储库A的合并提交,我想删除它。
下面是我的提交历史:
ce8f54a (HEAD -> clean, origin/clean): New update 4
ef31ae4: New update 3
a8171b9: Merge remote-tracking branch 'upstream/main' into clean
b65a7cd (upstream/main): solution of c++ exercise (from fork)
33d8267: new c++ exercise (from fork)
ac8106a: New update 2
d86297f: New update 1
83c73b2: solution of java exercise (from fork)
7629f4b: new java exercise (from fork)
字符串
最初,我使用git rebase
删除了在提交83c73b2
之后的中间提交“将远程跟踪分支'upstream/main'合并到clean '中”,并且它工作得很好。但是现在,如果我再次运行相同的命令,它会删除所有推送的提交,并将存储库“B”与上游“A”对齐。
运行交互式git rebase -i HEAD~6
来删除合并不起作用,因为它的提交不会显示。简单地重置为合并前的提交(b65a7cd
)将具有与git rebase
相同的行为。它还删除了我所有的推送提交,因为上游的SHA是相同的。也就是说,它重置了我的“B”历史记录以匹配“A”。
如何从Git历史中删除合并提交而不丢失推送提交?
我需要多次这样做,这样最后我就可以推送一个干净的合并请求,其中只有“更新”提交,而不是“合并等”提交。
2条答案
按热度按时间v2g6jxz61#
git revert a8171b9
会让你撤销合并中的修改,但保留后续的提交。如果有冲突,你需要在完成还原之前将它们整理出来。git会在还原过程中显示哪些文件有冲突。vom3gejh2#
我发现很难理解你的问题,但是最坏的情况下,你总是可以创建一个新的分支的历史提交。
字符串
然后选择你想要的任何提交到那个分支上,如果你觉得更容易的话,你可以向同一个cherry-pick命令添加多个提交:
型
TL;DR -在一个新的分支上,你可以构建任何你想要的提交序列,然后将这个新的分支推送到远程。