Git-合并两个不是串行序列的提交-已将提交推送到远程repo

Git-合并两个不是串行序列的提交-已将提交推送到远程repo,git,merge,commit,rebase,Git,Merge,Commit,Rebase,我读过关于合并序列中的两个提交的文章,但是如何合并彼此不直接的两个提交呢 比如,我的当前提交和旧提交 提交在seq中 er34rwe commit4 rtt45y5 commit3 iwe8j89 commit2 4E89E8J commit1 现在,我需要合并commit4和commit2,并可能将结果放在commit2的位置。结果是 rtt45y5 commit3 iwe8j89 commit2_4 <-- new one 4E89E8J commit1 rtt45y5委员会3 i

我读过关于合并序列中的两个提交的文章,但是如何合并彼此不直接的两个提交呢

比如,我的当前提交和旧提交

提交在seq中

er34rwe commit4
rtt45y5 commit3
iwe8j89 commit2
4E89E8J commit1
现在,我需要合并commit4和commit2,并可能将结果放在commit2的位置。结果是

rtt45y5 commit3
iwe8j89 commit2_4 <-- new one
4E89E8J commit1
rtt45y5委员会3

iwe8j89 commit2_4您可以为此使用交互式重基。假设
er34rwe
是最早的提交,请执行以下操作:

git rebase -i er34rwe
这将以如下视图启动编辑器:

pick er34rwe commit4
pick rtt45y5 commit3
pick iwe8j89 commit2
pick 4E89E8J commit1
然后,您可以首先通过简单地移动行来更改这些提交的顺序:

pick rtt45y5 commit3
pick er34rwe commit4
pick iwe8j89 commit2
pick 4E89E8J commit1
然后,您还可以将
拾取
更改为另一种模式(它们在编辑器底部进行了说明)以进行更改。在您的情况下,您希望将
commit2
更改为
squash
,以将其合并到上一个文件中(
commit4
–文件从顶部/最旧到底部/最新提交):


然后保存并退出编辑器以启动该过程。Git随后将重新设置所有提交的基础,并提示您手动合并正在合并的两个提交的提交消息。

我知道这种方法,但我想知道如果这些提交已经推送到远程存储库,是否可以这样做。对不起,问题中没有提到。现在编辑基于已发布的提交是可能的,但绝对不推荐。任何解决方案都将涉及更改已发布的提交,这将破坏存储库的任何其他贡献者或用户。所以,不要这样做,而是接受它……嗯,有没有办法删除远程存储库中的提交?比如,如果你已经完成了sqash并推送了一个commit。它有一个副本,即最初提交的副本,没有新的更改。任何删除现有提交的操作(重定基址本质上是对提交的重写,导致新提交替换旧提交)都同样糟糕。您可以使用强制推送来替换服务器上的任何内容,但这会对其他人产生严重影响,您确实应该避免这样做。查看有关推送和重定基址机制如何工作以及重定基址中断原因的更多信息。
pick rtt45y5 commit3
pick er34rwe commit4
squash iwe8j89 commit2
pick 4E89E8J commit1