git rebase 交互式已推送提交

问题描述 投票:0回答:1

最近,我在更改提交消息时成功地对仅本地存储库进行了变基,之后仅更改了提交消息,但历史记录本身并未更改。

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

(我知道如何做,并且我已将我的存储库重置为变基之前的状态。)

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

我尝试对远程存储库进行变基,但它只是一个裸露的存储库 - 所以它不起作用。

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

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

我希望我说得够清楚了。谢谢。

git-rebase
1个回答
3
投票

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

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

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

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

--force
(或更好的
--force-with-lease
)推送它们。

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

使用多个分支编辑变基:

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
,你必须在
C4
之上重新设置
CR2
的基础(你必须使用
rebase --onto
)。之后
C2
不会被定位为任何人的父级或任何分支,并且不会显示在历史记录中(尽管它仍然存在,直到垃圾收集)。

© www.soinside.com 2019 - 2024. All rights reserved.