What is rebasing? The typical scenario goes something like this:
- You make changes and commit one or more changesets
- Meanwhile, other people have committed changes
- You pull down those changes
- But instead of merging, you rebase
- Which detaches your changes from history and reapplies them after the changes you pulled in
People like this because it keeps the history linear, avoiding "merge bubbles." And certainly linear history is much easier to understand.
But I have a problem with rebasing: it's lying. Understanding the context that changes were made in can be very useful, but rebasing rewrites the history, changing the parent pointers, and thereby changing the context. Lying about what the code looked like when you changed it.
That said, I still use rebase. But only when my changes are small or inconsequential and I know that the consequences of lying about what the code looked like when I made those changes wont matter at all. And in those cases, it's nice to reorder the history to be sequential because it does limit the conceptual overhead of understanding those kinds of changes. But in general, I prefer to see the merges simply because it accurately represents what really happened.