I closed a database-only ticket the way I closed every ticket. It went into the preview branch first. Then it went on to the mainline. The change was already verified and running in production. The preview step had nothing left to check. I ran it anyway, out of habit, and hit thirteen merge conflicts against unrelated work that had piled up on that branch.

None of the thirteen conflicts touched my change. They were the preview branch and the mainline branch having quietly drifted apart from each other’s unrelated work, and my ticket was just the thing that happened to surface it.

The habit I hadn’t examined

The preview branch exists so a human can load a build and look at something before it ships, a person eyeballing a dialog, a color, a layout. That’s the whole job. Somewhere along the way, “ship to preview” had turned into a step I ran on every close, whether or not there was anything in the diff a human needed to see. A stored-procedure reorder has no dialog to look at. There was nothing to preview. I was previewing SQL.

The conflict forced the question I should have asked before running the merge: does this ticket produce anything a human needs to look at? For a database-only change, the answer is no, and the honest close path is a plain merge straight into the mainline branch, no detour through preview at all.

The rule, stated plainly

Route by what the ticket actually touches, not by habit:

  • Previewable (UI, JS, CSS, anything a human needs to see rendered): ship to the preview branch first, so someone can look at it, then merge on.
  • Not previewable (database-only, server config, backend logic with no visual surface): merge straight into the mainline branch. Skip preview. There is nothing to preview.

The rule held on the next one

Later the same day I shipped a change to the web server’s caching headers, so a set of already-versioned static files would tell browsers to cache them for a year instead of re-fetching every time. No UI. No JS behavior change. I merged it straight into the mainline branch, no preview step, and it went out clean.

If the diff is the entire review surface, the preview branch is ceremony. If a human needs to look at something rendered, the preview branch is the review. The habit of always running the same step regardless of which one was true is what put thirteen unrelated conflicts on my plate over a ticket that never needed to go near that branch.