压缩那些是多个分支祖先的git提交

4

我已经通过Github克隆了一个现有的项目仓库,它复制了所有的提交历史记录和分支。我想从克隆项目的主分支中删除所有提交历史记录,并保留我正在使用的分支的提交历史记录(见图表)。该项目如下所示:

A [master]
\
  B [branchDevelop] ________
   \                        \
     C [branchFeature1]      D [branchFeature2]

我尝试了在主分支上进行变基和压缩提交,但是我一直遇到合并冲突的问题。此外,如果我删除.git并重新初始化项目,我将失去我的分支。如何删除主分支的提交历史记录并保留我正在工作的开发分支和提交?


现在我想要做的是从克隆项目中删除所有提交历史,但保留我正在使用的新分支。一些原始仓库的提交历史可能包含在您的新分支家谱中。您所说的“删除所有提交历史”是什么意思? - jub0bs
@Jubobs 我想从主分支中删除所有提交,因为它们来自另一个项目。在其他分支中完成的工作是针对我正在处理的项目的,所以我想保留这些分支的提交历史记录。另外,我已经更新了ASCII图片。 - Liver
从主分支中删除所有提交记录?你是指将它们squash成一个提交记录吗? - jub0bs
branchDevelop 应该发生什么? - jub0bs
如果可能的话,我想将它保留为一个单独的分支,并保留所有提交历史和子分支(branchFeature1、branchFeature2)。 - Liver
显示剩余3条评论
2个回答

0

首先,在一个新分支上创建一个提交,其内容与master相同,但没有master的历史记录:

git checkout --orphan new_master master
git commit -m'squashed'

警告:严重历史重写即将发生!

  • 请务必备份好您的数据。
  • 请勿期望您能够轻松地推送回原始远程仓库,或从中拉取或合并代码,这可能会带来很大的麻烦!

然后使用git filter-branchbranchDevelop和您的功能分支重新基于它进行重构:

git filter-branch \
    --parent-filter \
        "test \$GIT_COMMIT = $(git show -s master --format=%H) \
            && echo '-p $(git show -s new_master --format=%H)' \
            || cat" \
    --tag-name-filter "cat" \
    -- \
    branchDevelop branchFeature1 branchFeature2

最后,删除旧的master分支并将新分支重命名为master
git branch -M new_master master

-1
您可以将您的分支重命名为主分支吗?
git branch -M branchDevelop master

请确保您想要执行此操作。您可以使用强制推送进行推送:

git push -f origin master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接