git rebase interactive已经推送提交

最近,我在改变提交消息的同时重新绑定了一个仅限本地的存储库,并且在此之后,只有提交消息已被更改,但历史本身没有更改。

现在我有我的存储库 - 远程和本地。 我在几个分支上做了几次提交,并且已经推送了它们。 由于某些原因,我需要在几个分支上更改一些提交masseages,并尝试像以前一样使用rebase interactive。 但是这个提交出现在当前结账分支的最后。

(我知道如何以及如何将我的存储库重新设置到重新绑定之前的状态。)

经过一番阅读后,我意识到问题是已经推出了提交,这在我的本地存储库中并不是这个事实。

我试图重新绑定远程存储库,但它是一个裸露的 - 所以它不起作用。

我知道它不被推荐。 但为了学习的目的,我真的很想知道如何更改几个提交消息,而不会导致分支/存储库末尾的重复提交。

(我不喜欢解决方案的工作,复制并将我的本地存储库更改为裸新版本作为我的新远程存储库,这可以解决我的问题。)

我希望我已经说清楚了。 谢谢。


更改提交消息会导致更改提交的散列值,这意味着所有后续提交都必须更改它们的散列值(因为父项包含在散列计算中,因为邮件本身也是如此)。

这就是为什么通常只有在当地分支机构才允许重新配售。 很多人或说大多数git远程仓库允许重写推送的历史记录,因为任何人都可以下载它,然后工作在过时的历史记录/分支/提交。

防止或捕获git历史重写的策略

但是,如果你的服务器确实允许重写历史记录(例如,如果你是唯一处理它的),你可以使用--force

作为旁注,请参阅https://stackoverflow.com/a/5668050/1756183

与几个分支编辑rebase:

C1 <- C2 <- C3 (branch1)

重新招募C1的孩子的成绩

C1 <- CR2 <- CR2 (branch1)

但是如果你有:

          / C4 <- C5 (branch2)
C1 <- C2 <- C3 (branch1)

重新贴牌最有可能导致:

    / C2 <- C4 <- C5 (branch2)
C1 <- CR2 <- CR3 (branch1)

原因是C2仍然是C4的父亲,“固定”提交CR2只与重写的分支branch1 。 如果你想“忘记” C2你必须在CR2之上重新命名C4 (你必须玩转rebase --onto )。 在此之后, C2不会作为任何人的父母或任何分支而被提出,并且不会在历史中显示(尽管在收集垃圾之前它仍然存在)。

链接地址: http://www.djcxy.com/p/49043.html

上一篇: git rebase interactive already pushed commits

下一篇: Detailed reason why remote git rebase is so evil