Git - 从中间推到顶部
Git - push from the middle to the top
我正在 bitbucket 中创建一个新的存储库,我想从我的历史提交的中间推送到顶部,忽略第一个。我该怎么做?
为了解释和简化一点,您有一个历史悠久的存储库(可能包括此简化图中省略的分支和合并),看起来像:
A--B--C--...--L--M--N--...--X-Y-Z
(其中 A
是第一次提交,Z
是到目前为止的最后一次提交),但是您想要的历史记录如下所示:
N--...--X-Y-Z
即历史的前半部分(从 root 提交 A
开始)已被删除。
你不能(完全)那样做。 Git 在提交的基础上工作,每个提交都有一个全局唯一的 ID,该 ID 取决于导致该提交的整个历史记录中该提交的内容 和 。换句话说,提交 Z
的身份取决于提交 A
到 M
的存在和身份。如果您应该设法以某种方式删除其中任何一个,则每个后续提交的身份(SHA-1)将更改。
你可以做到这一点——使用新的、不同的 ID 进行新的提交,形成一个从 N
(的内容)开始并经过 [=14] 的链=].它们的 ID 与最初的 N
到 Z
不同。一旦执行此操作,您将无法返回。
至于 如何 做到这一点:有多种不同的方法,但最简单的(如果慢的话)可能是使用 git filter-branch
。 filter-branch
脚本在应用您提供的过滤器后复制每个提交。所以,例如,如果你想让提交 1234567890123456789012345678901234567890
成为根提交:
git filter-branch --parent-filter \
'test $GIT_COMMIT = 1234567890123456789012345678901234567890 && \
echo "" || cat' -- --all
(请注意,这是未经测试的,过滤器分支通常是相当危险的,通常应该 运行 在您的 copy [即克隆]存储库,直到你计算出你真正想要的过滤器)。过滤器分支完成后,您可以决定是否喜欢结果,删除任何不需要的分支,然后重新克隆过滤后的存储库以丢弃仅由过滤器分支 refs/original/
名称保留的对象.
(有一些方法可以使它更快,并且可以就地执行此操作,但听起来您对 git 还很陌生,因此在克隆上执行所有这些操作更安全,您可以简单地如果您不喜欢结果,请删除。通过保持原始存储库不变,您可以可以返回,您只需要继续使用原始存储库并停止使用修改后的克隆。)
我正在 bitbucket 中创建一个新的存储库,我想从我的历史提交的中间推送到顶部,忽略第一个。我该怎么做?
为了解释和简化一点,您有一个历史悠久的存储库(可能包括此简化图中省略的分支和合并),看起来像:
A--B--C--...--L--M--N--...--X-Y-Z
(其中 A
是第一次提交,Z
是到目前为止的最后一次提交),但是您想要的历史记录如下所示:
N--...--X-Y-Z
即历史的前半部分(从 root 提交 A
开始)已被删除。
你不能(完全)那样做。 Git 在提交的基础上工作,每个提交都有一个全局唯一的 ID,该 ID 取决于导致该提交的整个历史记录中该提交的内容 和 。换句话说,提交 Z
的身份取决于提交 A
到 M
的存在和身份。如果您应该设法以某种方式删除其中任何一个,则每个后续提交的身份(SHA-1)将更改。
你可以做到这一点——使用新的、不同的 ID 进行新的提交,形成一个从 N
(的内容)开始并经过 [=14] 的链=].它们的 ID 与最初的 N
到 Z
不同。一旦执行此操作,您将无法返回。
至于 如何 做到这一点:有多种不同的方法,但最简单的(如果慢的话)可能是使用 git filter-branch
。 filter-branch
脚本在应用您提供的过滤器后复制每个提交。所以,例如,如果你想让提交 1234567890123456789012345678901234567890
成为根提交:
git filter-branch --parent-filter \
'test $GIT_COMMIT = 1234567890123456789012345678901234567890 && \
echo "" || cat' -- --all
(请注意,这是未经测试的,过滤器分支通常是相当危险的,通常应该 运行 在您的 copy [即克隆]存储库,直到你计算出你真正想要的过滤器)。过滤器分支完成后,您可以决定是否喜欢结果,删除任何不需要的分支,然后重新克隆过滤后的存储库以丢弃仅由过滤器分支 refs/original/
名称保留的对象.
(有一些方法可以使它更快,并且可以就地执行此操作,但听起来您对 git 还很陌生,因此在克隆上执行所有这些操作更安全,您可以简单地如果您不喜欢结果,请删除。通过保持原始存储库不变,您可以可以返回,您只需要继续使用原始存储库并停止使用修改后的克隆。)