追溯压缩子树合并

时间:2011-06-06 08:56:23

标签: git

我使用the subtree merge strategy将外部库合并到我的项目中。我没有将--squash选项传递给'git merge',所以我现在拥有整个库历史(这是巨大的)膨胀存储库。我如何追溯压缩合并?

我的情况是:

Z--Y--..--B--A
              \ 
           D---E---F---G master

我想:

           D---E---F---G master

其中E是包含合并的提交。

我想解决方案将涉及'git rebase',但我不确定如何在这种情况下正确使用它。

2 个答案:

答案 0 :(得分:2)

请记住,如果你已经在master中发布了E或更高版本的提交到远程,那么就不要对它们进行rebase,因为这会破坏其他代码,你也需要手动修复它们的存储库。

Rebase创建了新版本,它无法神奇地修改现有版本(这就是它使用SHA1的原因,因此您确定您的提交包含生成此特定SHA1的内容并且未进行修改)

但是如果你准备好了,那就继续我的例子。

  1. 首先你需要在合并库之前返回提交,从那里创建命名分支,让我们说'lib-squash'
  2. git merge --squash library; git commit
  3. git checkout master
  4. git rebase -i -p --onto lib-squash <sha1 old merge commit>
  5. 可选git branch -D librarygit branch -d lib-squash
  6. 这为您留下了干净的历史,但您只需重写历史记录,您需要使用--force标志,然后每个人都需要修复其存储库:

    1. git fetch
    2. git checkout master
    3. git reset --hard origin/master,假设您没有远程存储库中的其他本地提交
    4. 如果你有任何本地提交,你也需要“重新加入”这些提交。
    5. 不幸的是,我没有找到关于在不影响未来提交的情况下分离历史提交的文章。

答案 1 :(得分:1)

Rebase应该帮助你。 This article应该给你足够的指针来解决它