In the previous posts we checked how to use the git rebase --interactive
and how to squash your commits using the fixup
command in the git-rebase-todo
file.
Now, we're going to learn how to split commits using the terminal. But why splitting a commit? This helps to organize your work. For instance, you may need to rearrange your changes to make backporting hotfixes to older released versions easier, likely using git cherry-pick
. Letβs dive in!
Splitting commits
You can use git rebase
to split your commits. There are several alternatives to do it and we're going to check the git rebase --interactive
way. You can use git rebase --interactive main
to reapply all your new commits to the top of the main
branch, or just git rebase --interactive HEAD~2
to apply the latest 2 commits.
pick 0680aa7 fix header responsiveness
exec npm test
edit 68ab202 fix grid responsiveness and upgrade bootstrap
exec npm test
break
π‘ You can pick
the rebased commits in any order! but this can cause Git conflicts π. Also you can pick
commits from other branches like git cherry-pick
.
Well, Git will pick
the commit 0680aa7
as-is and run npm test
and if the command exists then Git will pick the commit 68ab202
and break, returning the control of the shell to you allowing to edit
this last commit. Let's see how to edit the last commit.
π§ To clarify: edit
stops after applying the commit, so that you can edit the files or the commit message, amend the commit, and continue rebasing.
First, undo it keeping all the changes in the working tree using the following command:
git reset HEAD^
Now, you are able to make any edition to your code. Then you can use git add
to add the changes to the index to commit it in parts splitting the original commit. As the following example shows:
git add package.json package-lock.json
git commit -m 'upgrade bootstrap'
git add .
git commit -m 'fix grid responsiveness'
git rebase --continue
Git will continue running the second exec
command that makes an npm test
. If this fails you will need to fix your code; otherwise Git will stop at the break
command returning the control of the shell to you again. Here you are able to run your application, make the final checks, etc.
If you're happy with the changes, run git rebase --continue
to finish the rebase, or git rebase --abort
to cancel all changes. π
Let me know in the comments π what other method you prefer to split or edit commits.
Conclusion
Remember that it's useful to keep your commits small and semantic. Committing atomic changes makes it easier to check where a crazy bug was introduced. Splitting commits is an easy process to perform and helps you to keep your Git history more readable. Remember, more commits is not an issue if they are small and semantic.
In the next post we're going to check the git rebase --force-rebase
command. See ya!