Why I Still Rely On Tower For Git In The Era Of AI Coding

AI tools can write the CSS and scaffold components, but they do not own my Git history. I still rely on Tower because visual Git control is non-negotiable.
Why I Still Rely On Tower For Git In The Era Of AI Coding
Photo by Roman Synkevych / Unsplash

AI writes my code. Git still needs my eyes.

I use AI tools all day. Cursor, Copilot, Claude. They scaffold React components, write Tailwind classes, and even refactor chunks of my backend on command.

That part of my workflow is getting faster and more disposable. I can regenerate code in a few seconds. I can ask the model to rewrite the function with a different strategy. I do not get attached to any specific version of a file anymore.

My Git history is different. That is the part I treat like a production database. You do not randomly drop tables there. You do not casually let an assistant "handle it".

So while AI touches almost every line of code I ship, I still rely heavily on Tower for version control. Visual, clicky, opinionated Tower. And I do not plan to outsource that to an AI assistant any time soon.

Why I do not trust AI with Git

People keep asking me why I have a visual Git client open on a second screen all day when AI can run commands, explain diffs, and even propose commit messages.

The short answer: AI is great at generating code, and pretty bad at owning responsibility. Git history is pure responsibility.

There are three specific things I really care about when working with Git:

  • The exact shape of the branch graph.
  • The story my history tells when someone else reads it.
  • The risk surface when I rewrite history, force push, or cherry pick.

Those are not things I want a language model to guess about.

An AI assistant does not feel the panic of a broken main branch before a client demo. It cannot feel the pain of losing a day because a rebase went sideways on a shared branch. I have felt both more than once. That is why I want absolute visual command over my repo.

The AI part of my stack

For context, here is what I do let AI touch:

  • New components and utilities. I describe the behavior, it writes the skeleton.
  • Refactors. "Turn this into a hook", "split this into three functions".
  • Translations and copy tweaks.
  • Boilerplate CRUD endpoints and forms.
  • Debugging weird errors and race conditions.

Cursor sits right inside my editor. It can run tests, read my repo, suggest changes, and patch files directly. That is great. I do not want to manually write every CSS utility class anymore. I do not want to remember every Drizzle ORM edge case.

But when I accept those AI patches, I want to see exactly what changed, how it lines up with previous commits, and how it lands in the branch structure. That is where Tower steps in.

Why I still want a full visual Git graph

Most Git GUIs sell themselves as "easy Git for beginners". I think that pitch undersells the real value.

I use Tower as a power user tool. Not as training wheels for Git. My terminal is open next to it, and I am perfectly fine with a long command if it is faster.

What I actually want is continuous situational awareness. A live radar for the repo. A graph I can trust at a glance.

This is what Tower gives me that neither AI, nor plain CLI, really match for my brain.

Reading history like a story, not a log

On any project bigger than a weekend toy, the Git history turns into a narrative. You can either write that narrative deliberately, or you let Git sludge accumulate until nobody wants to read it.

I like to rewrite history before it hits main. I squash, reorder, reword, and group commits into something that reads like a series of decisions instead of every micro experiment I tried at 1:12 AM.

In Tower, this becomes a very physical activity. Drag a commit. Drop it somewhere else. Select a range, squash them into one, reword the message, and immediately see how that affects the branch structure.

Can I do it via CLI with interactive rebase? Sure. I used to. I still do on some machines. But Tower makes this visual editing of the story much more concrete, and I find that I make better decisions when the graph is visible and clickable, not buried in a temporary file inside my terminal.

AI can suggest a nice-sounding commit message. It cannot look at the graph and say, "This feature branch is telling a messy story, maybe rebase it onto that refactor branch you did last week." That part needs a human eye and a mental model of the project.

Dealing with messy merges and real conflict

The days that really prove the value of Tower are the bad ones. The conflict heavy ones. The ones where three feature branches all touched the same endpoint and the client just moved the deadline forward.

AI is decent at resolving blind conflicts. It will look at both sides, generate a new version, and explain what it did. That is fine for small stuff.

Where it falls apart is context and intent. Maybe both sides are technically correct, but one belongs to an experiment that I already abandoned. Maybe the "newer" change is actually the one I want to throw away, because it came from a rushed hotfix on staging.

In Tower, I can see exactly which branch brought in which commits. I can click through the related history. I can see that this conflict actually started three merges ago when someone squashed a half baked feature into main.

Then I can decide whether I want to rebase, revert, cherry pick, or do something uglier.

Could AI help explain the conflict diff? Absolutely. I still like to ask it, "What changed between these two versions of the file?" in the editor. But the resolution strategy, the choice of which path to keep, and how to keep history readable, that is something I decide with a visual model of the repo in front of me.

Rewriting history without fear

I am a fan of rewriting local history before it leaves my machine. Dirty branches stress me out. I want clean feature branches that tell a coherent story when they hit origin.

