gpt4 book ai didi

git-rebase - git rebase interactive 已经推送了提交

转载 作者:行者123 更新时间:2023-12-05 05:24:53 30 4
gpt4 key购买 nike

最近,我在更改提交消息的同时对仅限本地的存储库进行 rebase 取得了很大的成功,之后只有提交消息被更改,但历史本身没有。

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

(我知道怎么做,而且我已经将我的存储库重置为 rebase 前的状态。)

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

我试图重新设置远程存储库的基线,但它是一个空的 - 所以它没有用。

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

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

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

最佳答案

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

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

Strategy for preventing or catching git history rewrite

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

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

使用多个分支编辑 rebase :

C1 <- C2 <- C3 (branch1)

对 C1 的 child 进行 rebase 导致

C1 <- CR2 <- CR2 (branch1)

但是如果你有:

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

rebase 很可能会导致:

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

原因是C2仍然是C4的父级,“固定”提交CR2只与重写的Branch相关分支 1。如果你想“忘记”C2,你必须在 CR2 之上对 C4 进行 rebase (你必须使用 rebase --onto).此后,C2 不再作为任何人的父级或在任何分支上寻址,也不会显示在历史记录中(尽管在垃圾收集之前它仍然存在)。

关于git-rebase - git rebase interactive 已经推送了提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32951719/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com