With the introduction of GitHub's [Squash and Merge](https://github.com/blog/2141-squash-your-commits) feature, this has become less prevelant, however it's still useful in scenarios where GitHub's interface is unavailable. Let's talk through two ways to do a squash and merge on the command line. ## Take 1: Interactive Rebase **When to use it** - When you have not merged main into your feature branch - There are no merge conflicts - When you want to retain the original committer on the squashed commit **Steps** You are working on branch `feat-fuu`. You want to create a single squashed commit to push to your remote `feat-fuu` branch on GitHub. 1. `git checkout main` 1. `git pull` 1. `git checkout feat-fuu` 1. `git checkout feat-fuu-backup` - *Optional but recommended* - make a backup version of your branch 1. `git checkout feat-fuu` 1. `EDITOR='code -w' git rebase -i main` - Setting `EDITOR` is optional, and depends on your editor of choice. With the case of VSCode or Sublime Text, the `-w` flag tells the editor to "wait" until the file exits before closing. 1. In your editor, edit all of the additional commits to `squash`. Leave the first commit in the list alone 1. Save and exit your editor 1. Rewrite a nice single commit message for the commit 1. Check the history. `feat-fuu` will now contain a single commmit ahead of `main` 1. `git push -f origin feat-fuu` - **Please be careful with this step, as it overwrites your original remote branch on GitHub** ## Take 2: Git Squashed Merge **When to use it** - You have merged main into your branch and resolved conflicts - You don't care about the author of the original commits (you will be rewriting it) You are working on branch `feat-fuu`. You want to create a single squashed commit to push to your remote `feat-fuu` branch on GitHub. 1. `git checkout main` 1. `git pull` 1. `git checkout feat-fuu` 1. `git checkout feat-fuu-backup` 1. `git checkout main` 1. `git branch -D feat-fuu` - **You are deleting your original branch.** Ensure you have created `feat-fuu-backup` beforehand and it has your full commit history. 1. `git checkout -b feat-fuu` - This creates a fresh branch from main 1. `git merge --squash feat-fuu-backup` - You are merging and squashing your original work into a single commit. This is where the magic happens. 1. Rewrite a nice single commit message for the commit 1. Check the history. You should see a single commmit on your branch that branched from `main` 1. `git push -f -u origin feat-fuu` - **Please be careful with this step, as it overwrites your original branch on GitHub** ## References - This [Stack Overflow Post](https://stackoverflow.com/a/2427520) has additional detail about the differences between these two approaches.