Back with another git magic. When it comes to merging a pull request on Github, there are two options
- Rebase and Merge
- Squash and Merge
What is Rebase and Merge?
When one chooses Rebase and Merge, all the commits in the PR are added to the target branch. For example, if the PR has 5 commits, all of those commits will be visible in the PR history of the target branch.
What is Squash and Merge?
When a PR is merged by choosing Squash and Merge, all the commits in the PR are combined into one PR and then added to the target branch. Once again, if the PR has 5 commits or any number of commits, they are combined and added to the target branch.
Therefore, this is what Squash means. Combining 'n' different commits into one single commit is called squashing. In this blog post, we will go through the commands that can squash commits.
Advantages of Squashing commits
No more redundant commits
In a pull request, one may have 'n' different commits for one change. They might have been commits that were created due to addressing various review comments or fixing bugs that were found later. While you can amend the existing commit, what if you created those commits already? That is when squash commits come into the picture making the redundant commits go away.
Better grouping
In the case of squashing and merging, although your PR has 'n' different commits that aren't redundant but are not required to be separate in the main branch, squash groups it thereby logically grouping those commits into a single feature (or) fix commit.
Easy to track
Due to squashed commits, the history is simpler and logically grouped without any redundant commits. Therefore, it is easy to track the changes with Git Lens / Git Blame.
How to squash a commit?
/**
* @disclaimer
* Please read this post fully before executing any command. My scenario might not be the same as yours.
*/
* @disclaimer
* Please read this post fully before executing any command. My scenario might not be the same as yours.
*/
Let us assume you have the following commit history which we can list using git log --oneline as follows,
Now, let's say you want to squash the first three commits together. To do this, we will have to begin an interactive rebase as follows,
An editor like below will open,
When this editor opens, to squash the top three commits, change the pick commands of the two commits into squash as shown below,
Now, the commits that are mentioned as squash will be combined with the top commit mentioned as pick. At this point, please solve any conflicts, stage those files and do a git rebase --continue.
Once all the conflicts are solved, an editor will open again asking to choose a commit message. At this point, you can either choose one of those messages by commenting everything else or you can choose to write a new commit message. I will comment all the existing commit messages and enter a new commit message as shown below,
Write the above file and tada! Your squashing is successful and you'll see a message as shown below,Please note that, once the squashing is done for the commits that are already pushed to remote, one needs to force push. Please do a force push only on your branch and not on the default or feature branches. Happy exploring!
Comments
Post a Comment