如何压缩除 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仓库的大小?