追溯压缩子树合并

wan*_*ear 5 git

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

我的情况是:

Z--Y--..--B--A
              \ 
           D---E---F---G master
Run Code Online (Sandbox Code Playgroud)

我想:

           D---E---F---G master
Run Code Online (Sandbox Code Playgroud)

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

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

MBO*_*MBO 5

请记住,如果您已经发布了 E 或稍后在 master 中提交到远程,那么不要对它们进行 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

这给你留下了干净的历史记录,但你只是重写了历史记录,你需要使用 --force 标志进行推送,然后每个人都需要修复他们的存储库:

  1. git fetch
  2. git checkout master
  3. git reset --hard origin/master,假设您没有除远程存储库之外的其他本地提交
  4. 如果您有任何本地提交,您也需要“重新定位”这些提交。

不幸的是,我还没有找到有关分离历史提交而不影响未来提交的文章。