代码之家  ›  专栏  ›  技术社区  ›  JeremyKun

在“git rebase”中通过提交消息删除提交`

  •  2
  • JeremyKun  · 技术社区  · 7 年前

    我想做一个 git rebase 以及删除提交消息与特定正则表达式匹配的提交。例如,它可能像

    git rebase --drop="deletme|temporary" master
    

    这会让你重新定位 master 删除包含字符串的所有提交时 deleteme temporary .

    使用标准Git工具可以做到这一点吗?如果没有,是否可以使用第三方Git工具?特别是,我希望它是一个单一的、非交互的命令。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Scott Weldon Marc-Alexandre Bérubé    7 年前

    这可以使用我在中使用的相同方法来完成 this answer .

    首先,我们需要找到相关的提交。你可以这样做:

    git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary"
    

    这将为您提供一个包含提交消息的提交列表,其中包含: deleteme temporary 介于 master 以及您当前的分支机构。这些是需要删除的提交。

    保存这个 在您可以访问的地方编写脚本:

    #!/bin/bash
    
    for sha in $(git log --format=format:"%H %s" master..HEAD | grep -E "deleteme|temporary" | cut -d " " -f 1)
    do
      sha=${sha:0:7}
      sed -i "s/pick $sha/drop $sha/" $@
    done
    

    然后运行rebase为:

    GIT_SEQUENCE_EDITOR=/path/to/script.sh git rebase -i
    

    这将自动删除包含以下内容的所有提交: 删除 短暂的 在他们的提交消息中。

    正如我在另一个答复中提到的:

    [此脚本不允许]您自定义运行什么命令来计算要使用的提交,但如果这是一个问题,您可能会传入一个环境变量以允许此类自定义。

    强制性的 警告 :由于重基重写历史记录,这可能会对其他在此分支上工作的人造成危险/破坏。确保你清楚地与任何与你合作的人交流你所做的事情。

        2
  •  1
  •   Vampire    7 年前

    例如,您可以使用交互式重设基础。我也是 git rebase -i <first commit that should not be touched> ,然后在vim中,您有提交列表,您可以 :%s/^[^ ]* \([^ ]* issue\)/d \1/g 要对提交消息以“”开头的所有提交使用drop节,请执行以下操作: issue .但请注意 git rebase 在合并提交时无法以最佳方式工作。默认情况下,它们将被跳过,历史记录将被展平,但您可以尝试使用参数保留它们。