Search code examples
regexgitterminalgit-rebase

Drop commits by commit message in `git rebase`


I would like to do a git rebase and drop commits whose commit messages match a certain regular expression. For example, it might work like

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

And this would do a rebase over master while dropping all commits containing the string deleteme or temporary.

Is is possible to do this with the standard Git tool? If not, is it possible with a third-party Git tool? In particular, I want it to be a single, noninteractive command.


Solution

  • This can be accomplished using the same method as I used in this answer.

    First, we need to find the relevant commits. You can do that with something like:

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

    This will give you a list of commits with commit messages containing deleteme or temporary that are between master and your current branch. These are the commits that need to be dropped.

    Save this script somewhere you can access it:

    #!/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
    

    Then run the rebase as:

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

    This will automatically drop all commits that contain deleteme or temporary in their commit message.

    As mentioned in my other answer:

    [This script won't allow] you to customize what command is run to calculate which commits to use, but if this is an issue, you could probably pass in an environment variable to allow such customization.

    Obligatory warning: Since a rebase rewrites history, this can be dangerous / disruptive for anyone else working on this branch. Be sure you clearly communicate what you have done with anyone you are collaborating with.