回溯性压缩子树合并

6
我使用子树合并策略将一个外部库合并到我的项目中。我没有在'git merge'命令中使用--squash选项,因此现在整个库的历史记录(非常庞大)都在仓库中膨胀。我如何回溯地压缩合并?

我的情况是:

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

我想要到达:

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

E是包含合并的提交。

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

2个回答

5
请记住,如果您已经将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 5. 可选的git branch -D library和git branch -d lib-squash
这样可以让您拥有干净的历史记录,但您刚刚重写了历史记录,您需要使用--force标志进行推送,然后每个人都需要修复他们的存储库:
1. git fetch 2. git checkout master 3. git reset --hard origin/master,假设您没有本地提交,只有远程存储库中的提交。 4. 如果您有任何本地提交,则需要“rebase onto”这些提交。
不幸的是,我没有找到有关分离历史提交而不影响未来提交的文章。

谢谢,我会等待你的回答。关于你的评论,不要对已发布的提交进行变基 - 假设每个人都有最新的存储库并且正在“主”上工作,为什么如果提交Z-A消失,他们会感到困扰呢?提交E(和G)是否包含他们正在使用的整个树? - wanderingbear
1
它们包含相同的树,但仍然具有另一个提交ID(因为提交ID也取决于提交的父级)。这就是问题所在。 - Paŭlo Ebermann
1
每次提交都会从父链接(sha1)、提交文本和树内容生成sha1。因此,即使您的树相同,如果更改提交文本,则sha1也应更改。如果将多个提交压缩成一个提交,则基本上更改了子树的sha1 - 您会丢失用于生成sha1的提交消息和父链接。 - MBO

0

Rebase 应该能帮助你解决这个问题。这篇文章应该能给你足够的指引来解决它。


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