Git - 从中​​间推到顶部

时间:2016-03-07 17:28:40

标签: git bitbucket

我正在bitbucket中创建一个新的存储库,我想从我的历史记录中间提交到顶部,忽略第一个。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

为了解释和简化,您有一个具有悠久历史的存储库(可能包括从此简化图中省略的分支和合并),如下所示:

A--B--C--...--L--M--N--...--X-Y-Z

(其中A是第一次提交,而Z是最后一次提交),但是您需要一个看起来像这样的历史记录:

N--...--X-Y-Z

即,历史的前半部分(从根提交A开始)已被删除。

你不能(完全)这样做。 Git基于提交工作,每个提交都有一个全局唯一ID,该ID取决于提交的内容,直到该提交为止。换句话说,提交Z的身份取决于提交AM的存在和身份。如果你应该以某种方式管理删除任何这些,那么每个后续提交的身份(SHA-1)将更改

可以执行此操作 - 使用新的不同ID进行新提交,这些ID构成从({1}}的内容开始并经过N的链。他们只会拥有与原始ZN不同的ID。一旦你这样做,你就不能回去了。

至于如何这样做:有多种不同的方式,但最简单的(如果慢)可能使用Z。应用提供的过滤器后,git filter-branch脚本会复制每次提交。因此,例如,如果您想提交提交filter-branch根提交:

1234567890123456789012345678901234567890

(请注意,这是未经测试的,并且过滤分支通常非常危险,通常应该在您的存储库的副本 [即克隆]上运行,直到您计算出过滤器(s) )你真的想)。一旦filter-branch完成,你就可以决定你是否喜欢这个结果,删除任何不需要的分支,然后重新克隆过滤后的存储库来抛弃那些只被filter-branch' {{{ 1}}名字。

(有很多方法可以让它变得更快,并且可以做到这一点,但听起来你对git来说是非常新的,所以在克隆上做所有这些更安全,你可以简单地删除你不喜欢结果。通过保持原始存储库不受影响,你可以返回,你只需要继续使用原始文件并停止使用修改过的克隆。)