Dev.to · 5 min read

Clean Git History Is a Professional Courtesy: Interactive Rebase wins

Clean Git History Is a Professional Courtesy: Interactive Rebase wins

Until your branch is merged, your history is yours. After that, it belongs to the team (and company too). As developers, we spend much more time reading code than writing it. Yet we often neglect the readability of our Git history. I’ve been writing software over the last 15 years, I’ve worked with many teams, countries, repositories, and review cultures. And I’ve met only one company where cleaning up Git history with interactive rebase was not just tolerated, but welcomed and actively supported. That experience shaped my view. A clean Git log is not vanity. It’s a professional courtesy to everyone who will handle the code after you. Local history is for you. Shared history is for the team. While a feature branch is open and unmerged, it is your private sandbox. You should commit often. Experiment. Break things. Save your progress with messages like wip, fix, try again, forgot file. That’s completely fine. But before you open a Pull Request, you have a responsibility to clean up your mess. And before you merge code, you have to check count of commits. This is where git rebase -i — interactive rebase — shines. The rule is simple: Rebase before merge. Never rewrite shared history after merge. Once your branch lands in main, it becomes part of the team’s history and company value asset. But until then, you can — and often should — shape it into something readable. Transform your mess into the value before closing the branch. You are paid not for being messy. Good naming at every stage of history, clear variable names, meaningful commits, and a clean history are always indicators of a healthy developer. They show that the developer is a mindful person — not someone in a hurry. Every small piece of it reflects a company’s culture — the way the business actually works. Why I rebase before merging A feature branch should ideally contain a small number of atomic, meaningful commits. Not twenty-five fragments of your debugging session and "code style fix" after that. Interactive rebase lets you: Squash noisy commits into one logical change. Reword vague messages into clear explanations. Drop accidental commits, secrets, or debug code. Reorder commits so the story makes sense. Edit commits that were almost right. This matters for several reasons. 1. Code reviews become easier A reviewer should not have to mentally diff ten commits named fix, fix again, and please work. They should see a clean sequence of intentional changes. 2. git bisect remains useful If every commit in your history is supposed to build and work, git bisect can find the exact commit that introduced a bug. WIP commits break that assumption. 3. Reverting is simpler It’s much easier to revert one well-defined feature commit than to untangle fifteen messy ones. 4. The repository tells a story A clean history explains why a change was made, not just what was typed. That story is valuable months or years later. A simple interactive rebase workflow Let’s say you have five commits on your branch and you want to clean them up before opening a PR. git rebase -i HEAD~5 Or, if you want to rebase onto the latest main: git fetch origin git rebase -i origin/main Your editor will open with something like this: pick 1a2b3c4 Add login form pick 5d6e7f8 fix validation pick 9a0b1c2 forgot to remove console.log pick 3d4e5f6 Add tests for login pick 7g8h9i0 fix typo Now you can rewrite it: pick 1a2b3c4 Add login form squash 5d6e7f8 fix validation squash 9a0b1c2 forgot to remove console.log reword 3d4e5f6 Add tests for login drop 7g8h9i0 fix typo Save, close, and Git will guide you through the rest. If you’ve already pushed the branch, you’ll need to force-push. Use the safer option: git push --force-with-lease --force-with-lease checks that no one else has pushed to the branch since your last fetch. It’s not magic, but it’s much safer than --force. And again: never rebase main, develop, or any branch that other people are building on. Common objections “But I want to keep the honest history.” Keep the honest history in your local branch. The shared history should be useful. Honesty is not the same as noise. “What if I break something?” Rebase is not destructive if you use it carefully. Git keeps reflog. You can recover. But yes, coordinate with your team if the branch is shared. “Isn’t this just extra work?” It takes two minutes before a PR. It saves hours for reviewers, debuggers, and future maintainers. The culture matters Tools are only half the story. A team has to support this practice. In my 15 years, I’ve seen only one company where interactive rebase was genuinely welcomed and supported. It wasn’t just allowed — it was part of the engineering culture. Reviewers expected a clean history. Developers helped each other learn how to achieve it. That made a difference. The Git log was readable. Reviews were faster. Debugging was easier. The repository felt professional. I was able to put together a report for the business just by reading the clean Git story of each developer. I wish more companies treated it that way.

This is a summary aggregated from Dev.to. Read the complete article on the original site:

Read full article at Dev.to

More Programming & Dev News