【问题标题】:How to programmatically squash merge commits in git if they have same commit message?如果它们具有相同的提交消息,如何以编程方式在 git 中压缩合并提交?
【发布时间】:2019-07-26 20:55:20
【问题描述】:

我使用git filter-branch --subdirectory-filter 选项从一个存储库中提取两个子目录并将它们合并到另一个存储库中。但是,我现在需要压缩提交,因为任何涉及两个子目录的提交现在都在新的 repo 中复制。

要解决此问题,我如何根据某些规则以编程方式合并所有此类提交?在我的情况下,我确定如果提交以“Merge PR #PRNumber”开头,其中数字相同,则它是重复的并且可以被压在一起。

我正在考虑编写一个脚本来查看“git log”的输出,然后找到这些重复项,然后执行git rebase --onto commitA commitB

但是我想知道是否有更快/git-native 的方式来做到这一点。有谁知道实现这一目标的其他方法?

【问题讨论】:

  • 在不了解两个存储库更改前后的提交结构的情况下尝试遵循您已遵循的步骤是非常令人困惑的。您能否简要介绍一下您的历史?

标签: git rebase git-filter-branch


【解决方案1】:

您可能需要额外的步骤来修改某个范围内的提交消息,但您可以使用git rebase 来执行此操作。首先,将fixup! 添加到您要合并的每个提交消息前,这告诉 git 它可以自动将它们压缩到包含匹配消息的范围内的第一个提交中。然后,运行git rebase --interactive --autosquash,并验证它是否按照您的预期进行。

【讨论】:

  • 如果在运行git rebase --interactive 并加载编辑器之后(由新手) 执行,您关于预先添加fixup! 的建议会表现得非常不同。尽管我对变基很有经验,但我花了一段时间才理解。
【解决方案2】:

我不确定您的历史记录是什么样的,通常提交消息Merge PR #PRNumber 来自merge commit,这不是重复的。不过……

我会做一个 git log 来查看提交的分布情况

$ git log --oneline
$ git cherry-pick --squash <sha1>..<sha1>

如果您想要压缩的提交分布更分散,bash for loop 将起作用(不确定您是在 windows 还是 linux),如果您可以轻松识别(基于消息,正如你所说)你想squash在上面。

如果您想在此处粘贴您的 log --oneline,我们还可以帮助您实现自动化。

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 2015-07-20
    • 2018-11-10
    • 2018-11-05
    • 1970-01-01
    • 2012-01-24
    • 2021-03-26
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多