git rebase interactive 已推送提交
git rebase interactive already pushed commits
最近,我在更改提交消息的同时对仅限本地的存储库进行变基取得了很多成功,之后仅更改了提交消息,但历史本身没有。
现在我有了自己的存储库 - 远程和本地。我在几个分支上做了几次提交并且已经推送了它们。由于某些原因,我需要在多个分支上更改一些提交消息,并尝试像以前一样使用 rebase interactive。但是提交出现在当前签出分支的末尾。
(我知道怎么做,而且我已经将我的存储库重置为变基前的状态。)
经过一些阅读,我意识到问题是提交已经被推送,这在我的本地存储库中不是事实。
我试图重新设置远程存储库的基线,但它是一个空的 - 所以它没有用。
我知道不推荐。但出于学习目的,我真的很想知道如何更改多个提交消息而不导致在我的分支/存储库末尾重复提交。
(我不喜欢这个解决方案:将我的本地存储库复制并更改为裸存储库作为我的新远程存储库,这将解决我的问题。)
我希望我说得够清楚了。谢谢
更改提交消息会导致更改提交的哈希值,这意味着所有后续提交也必须更改其哈希值(因为 parent 包含在哈希计算中,因为消息本身也是如此) .
这就是为什么变基通常只允许在本地分支机构中进行。许多或说大多数 git 远程存储库允许重写推送的历史记录,因为任何人都可能已经下载了它,然后可以在过时的 history/branch/commit.
上工作
Strategy for preventing or catching git history rewrite
但是,如果您的服务器确实允许重写历史记录(例如,如果您是唯一一个使用它的人),您可以使用 --force
.
推送它们
作为旁注,请参见此处
使用多个分支编辑变基:
C1 <- C2 <- C3 (branch1)
C1 的变基 children 导致
C1 <- CR2 <- CR2 (branch1)
但是如果你有:
/ C4 <- C5 (branch2)
C1 <- C2 <- C3 (branch1)
变基很可能会导致:
/ C2 <- C4 <- C5 (branch2)
C1 <- CR2 <- CR3 (branch1)
原因是C2
仍然是C4
的parent,"fixed"提交CR2
只与重写的Branch有关branch1
。
如果你想 "forget" C2
你必须在 CR2
之上重新设置 C4
(你必须尝试 rebase --onto
)。在那之后 C2
不会被寻址为任何人的 parent 或在任何分支上并且不会显示在历史记录中(尽管它仍然存在直到垃圾收集)。
最近,我在更改提交消息的同时对仅限本地的存储库进行变基取得了很多成功,之后仅更改了提交消息,但历史本身没有。
现在我有了自己的存储库 - 远程和本地。我在几个分支上做了几次提交并且已经推送了它们。由于某些原因,我需要在多个分支上更改一些提交消息,并尝试像以前一样使用 rebase interactive。但是提交出现在当前签出分支的末尾。
(我知道怎么做,而且我已经将我的存储库重置为变基前的状态。)
经过一些阅读,我意识到问题是提交已经被推送,这在我的本地存储库中不是事实。
我试图重新设置远程存储库的基线,但它是一个空的 - 所以它没有用。
我知道不推荐。但出于学习目的,我真的很想知道如何更改多个提交消息而不导致在我的分支/存储库末尾重复提交。
(我不喜欢这个解决方案:将我的本地存储库复制并更改为裸存储库作为我的新远程存储库,这将解决我的问题。)
我希望我说得够清楚了。谢谢
更改提交消息会导致更改提交的哈希值,这意味着所有后续提交也必须更改其哈希值(因为 parent 包含在哈希计算中,因为消息本身也是如此) .
这就是为什么变基通常只允许在本地分支机构中进行。许多或说大多数 git 远程存储库允许重写推送的历史记录,因为任何人都可能已经下载了它,然后可以在过时的 history/branch/commit.
上工作Strategy for preventing or catching git history rewrite
但是,如果您的服务器确实允许重写历史记录(例如,如果您是唯一一个使用它的人),您可以使用 --force
.
作为旁注,请参见此处
使用多个分支编辑变基:
C1 <- C2 <- C3 (branch1)
C1 的变基 children 导致
C1 <- CR2 <- CR2 (branch1)
但是如果你有:
/ C4 <- C5 (branch2)
C1 <- C2 <- C3 (branch1)
变基很可能会导致:
/ C2 <- C4 <- C5 (branch2)
C1 <- CR2 <- CR3 (branch1)
原因是C2
仍然是C4
的parent,"fixed"提交CR2
只与重写的Branch有关branch1
。
如果你想 "forget" C2
你必须在 CR2
之上重新设置 C4
(你必须尝试 rebase --onto
)。在那之后 C2
不会被寻址为任何人的 parent 或在任何分支上并且不会显示在历史记录中(尽管它仍然存在直到垃圾收集)。