When to Use Git Rebase vs Merge: Avoid Losing Code
This article explains the core differences between git rebase and git merge, illustrates how each rewrites or preserves commit history with concrete command examples, outlines safe usage scenarios, and provides practical tips to prevent code loss during collaborative development.
Imagine you are developing a new feature on a feature branch while a teammate fixes an urgent bug on main. The commit history might look like:
main: A --- B --- C (Bug Fix)
\
feature: D --- E (Your New Feature)If you run git rebase main on the feature branch:
git checkout feature
git rebase mainThe history is rewritten to a linear form, but if the feature branch has not fetched the latest changes or you discard conflicts, pushing can overwrite remote history and erase a colleague’s code.
True Differences Between Rebase and Merge
a. git merge – Full history, simple and safe
git mergecreates a new merge commit without altering existing commits, preserving the complete record of all branches. It is ideal for collaborative work where the full commit trail is needed.
git checkout feature
git merge mainResulting graph:
A --- B --- C ------ M (Merge Commit)
\ /
D --- ECharacteristics:
Commit history may contain many branches but remains safe.
Conflicts are resolved only once during the merge.
b. git rebase – Clean history, but it rewrites history
git rebase“moves” the current branch’s commits and reapplies them on top of the target branch’s latest commit, generating new commit IDs even if the content is unchanged.
It is best for cleaning up local branch history and should not be used casually on public branches.
git checkout feature
git rebase mainResulting graph: A --- B --- C --- D --- E Characteristics:
The history becomes a straight, tidy line.
Rewriting history on a branch that has been pushed can cause conflicts or loss of others’ work.
Safe Usage Scenarios
Developing on a local branch that has not been pushed – rebase to clean up before merging.
Pulling remote updates while keeping history clean – git pull --rebase to avoid unnecessary merge commits.
Working on a branch that has been pushed and is used by others – merge to avoid rewriting history.
Merging into the main branch in large teams – merge to retain a traceable history.
Personal projects or short‑lived feature branches – rebase for a tidy commit log.
How to Prevent Code Loss When Rebasing
Never rebase public branches such as main or dev.
Before rebasing, ensure you have the latest remote code:
git fetch origin
git rebase origin/mainDuring conflict resolution, carefully review all changes to avoid overwriting teammates’ commits.
If a rebase fails or you make a mistake, abort with: git rebase --abort Check differences before pushing:
git log --oneline --graph --decorate
git diffSummary
git mergeadds a new record to the commit history without altering existing records, making it safe and reliable. git rebase rewrites the commit history, producing a cleaner log but risking loss if used incorrectly.
In team collaboration, a simple rule works well: use merge on public branches and rebase on local branches to avoid most accidents.
Git is a forgiving tool, but operations that rewrite history must be used with understanding to keep code safe.
Code Mala Tang
Read source code together, write articles together, and enjoy spicy hot pot together.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
