All posts
·11 min read· git· git-2-55· release-notes· rebase· hooks· performance

Git 2.55: the new features you will actually use

Git 2.55 landed on 29 June 2026. Most of it is under-the-hood speed, but a handful of user-facing changes are worth learning today: git history fixup, a safer git checkout -m, fsmonitor on Linux, parallel hooks, and remote-group push. Verified against the official release notes.

Git 2.55 was released on 29 June 2026, with work from over 100 contributors, 33 of them new. Like most Git releases, the bulk of it is invisible: faster packing, less memory in the diff engine, groundwork for the ongoing move to Rust. You will get all of that for free the moment you upgrade, with nothing to configure.

But a handful of changes are things you will type with your own hands. This post covers those — what they do, what they replace, and the exact commands — so you can decide which ones are worth adopting this week.

Everything below is checked against the official Git 2.55 release notes and the GitHub highlights post. Two of these features (git history and git format-rev) are new and still settling in, so treat their exact behaviour as subject to change and keep an eye on the docs.

1. git history fixup — amend an older commit in one step

This is the change most people will feel day to day.

You have a branch of, say, five commits. You are working on the top one when you notice a small mistake in commit three — a typo in a variable name, a missing file. You want that fix to land inside commit three, not as a sixth "fix typo" commit on top.

Until now, the clean way to do this took three steps:

git add -p                          # stage just the fix
git commit --fixup=<sha-of-commit-3>
git rebase -i --autosquash <sha-of-commit-3>~1

That works, but it is a lot of ceremony for a one-line fix, and the interactive rebase drops you into an editor you then have to save and close.

Git 2.55 collapses it into a single command:

git add -p                # stage just the fix
git history fixup <sha-of-commit-3>

git history fixup takes what you have staged, folds it into the commit you name, and replays every commit that came after it. By default it keeps that commit's original message and author. If the fix touches lines that later commits also changed and a conflict results, it stops and aborts cleanly rather than leaving you stranded in the middle of a rebase — so you are never worse off than when you started. (It needs a normal working tree; it will not run in a bare repository.)

If you already understand --fixup and --autosquash, this is the same idea with the ritual removed. If you do not, the mechanics behind it are worth learning first — that is exactly what interactive rebase does under the hood. Walk through it in the Interactive Rebase lesson, then let git history fixup be the shortcut.

2. git checkout -m no longer forces you to resolve conflicts on the spot

git checkout -m <branch> (also git switch -m) lets you carry your uncommitted local changes across to another branch, doing a three-way merge so your edits land on top of the branch you are moving to.

The rough edge was what happened when a file you had edited also differed between the two branches. Git would drop conflict markers into your working tree, and you had to resolve them right then, before you could do anything else. If you just wanted to hop over to check something, that was a poor trade.

In 2.55, when git checkout -m hits conflicting paths, Git saves your local changes as a stash entry instead of leaving a conflicted mess in place. You switch branches cleanly, and your work is waiting in the stash for you to apply and resolve when you are ready:

git checkout -m other-branch
# conflicting local changes are stashed, not forced on you
git stash list        # your changes are safe here

This is the same safety principle behind the stash-pop conflict behaviour: a conflict should never be able to lose your work.

3. fsmonitor now works on Linux

git status is slow on very large repositories because Git has to scan the whole working tree to see what changed. The fix has existed for years — a filesystem monitor daemon that Git can ask "what changed since last time?" instead of walking every file — but it only shipped for macOS and Windows.

Git 2.55 adds an fsmonitor daemon for Linux, built on inotify. Turn it on with:

git config core.fsmonitor true

After that, git status, git add, and anything else that checks the working tree get noticeably faster on a big repo, because Git consults the daemon rather than scanning.

Two honest caveats. fsmonitor needs one inotify watch per directory, so on a repository with tens of thousands of folders you may hit the kernel's default limit and need to raise fs.inotify.max_user_watches. And repositories on network mounts remain opt-in, because file-change notifications are not reliable there.

If you are unclear on why git status does what it does, the Status, Log & Diff lesson covers the model this speeds up.

4. Configured hooks can run in parallel

Git 2.54 introduced hooks defined through configuration (rather than only as scripts in .git/hooks). Git 2.55 lets independent ones run at the same time.

If your pre-commit stage runs, say, a linter and a separate test command, and neither depends on the other, you can let them run concurrently:

git config hook.<name>.parallel true
git config hook.jobs 4            # overall concurrency

Hooks that touch shared state — anything that reads or rewrites the index, or edits the commit message — stay serial on purpose, because running those in parallel would race. This is opt-in per hook, so nothing changes until you ask for it. If you have not set up hooks before, start with the Hooks & Automation lesson.

5. Push to several remotes at once

If you mirror a repository to more than one place — a primary, a backup, a public mirror — you can now group those remotes under one name and push to all of them in a single command:

git config remotes.publish "origin backup mirror"
git push publish main

One caveat worth knowing before you rely on it: --atomic is not supported for a remote group. Atomicity means "all refs update or none do," and Git cannot guarantee that across several separate network connections. Each remote in the group succeeds or fails on its own.

The smaller niceties

A few changes that will not change your life but are pleasant to discover:

Under the hood (nothing to do, just faster)

You do not have to touch any of this, but it is where most of the release actually went:

If you maintain a monorepo, these are the changes that quietly pay for the upgrade.

How to get it

Check what you are on:

git --version

If it is below 2.55.0, upgrade through your package manager (brew upgrade git, apt, winget, and so on) or from git-scm.com/downloads. The user-facing features above only exist once you are on 2.55.

What to actually try this week

Two things earn their keep immediately:

  1. git history fixup — if you ever amend older commits (and if you review your own history before pushing, you do), this removes the most tedious three-step ritual in everyday Git.
  2. git config core.fsmonitor true — if git status feels slow, this is close to free speed on Linux now, the same way it already was on macOS and Windows.

The rest is worth knowing so you recognise it when you need it. And if any of these commands assume knowledge you would rather have solid first — rebase, hooks, the status model — the lessons build exactly that, in a real terminal, before you reach for the shortcut.