Tower's Undo Button: What Cmd+Z Actually Buys a Team Adopting a Git GUI
Tower's Cmd+Z undo doesn't add safety Git lacks — it surfaces reflog-based recovery as a keystroke. Here's what that buys a team, where it stops working, and how to verify coverage yourself.
22 Nov 2025, 18:10 UTC

Every team has a version of this story: someone deletes a local branch with unmerged work on it, or rebases onto the wrong commit, and the next twenty minutes are spent in git reflog trying to reconstruct what existed ten minutes ago. The work is almost never truly lost — Git keeps dangling commits around for weeks — but the recovery path is awkward enough that people treat whole categories of Git operations as dangerous.
Tower, the commercial Git client for macOS and Windows, makes an interesting engineering bet here: a system-wide undo (Cmd+Z / Ctrl+Z) that can reverse many operations performed inside the app, including commits, branch deletions, rebases, and discarding changes. This post looks at what that feature actually is, where it stops working, and whether it should factor into a decision to standardize a team on a GUI client.
Undo isn't magic — it's reflog with a button
Tower doesn't add a safety layer Git lacks. Git already retains history through the reflog (a local log of where HEAD and branch refs have pointed) and through dangling objects that survive until garbage collection. Recovery from the command line is possible; it's just manual and easy to get wrong under stress.
What Tower contributes is surfacing those recovery paths as a single keystroke. The engineering decision isn't "make Git safer" — it's "make the safe path the default path." That distinction matters for how you evaluate it: you're not buying new capability, you're buying a lower cost of mistakes.
A worked example: the deleted feature branch
Say a developer finishes a feature branch, believes it's merged, and deletes it — then realizes two commits never made it anywhere. In Tower, the recovery is: press Cmd+Z. The branch is restored pointing at its previous tip.
The CLI equivalent, run in the repository from any shell with no special permissions:
# Find the commit the branch pointed at before deletion
git reflog
# Look for the line where you last committed on that branch, e.g.:
# a1b2c3d HEAD@{4}: commit: add retry logic to importer
# Recreate the branch at that commit
git branch feature/importer-retry a1b2c3dCheck the result with git log feature/importer-retry --oneline -5 and confirm the expected commits are there. The risk in the CLI version is picking the wrong reflog entry — entries are chronological and interleaved across branches, so read the action descriptions carefully rather than grabbing the most recent SHA.
Both paths work. The difference is that one requires knowing reflog exists and staying calm enough to use it correctly, and the other requires knowing where the Z key is. For a mixed-experience team, that gap is where support tickets come from.
The side effect: cheaper mistakes change behavior
The more interesting consequence is behavioral. When rebasing, amending, and discarding hunks feel reversible, people actually do them. Teams that treat history surgery as high-stakes tend to accumulate messy commit sequences because nobody wants to risk cleaning them up. A client with credible undo turns "destructive" operations into low-stakes experiments, which is a quiet but real argument for interactive rebasing and amend-heavy workflows.
This is the strongest version of the case for a GUI: not that it replaces Git knowledge, but that it changes the risk calculus enough to unlock practices the team already agreed were good.
Where undo stops working
The limitations matter as much as the feature:
- It only covers Tower. Operations done in a terminal, another tool, or an IDE's built-in Git integration are outside Tower's undo scope. If your team mixes clients — and most do — coverage is partial by definition.
- Remote history is out of reach. Once commits are pushed and pulled by teammates, no client-side undo retracts them cleanly. A force-push that overwrites shared history is irreversible from any GUI; recovery becomes a coordination problem, not a keystroke.
- Scope varies by version. Exactly which operations are undoable has changed across Tower releases. Verify against the installed version's release notes or in-app help before promising your team specific coverage.
The practical decision
If you're evaluating Tower for a team, treat undo as a support-burden reducer, not a safety net. It will genuinely save time for less experienced members who would otherwise escalate branch mishaps. But pair it with a thirty-minute session on git reflog and git reset basics, because recovery skills need to transfer to places the GUI isn't: CI agents, servers, a colleague's machine during pairing.
Concretely: trial Tower, delete a test branch and make a commit, undo both, then do the same operations from the terminal and confirm Tower can't undo those. That fifteen-minute exercise tells you more about the feature's real coverage than any marketing page — and it doubles as the training session your team needed anyway.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.