2015-10-05 181 views
1

最近,我在改变提交消息的同时重新绑定了仅限本地的存储库,并且之后只有提交消息已被更改,但历史本身没有更改。git rebase interactive已经推送提交

现在我有我的仓库 - 远程和本地。我在几个分支上做了几次提交,并且已经推送了它们。由于某些原因,我需要在几个分支上更改一些提交masseages,并尝试像以前一样使用rebase interactive。但是这个提交出现在当前结账分支的最后。

(我知道如何和我有基础重建之前我的资料库恢复到状态。)

经过一番阅读中,我意识到这个问题是提交已已被推这是不是在我局地的事实只有存储库。

我试图重新绑定远程存储库,但它是一个裸露的 - 所以它没有工作。

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

(我不喜欢这个解决方案上下工夫,以复制和我的本地库更改为裸一个作为我的新的远程仓库,这将解决我的问题。)

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

回答

1

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

这就是为什么通常只有在当地分支机构才允许重新装订。很多人或说大多数git远程仓库允许重写推送的历史记录,因为任何人都可以下载它,然后工作在过时的历史记录/分支/提交。

Strategy for preventing or catching git history rewrite

但是,如果你的服务器的确让历史重写(例如,如果你是唯一一个在它的工作),你可以用--force推动他们。

作为一个侧面说明在这里看到https://stackoverflow.com/a/5668050/1756183

编辑有多个分支机构变基:C1结果

C1 <- C2 <- C3 (branch1) 

垫底儿童

C1 <- CR2 <- CR2 (branch1) 

但是,如果您有:

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

垫底将最有可能导致:

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

的原因是,C2仍然是C4父,“固定”的承诺CR2只与改写的分行branch1。 如果你想“忘记”C2你必须在CR2之上重新编号C4(你必须玩rebase --onto)。之后,C2没有作为任何人的父母或任何分支,并且不会在历史记录中显示(尽管在收集垃圾之前它仍然存在)。

+0

我检查了一下,我没有在我的服务器上设置这样的git-config。另一方面,我已经使用过:'git rebase - interactive SHA',标记为'reword','git push --force'。但问题依然存在。我已经使用http://stackoverflow.com/a/5668050/1756183的answere,但同样的问题。在你的第一个链接中,我找到了'receive.denyDeletes',这让我想到删除远程分支,重新绑定我的本地历史记录,然后推送它。没有办法......问题依然存在。 – codekandis

+0

问题可能是当我的第一个项目没有时,我目前的项目有多个分支。 – codekandis

+0

在帖子中增加了一些信息 - 应该解释你看到的效果。 – dag