想象一下,一个项目有一个你100%满意的现有git树的场景。现在你发现一些古老的源代码在迁移到git之前,并希望将它作为git历史的一部分。
有很多方法可以实现这一点,但据我所知,它总是以一个新的git树结束,即所有现有提交都有不同的ID。
在这个特定的情况下,它似乎没有必要,我不会改变任何东西,除了第一个提交的父级。有没有办法做到这一点?
答案 0 :(得分:8)
不,这根本不可能。提交的id是其组合内容的哈希值。这不仅包括整个树和文件内容,还包括提交消息,作者信息,和对其父级的引用。
因此,通过更改提交的父级,您将更改其内容,从而使其先前的ID无效。 Git将不得不重新计算其哈希值,以便将提交集成到历史记录中。否则它将拒绝该提交被破坏并使您的存储库处于损坏状态。
事实上任何提交id都与其内容的哈希匹配,并且对于任何直接或间接父项都是如此,这是Git完整性的核心部分。你无法避免这种情况。
所以不,你不能在不影响提交哈希的情况下做你想做的事。您可能做的只是添加另一个与您当前分支无关的完全不相关的分支。这样你就不会影响你现有的提交,但是你也可以将旧的历史记录集成到存储库中,这样它就会存储在内部 - 而不是集成在一起,但至少它就在那里。
答案 1 :(得分:0)
是,如果要保存现有的提交散列,请执行以下操作:在重新建立当前分支的基础之前,只需创建一个new_branch。这样,当您结帐到new_branch时,将看到所有历史记录。
答案 2 :(得分:-1)
我同意这几乎是不可能的,但这在技术上是可行的。
你应该在旧的之后创建一个提交,这样在rebase之后,你的新提交最终会得到相同的哈希
当然这很难做到并且不能保证存在另一个哈希,不同于满足这个条件的当前父级