如何压缩除 n 最近的所有提交?

Posted

技术标签:

【中文标题】如何压缩除 n 最近的所有提交?【英文标题】:How to squash all commits except the n most recent? 【发布时间】:2020-09-21 05:54:08 【问题描述】:

我看到你可以使用git rebase -i HEAD~3 来处理最新的 3 次提交。有没有办法在不手动检查所有提交并指定 squash 之前简单地压缩每个提交,例如最近的 3 个提交?

对于上下文,我从一个分支 (originalBranch) 创建了一个分支 (testBranch)。我做了一堆提交,现在我想把这个分支合并到主分支。问题是,我有来自 originalBranch 的所有提交。 我什至尝试通过执行git rebase -i HEAD~70 进行变基(是的,在 originalBranch 中有很多提交),并像这样编辑文件:

r 14133a8 first commit message in originalBranch
s 3cb3a90 message2
s ea61cc4 message3
# ... etc
#commits from testBranch. These should remain after rebase
p a62bff7 first commit message in testBranch
p 4364e1f last commit message in testBranch

我虽然 originalBranch 中的所有内容都会压缩成一条消息,但是当我这样做时会遇到文件冲突。我怎样才能简单地将 originalBranch 中的每个提交压缩为 1 条提交消息,同时保留来自 testBranch 的提交消息,而不会发生文件冲突?

【问题讨论】:

【参考方案1】:

嗯...你可以像这样轻松地压扁。

git checkout --detach originalBranch
# set branch pointer at the point where originalBranch and master diverged
git reset --soft $( git merge-base HEAD master ) # all changes are ready to be committed
git commit -m "Squashed originalBranch"
# now we replicate your branch on top of it
git cherry-pick originalBranch..testBranch # replicated all changes on top of squashed revision
# now you can consider moving your branch if you like the result
git branch -f testBranch
git checkout testBranch

但你真的需要这样做吗?这一点也不优雅。如果您不依赖 originalBranch 并且只想移动到 master 的顶部:

git rebase --onto master originalBranch testBranch

这会将来自 testBranch 不在 originalBranch 中的修订移动到 master 之上。

【讨论】:

【参考方案2】:

这就是 filter-branch 的用途。

git replace --graft HEAD~3
git filter-branch --all

是它的核心,每个追溯到 HEAD~3 的 ref 都将获得一个新的历史记录,该历史记录可以追溯到新的遗忘症替换提交。请参阅 filter-branch 文档,您可能想要重写标签名称等。要退出您不喜欢其结果的过滤器分支,git fetch . +refs/original/*:*;在您确定要保留其结果的过滤器分支之后进行清理,git filter-branch -f --setup exit

【讨论】:

嗯,似乎不起作用。 git filter-branch --all 返回使用信息。将在文档中阅读更多内容 是的,您可以忽略该消息。让(五秒?)超时过去或做export FILTER_BRANCH_SQUELCH_WARNING=1

以上是关于如何压缩除 n 最近的所有提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过非交互式压缩除最近的提交之外的所有提交来减少膨胀的Git仓库的大小?

当不是你最近的提交时如何压缩你的提交[重复]

如何将所有 git 提交压缩为一个?

如何将所有 git 提交压缩为一个?

如何将文件夹的每个子文件夹中除最新文件外的所有文件压缩为每个子文件夹一个 ZIP 文件?

Git 重写历史