How can you squash multiple previous commits together into a single commit in a Git repository?
You can squash multiple previous commits into a single commit using git reset
and git merge --squash
. Here’s how to do it:
- Stash Uncommitted Changes (optional but recommended):
git stash
- Reset to the Desired Commit:
Reset your branch to the commit before the ones you want to squash. Replace3
with the number of commits to squash:git reset --hard HEAD~3
- Squash the Commits:
Usegit merge --squash
to squash the commits. TheHEAD@{1}
argument refers to the commit you were at just before thegit reset
command:git merge --squash HEAD@{1}
- Create a New Commit:
Create a new commit with the combined changes:git commit
This will open your configured commit message editor with a commit message containing details of the squashed commits. You can edit this message to summarize the changes. - Push the Squashed Commit:
Push the squashed commit to the remote repository. If the commits you squashed have already been pushed to the remote, you will need to force push to rewrite the history:git push --force
- Apply Stashed Changes (if you stashed changes in step 1):
git stash pop
Detailed Steps and Commands
- Stash Uncommitted Changes:
git stash
This command saves your uncommitted changes and cleans your working directory. - Reset to the Desired Commit:
git reset --hard HEAD~3
This moves your branch pointer back by 3 commits. Adjust the number based on how many commits you want to squash. - Squash Commits:
git merge --squash HEAD@{1}
This stages all changes from the last 3 commits as a single change. - Create a New Commit:
git commit
This opens your commit editor (usually Vim or vi) with a pre-filled message detailing the squashed commits. Edit this message to summarize the combined changes. If using Vim, pressi
to enter Insert Mode, edit the message, pressEsc
to exit Insert Mode, and type:wq
to save and quit. - Force Push to Remote:
git push --force
This command updates the remote repository, rewriting the history with your squashed commit. - Apply Stashed Changes:
git stash pop
This restores your stashed changes to your working directory.
Summary
By following these steps, you can effectively squash multiple commits into a single commit and update your remote repository, ensuring a cleaner and more concise commit history.