git rebase interactive已经推送了提交

时间:2015-10-05 14:59:12

标签: git-rebase

最近,在更改提交消息时,我在重新定位仅限本地的存储库方面获得了很多成功,之后只更改了提交消息,但历史记录本身没有。

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

(我知道如何和我在重新定位之前将我的存储库重置为状态。)

经过一些阅读后,我意识到问题是提交已经被推送,这不是我本地存储库中的事实。

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

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

(我不喜欢使用解决方案来复制和更改我的本地存储库作为我的新远程存储库,这将解决我的问题。)

我希望自己足够清楚。感谢。

1 个答案:

答案 0 :(得分:1)

更改提交消息会导致更改提交的哈希值,这意味着所有后续提交也必须更改其哈希值(因为父项包含在哈希计算中,因为消息本身也是如此)。 / p>

这就是为什么通常只在本地分支机构中允许变基。许多人或者说大多数git远程存储库允许重写推送的历史记录,因为任何人都可以已经下载它,然后可以处理过时的历史记录/分支/提交。

Strategy for preventing or catching git history rewrite

但是,如果您的服务器允许重写历史记录(例如,如果您是唯一正在进行重写的人),您可以使用--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的父级,&#34;已修复&#34;提交CR2仅与重写的分支branch1相关。 如果你想忘记&#34; C2您必须在C4之上重新CR2(您必须使用rebase --onto)。之后,C2不会作为任何人的父母或任何分支进行处理,并且不会显示在历史记录中(尽管在收集垃圾之前它仍然存在)。