Skip to main content

When and why Git Rebase is not recommended

· 5 min read
Serhii Hrekov
software engineer, creator, artist, programmer, projects founder

Rebasing is not recommended in two primary situations: when you are working on a public or shared branch and when the rebase operation would cause a significant loss of historical context.


1. Rebasing Public or Shared Branches

This is the most critical and widely cited rule in Git. You should never rebase a branch that has been pushed to a remote repository and pulled by other team members (3).

Why it's not recommended:

  • Divergent Histories: When you rebase, you are rewriting the commit history. The original commits on the branch are replaced with new ones. If other developers have already pulled the original commits, their local history will no longer match the remote history after your rebase.
  • Forced Merges and Conflicts: When a developer with the old history tries to sync with the new, rebased remote branch, Git cannot perform a simple fast-forward merge. Instead, they will be forced to merge the divergent histories, often resulting in confusing and difficult-to-resolve conflicts.
  • Broken Workflows: To get their work onto the rebased branch, they might be tempted to use git push --force (2). This can be dangerous and could overwrite other people's work, leading to a loss of commits and a very messy state.

Instead of rebasing a shared branch, the recommended practice is to use git merge. Merging preserves the original commit history and creates a new merge commit, which explicitly records the integration of the two branches. This is a much safer approach for collaborative work.

2. Rebasing When a Clean History is Not a Priority

While a clean, linear history is often desirable, there are times when the exact, chronological history of a project is more important than a tidy log.

Why it's not recommended:

  • Loss of Context: Rebasing can make it difficult to trace the original development of a feature or bug fix. For example, if you rebase a branch with multiple small commits onto main, you lose the context of when and why those commits were originally made relative to the main branch at that time.
  • Hiding Merge Points: Merging explicitly shows when two lines of development converged. Rebasing, by making the history linear, hides this information. This can be problematic in situations where you need to see exactly when and how a feature branch was integrated into the main branch.
  • Complex rebase -i Operations: Using interactive rebase (git rebase -i) to squash commits, reorder commits, or edit commit messages can be a powerful tool for cleaning up a local branch before a pull request. However, if you are not careful, these operations can lead to the accidental loss of commits or the introduction of new bugs (1). This is particularly risky for developers who are new to Git.

Summary of When to Avoid Rebasing

ScenarioRecommendationAlternative
You're on a shared branchDo not rebaseUse git merge to integrate changes from main
The exact history is criticalDo not rebaseUse git merge to preserve the original history and merge points
You are new to GitExercise cautionStick to merging until you are comfortable with the implications of rebasing and force-pushing.

By adhering to these guidelines, you can leverage the power of git rebase for local, private branches while avoiding the potential pitfalls that can disrupt team collaboration and lose valuable historical context.


Sources

  1. Git Rebasing Interactive
  2. Git Push
  3. The Golden Rule of Rebasing