Search code examples
gitsquash

Squash groups of pushed commits


The answer here explains well how to squash the last few commits after they've already been pushed, but what about the e.g. the last 12 into three groups of four? That is, I have pushed commits 1-12 and would like to now squash them down to three commits. These three squashed commits would contain original commits 1-6, 7-8, and 9-12, respectively. How can I do this?

Bonus points: how can I specify a new commit message for each of the three squashed commits?


Solution

  • You can squash multiple sets of commits at once:

    git rebase -i HEAD~15

    pick 3f3416d T11 - some issue
    pick 23031eb T12 - fix
    pick 8239b70 T13 - improvements 
    squash e1e23fd T13 - one more fix
    squash 200c8c6 T13 - last fix
    pick e5b0286 T14 - great feature
    pick d18bf1b T15 - removing unused files
    pick a1b1821 T16 - refactor part 1.
    squash dd090dc T16 - refactor part 2.
    squash d87db6b T16 - refactor part 3.
    pick da1dd09 T17 - new model of database
    pick 39b4ace T18 - restfull api
    pick 65521eb T19 - registration form
    squash 8924091 T19 - login form
    pick b44a25c T20 - new super feature
    

    During rebase you will be asked about new commit messages for each group:

    1 group

    # This is a combination of 3 commits.
    # The first commit's message is:
    T13 - improvements
    
    # This is the 2nd commit message:
    
    T13 - one more fix
    
    # This is the 3rd commit message:
    
    T13 - last fix
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Author:    Your Name <your.email@domain.com>
    # ...
    

    2 group

    # This is a combination of 3 commits.
    # The first commit's message is:
    T16 - refactor part 1.
    
    # This is the 2nd commit message:
    
    T16 - refactor part 2.
    
    # This is the 3rd commit message:
    
    T16 - refactor part 3.
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Author:    Your Name <your.email@domain.com>
    # ...
    

    3 group

    # This is a combination of 2 commits.
    # The first commit's message is:
    T19 - registration form
    
    # This is the 2nd commit message:
    
    T19 - login form
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Author:    Your Name <your.email@domain.com>
    # ...