【问题标题】:How to squash all commits except the n most recent?如何压缩除 n 最近的所有提交?
【发布时间】: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 的提交消息,而不会发生文件冲突?

【问题讨论】:

    标签: git commit rebase squash


    【解决方案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
      猜你喜欢
      • 2017-06-12
      • 2021-03-17
      • 2014-07-31
      • 2014-10-10
      • 2010-12-12
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      相关资源
      最近更新 更多