最近,我在更改提交消息时成功地对仅本地存储库进行了变基,之后仅更改了提交消息,但历史记录本身并未更改。
现在我有了我的存储库 - 远程和本地。我在几个分支上进行了多次提交并已经推送了它们。由于某些原因,我需要更改多个分支上的一些提交消息,并尝试像以前一样使用 rebase 交互。但提交出现在当前签出分支的末尾。
(我知道如何做,并且我已将我的存储库重置为变基之前的状态。)
经过一番阅读后,我意识到问题是提交已经被推送,这在我的本地存储库中并不是事实。
我尝试对远程存储库进行变基,但它只是一个裸露的存储库 - 所以它不起作用。
我知道不推荐。但出于学习目的,我真的很想知道如何更改多个提交消息,而不导致在我的分支/存储库末尾产生重复提交。
(我不喜欢这个解决方案:复制并将我的本地存储库更改为裸存储库作为我的新远程存储库,这将解决我的问题。)
我希望我说得够清楚了。谢谢。
更改提交消息会导致更改提交的哈希值,这意味着所有后续提交也必须更改其哈希值(因为父级包含在哈希计算中,消息本身也包含在哈希计算中)。
这就是为什么通常只允许在本地分支机构进行变基。许多人或说大多数 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
不会被定位为任何人的父级或任何分支,并且不会显示在历史记录中(尽管它仍然存在,直到垃圾收集)。