Shower thought: Rebase and merge each have their strengths and weaknesses.
- Rebase results in a clean, linear history and allows the developer to resolve conflicts within the context of the commit being replayed.
Git bisects are also easierNevermind - apparently, git bisects work with merge-based workflows. - Merge never loses the old history, and commits the merging step as if it was a legitiment piece of work and effort that needs to be documented. Indeed, some merges can be non-trivial and resolving conflicts are often cases where bugs are introduced.
Then, why not have a different kind of "merge" command that merges each commit one by one, so that, if you only log the commits from the first parent of every merge commit, you'll get a very clean linear git history, and if you need to, you can traverse throught the merge commit's second parents to look back at the original commits. Here, the merge commits fully describe how the "old" commits map into the "new" commits.
Best of both worlds?