Squashing commits in Git - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When we squash commits in git, we combine multiple changes into one. Understanding how the time to squash grows helps us know what to expect as the number of commits increases.
We want to answer: How does the effort to squash commits change as we have more commits?
Analyze the time complexity of the following git commands used to squash commits.
git rebase -i HEAD~5
# In the editor, mark commits to squash
# Save and close editor
# Git rewrites commit history combining commits
This snippet shows an interactive rebase to squash the last 5 commits into one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Git processes each commit in the range one by one during the rebase.
- How many times: Once per commit in the selected range (e.g., 5 commits means 5 steps).
As the number of commits to squash increases, git must process each commit individually to combine them.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 commits | Processes 10 commits sequentially |
| 100 commits | Processes 100 commits sequentially |
| 1000 commits | Processes 1000 commits sequentially |
Pattern observation: The work grows directly with the number of commits; doubling commits roughly doubles the work.
Time Complexity: O(n)
This means the time to squash commits grows linearly with the number of commits involved.
[X] Wrong: "Squashing many commits takes the same time as squashing just a few."
[OK] Correct: Each commit must be processed, so more commits mean more work and more time.
Understanding how git operations scale with input size shows you can think about tool efficiency and plan work better. This skill helps you explain your choices clearly in real projects.
What if we changed from squashing commits interactively to using a single merge commit? How would the time complexity change?
Practice
Solution
Step 1: Understand commit history management
Squashing is used to combine several commits into a single commit to simplify the commit history.Step 2: Identify the purpose of squashing
This helps keep the project history clean and easier to read by reducing clutter from many small commits.Final Answer:
To combine multiple commits into one for a cleaner history -> Option BQuick Check:
Squashing = combine commits [OK]
- Thinking squashing deletes commits permanently
- Confusing squashing with branching
- Believing squashing reverts commits
Solution
Step 1: Identify the command for interactive rebase
The command to start an interactive rebase isgit rebase -ifollowed by the commit range.Step 2: Confirm the correct syntax
git rebase -i HEAD~3opens the last 3 commits for editing, allowing squashing.Final Answer:
git rebase -i HEAD~3 -> Option CQuick Check:
Interactive rebase = git rebase -i [OK]
- Using git merge -i which does not exist
- Trying git commit --squash which is invalid
- Confusing reset with rebase for squashing
commit1: Add README commit2: Fix typo commit3: Update README formattingIf you run
git rebase -i HEAD~3 and squash commit2 and commit3 into commit1, what will the commit history show?Solution
Step 1: Understand squash behavior in interactive rebase
Squashing merges commits into one, combining their changes and commit messages.Step 2: Result of squashing commit2 and commit3 into commit1
The final commit will include all changes and combined commit messages from all three commits.Final Answer:
One commit combining messages from commit1, commit2, and commit3 -> Option AQuick Check:
Squash merges commits and messages [OK]
- Assuming only the first commit message remains
- Expecting commits to stay separate after squash
- Thinking squash deletes commit messages
git rebase -i HEAD~4 to squash commits but got a conflict error. What should you do next?Solution
Step 1: Understand conflict during rebase
A conflict means Git needs you to fix code differences manually before continuing.Step 2: Resolve conflicts and continue rebase
Fix the conflicts in files, then rungit rebase --continueto proceed with squashing.Final Answer:
Manually fix the conflicts, then run git rebase --continue -> Option AQuick Check:
Fix conflicts + git rebase --continue [OK]
- Aborting rebase without trying to fix conflicts
- Using git reset --hard which discards work
- Pushing incomplete changes to remote
Solution
Step 1: Understand effect of squashing on commit history
Squashing rewrites commit history, so the remote branch history differs from local.Step 2: Use force push safely
To update remote with rewritten history, usegit push --force-with-leaseto avoid overwriting others' work accidentally.Final Answer:
git push --force-with-lease origin main -> Option DQuick Check:
Force push safely after squash [OK]
- Using normal git push causing rejection
- Using --no-verify which skips hooks but not force push
- Pushing all branches unnecessarily
