DEV Community

netsi1964 πŸ™πŸ»
netsi1964 πŸ™πŸ»

Posted on

Squashing Git Commits for a Cleaner Commit History

Please note - this is written by an AI chat robot.

TLDR: Squashing Git commits is a technique to combine multiple related commits into a single one, making the commit history cleaner and more readable. This guide will show you how to squash commits in a Mac terminal using git rebase -i command.

When working on a project, it's not uncommon to make multiple commits that are related to each other. However, when it comes to sharing your work with others or merging it into a main branch, it's often better to combine these related commits into a single commit. This not only makes the commit history cleaner and more readable, but it also makes it easier to revert changes if needed.

Squashing commits in Git can be done using the git rebase -i command. The git rebase -i command allows you to interactively specify which commits you want to squash.

Here's an example of how to use git rebase -i to squash commits:

1) First, check the commit history using git log to determine how many commits you want to include in the squash.

$ git log
commit 1a2b3c4d5e6f7g8h9i0j (HEAD -> master)
Author: John Doe <johndoe@example.com>
Date:   Mon Jan 11 12:34:56 2021 -0600

Commit message for commit 1

commit 9a8b7c6d5e4f3g2h1i0j
Author: John Doe <johndoe@example.com>
Date:   Sun Jan 10 09:08:07 2021 -0600

Commit message for commit 2

commit 8a7b6c5d4e3f2g1h0i9j
Author: John Doe <johndoe@example.com>
Date:   Sat Jan 9 06:06:06 2021 -0600

Commit message for commit 3
Enter fullscreen mode Exit fullscreen mode

2) Use git rebase -i HEAD~n where "n" is the number of commits you want to include in the squash. In this case, we want to include the last 3 commits, so we will use git rebase -i HEAD~3.

git rebase -i HEAD~3
Enter fullscreen mode Exit fullscreen mode

3) This will open a text editor showing the commits that you want to squash, with the word "pick" at the beginning of each line. Replace the word "pick" with "squash" for the commits that you want to squash.

pick 1a2b3c4d5e6f7g8h9i0j Commit message for commit 1
squash 9a8b7c6d5e4f3g2h1i0j Commit message for commit 2
squash 8a7b6c5d4e3f2g1h0i9j Commit message for commit 3
Enter fullscreen mode Exit fullscreen mode

4) Save and exit the editor. git will then squash the specified commits, and will prompt you to enter a new commit message for the squashed commit.

# This is a combination of 3 commits.
# This is the 1st commit message:
Commit message for commit 1
# This is the commit message for the 2nd:
Commit message for commit 2
# This is the commit message for the 3rd:
Commit message for commit 3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
Enter fullscreen mode Exit fullscreen mode

5) Enter a new commit message and save the file. The specified commits will now be squashed into a single commit with the new commit message.

It is worth mentioning that squashing commits changes the commit history, and this could cause issues if you have already pushed the commits to a remote repository and other people have pulled them. In that case, it's best to consult with them before proceeding with the squashing.

Additionally, you can use git log --graph command to visualize the commit history, which can be helpful when you have a lot of commits, this way you can see how your commits are related to each other and make a more informed decision about which commits to squash.

It is also good to note that squashing commits is not a one-size-fits-all solution, and it's important to use it judiciously.

NB: This post was generated by OpenAIChat (an AI model with knowledge cut-off 2021), and was requested by user netsi1964. If you have any question about this post or the topic, feel free to ask.

Top comments (0)