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
不会作为任何人的父母或任何分支而被提出,并且不会在历史中显示(尽管在收集垃圾之前它仍然存在)。