Rebases, interactive editing, fixups, squashes, force pushes. All of those can be lethal weapons if you point them at the wrong branch, especially on shared repos.

When I open Tower before a heavy rewrite, it is like taking a breath and turning the lights on. I see:

  • Exactly which commits are only local.
  • Which remote branches track what.
  • Which tags and releases are anchored where.
  • How far ahead and behind my branch is compared to origin.

From there, I can drag and drop to create new branches, stash experimental stuff, and run history edits with a clear view of the blast radius.

Yes, I could script this in CLI and ask AI to write me the perfect interactive rebase command. I just do not want to. I already know how to use Git. My bottleneck is not syntax. It is making the right choice, fast, without frying my brain on mental bookkeeping.

Tower removes the bookkeeping. I keep the responsibility.

How this looks in my actual day-to-day workflow

Here is how this all plays out on a normal day building a web experience from scratch.

I start in the editor. I describe the feature in plain language to Cursor. Something like:

"Create a responsive hero section for the homepage, using Tailwind, with support for dark mode and a variant for campaign launches."

Cursor generates a first pass. I tweak the styling, maybe ask it to adjust the layout for smaller breakpoints. After a few rounds, I am happy enough to commit.

Before I commit, I switch to Tower. I stage changes selectively, not all at once. This is important. AI is sloppy about how many things it touches. It will casually reformat half a file just to adjust one function. I am not letting that entire therapy session land in a single commit.

In Tower, the visual file list makes it obvious where AI touched more than I intended. I can stage specific hunks, throw away unrelated changes, and keep the commit focused. That habit alone has saved me countless headaches later when debugging regressions.

Then I write the commit message myself. Sometimes I let AI suggest options, but I usually strip them down. I prefer blunt messages that my future self will actually decode at 2 AM.

When the feature is larger, I will work in a feature branch for a few days. I run a rebase pass in Tower before opening a merge request. I squash noisy exploratory commits, reword vague messages, and make sure the branch graph is not a spiderweb.

Someone else reviews it. We merge. The graph stays readable. Next feature.

Visual diffing keeps AI honest

Another subtle benefit of Tower in this AI heavy workflow is trust. Not trust in the AI. Trust in what actually went into the repo.

AI models love to change more than you asked for. They tweak imports, reorder props, reorder functions, and sometimes silently change logic under a pile of formatting tweaks.

Diffing that in a terminal is technically possible. But on a large change, my eyes glaze over. I scroll too fast. I miss details.

In Tower, I can step through file by file, hunk by hunk. I can collapse noise. I can view history for a specific file and remind myself what the last intentional behavior was.

This becomes crucial when AI confidently "fixes" a bug and actually introduces a new one. Visual diffs let me track where it went rogue. Then I can either fix the patch or throw it out entirely.

I treat AI generated code the same way I treat a junior developer's first draft. I trust nothing until I have seen the diff.

Why not just stay in the terminal?

People who live in the CLI sometimes react defensively to visual clients. There is this idea that real developers use the terminal and everyone else needs training wheels.

I think this is outdated. My terminal is not going anywhere. I run plenty of Git commands directly there. But I do not treat tools like Tower as a crutch. They are more like specialized surgical instruments.

I could technically stitch a wound with a pocket knife. That does not mean the surgeon's toolkit is for weak hands.

When a tool gives my brain a clearer model of complex state, I use it. Tower does that for Git. It helps me keep a clean, intentional history while AI thrashes files in the editor like a hyperactive intern.

Where AI actually helps with Git

I am not anti AI for Git entirely. I just keep it in the right lane.

Here is where it actually helps:

  • Explaining obscure Git commands or flags.
  • Drafting initial commit messages, which I then trim.
  • Explaining git reflog output when something went really wrong.
  • Coaching someone new through a rebase workflow step by step.

AI is a decent teacher and explainer. It is not the pilot.

I will happily ask it to remind me of the exact sequence to recover a branch after a bad reset. Then I execute those steps in Tower or the terminal myself, while staring right at the graph like a hawk.

Version control is not the place to relax

The more AI speeds up the coding side, the more I find myself tightening up around version control. It is the last line of defense between "just regenerate it" and permanent chaos.

Code is cheap now. History is not. A good Git history is a high resolution record of why your system looks the way it does. It is a map for future refactors, investigations, and onboarding.

I want that map to be intentional, visual, and under my direct control. Tower is the tool that still gives me that control without extra cognitive tax.

AI can write my CSS. It can scaffold APIs. It can even propose how to split a monolith. But when I hit commit, when I rewrite a feature branch, when I decide how the next person will read what happened here, that is me, staring at a graph in Tower, hand on the wheel.

Subscribe to my newsletter

Subscribe to my newsletter to get the latest updates and news

Member discussion