我正在bitbucket中创建一个新的存储库,我想从我的历史记录中间提交到顶部,忽略第一个。我怎么能这样做?
答案 0 :(得分:0)
为了解释和简化,您有一个具有悠久历史的存储库(可能包括从此简化图中省略的分支和合并),如下所示:
A--B--C--...--L--M--N--...--X-Y-Z
(其中A
是第一次提交,而Z
是最后一次提交),但是您需要一个看起来像这样的历史记录:
N--...--X-Y-Z
即,历史的前半部分(从根提交A
开始)已被删除。
你不能(完全)这样做。 Git基于提交工作,每个提交都有一个全局唯一ID,该ID取决于提交和的内容,直到该提交为止。换句话说,提交Z
的身份取决于提交A
到M
的存在和身份。如果你应该以某种方式管理删除任何这些,那么每个后续提交的身份(SHA-1)将更改。
您可以执行此操作 - 使用新的不同ID进行新提交,这些ID构成从({1}}的内容开始并经过N
的链。他们只会拥有与原始Z
到N
不同的ID。一旦你这样做,你就不能回去了。
至于如何这样做:有多种不同的方式,但最简单的(如果慢)可能使用Z
。应用提供的过滤器后,git filter-branch
脚本会复制每次提交。因此,例如,如果您想提交提交filter-branch
根提交:
1234567890123456789012345678901234567890
(请注意,这是未经测试的,并且过滤分支通常非常危险,通常应该在您的存储库的副本 [即克隆]上运行,直到您计算出过滤器(s) )你真的想)。一旦filter-branch完成,你就可以决定你是否喜欢这个结果,删除任何不需要的分支,然后重新克隆过滤后的存储库来抛弃那些只被filter-branch' {{{ 1}}名字。
(有很多方法可以让它变得更快,并且可以做到这一点,但听起来你对git来说是非常新的,所以在克隆上做所有这些更安全,你可以简单地删除你不喜欢结果。通过保持原始存储库不受影响,你可以返回,你只需要继续使用原始文件并停止使用修改过的克隆。)