Squash my last X commits together using Git

前端 未结 30 3401
醉酒成梦
醉酒成梦 2020-11-21 05:17

How can I squash my last X commits together into one commit using Git?

30条回答
  •  说谎
    说谎 (楼主)
    2020-11-21 05:53

    Thanks to this handy blog post I found that you can use this command to squash the last 3 commits:

    git rebase -i HEAD~3
    

    This is handy as it works even when you are on a local branch with no tracking information/remote repo.

    The command will open the interactive rebase editor which then allows you to reorder, squash, reword, etc as per normal.


    Using the interactive rebase editor:

    The interactive rebase editor shows the last three commits. This constraint was determined by HEAD~3 when running the command git rebase -i HEAD~3.

    The most recent commit, HEAD, is displayed first on line 1. The lines starting with a # are comments/documentation.

    The documentation displayed is pretty clear. On any given line you can change the command from pick to a command of your choice.

    I prefer to use the command fixup as this "squashes" the commit's changes into the commit on the line above and discards the commit's message.

    As the commit on line 1 is HEAD, in most cases you would leave this as pick. You cannot use squash or fixup as there is no other commit to squash the commit into.

    You may also change the order of the commits. This allows you to squash or fixup commits that are not adjacent chronologically.


    A practical everyday example

    I've recently committed a new feature. Since then, I have committed two bug fixes. But now I have discovered a bug (or maybe just a spelling error) in the new feature I committed. How annoying! I don't want a new commit polluting my commit history!

    The first thing I do is fix the mistake and make a new commit with the comment squash this into my new feature!.

    I then run git log or gitk and get the commit SHA of the new feature (in this case 1ff9460).

    Next, I bring up the interactive rebase editor with git rebase -i 1ff9460~. The ~ after the commit SHA tells the editor to include that commit in the editor.

    Next, I move the commit containing the fix (fe7f1e0) to underneath the feature commit, and change pick to fixup.

    When closing the editor, the fix will get squashed into the feature commit and my commit history will look nice and clean!

    This works well when all the commits are local, but if you try to change any commits already pushed to the remote you can really cause problems for other devs that have checked out the same branch!

提交回复
热议问题