Git 3.0 will default to SHA-256 and require Rust
Git 2.56-rc0 arrived on September 11, 2026, and the 3.0 release behind it switches new repositories to SHA-256, reftable and the main branch.
3 min read

By the numbers
- SHA-1 collision attacks the hash change cites: 2015, 2017 and 2020
- 3
- release candidate published on September 11, 2026
- 2.56
Git 2.56-rc0 was published on September 11, 2026, and the release after it is the one that breaks things. Git's own breaking-changes document lists what version 3.0 changes for new repositories. They will use SHA-256 hashes instead of SHA-1, store references in the reftable format, and name the first branch main. Building Git will also require Rust. Phoronix reported the release candidate and put Git 3.0 at around the end of 2026.
Each of those defaults only applies to repositories created after the change. Existing repositories keep working as they are.
The four defaults that change
| Default | Today | In Git 3.0 |
|---|---|---|
| Hash algorithm | SHA-1 | SHA-256 |
| Reference storage | files | reftable |
| First branch name | master | main |
safe.bareRepository | all | explicit |
The hash change is the one with a security argument behind it. Git's document cites three attacks on SHA-1 by name: SHAppening in 2015, SHAttered in 2017, and Shambles in 2020. A hash collision in a version control system means two different objects can claim the same identity.
Reftable replaces the old layout where each reference was a file on disk. Git's document gives two reasons: it behaves correctly on Windows and macOS file systems that ignore letter case, and it performs better on repositories with many references.
safe.bareRepository moving from all to explicit is a smaller change with a real attack behind it. The current default lets Git discover a bare repository anywhere in a directory tree, including one an attacker planted inside a checkout.
Rust becomes required
The Rust requirement arrives in steps rather than at once. Git's document describes the sequence: Rust support was auto-detected in Git 2.52, enabled by default in 2.55, and becomes mandatory in 3.0.
That places Git alongside other base-layer software taking the same step; Ubuntu is replacing GNU coreutils with Rust implementations in its next release. For anyone who builds Git from source on an unusual platform, a Rust toolchain is now a prerequisite to plan for, not an option.
Git 3.0 also removes features that have been deprecated for years, including git pack-redundant, git whatchanged, graft file support, and older remote storage mechanisms.
What 2.56 itself ships
The release notes for 2.56 are mostly performance and plumbing. Enumerating loose objects during git status drops from quadratic to O(n log n) complexity. Merge-base computation stops early where it can, which the notes describe as producing significant speedups.
There is one new command surface: git refs gains subcommands to create, delete, update, and rename references. The git status advice text now names the remote and branch in the git pull command it suggests when your branch and its upstream have diverged.
Phoronix notes 2.56 also adds diff patterns for Swift, covering attributes, modifiers, failable initializers, and generics, and hardens the ORT merge backend against corrupt trees. Underneath, the release continues removing global variables in favor of per-repository state, which is the groundwork for pluggable object database backends.
What this means for developers
The compatibility question is not whether your Git works, but whether your forge does. A SHA-256 repository must be understood by everything that touches it, including your hosting provider, your CI runners, and any tool that parses object identifiers. Test that path before you create a repository with the new default.
Check your own code for hard-coded assumptions about hash length. Forty hexadecimal characters is a number that has been baked into scripts, regular expressions, and database columns for twenty years. SHA-256 object names are sixty-four characters, and a varchar(40) will simply truncate them.
Reftable is worth adopting early if you carry repositories with thousands of branches or tags, since that is where the format pays off. The branch-name default matters least of all: most teams set it years ago, and a repository created after the change can still be renamed in one command.
Sources
- Git 2.56-rc0 Released With Updated Contribution Guidelines, Improvements For Swift - Phoronix
- Git 2.56 release notes - Git project
- Git BreakingChanges documentation - Git project
Related articles

Ubuntu 26.10 moves cp, mv and rm to Rust coreutils
Ubuntu 26.10 hands cp, mv and rm to Rust. A 113-issue audit held those three back from 26.04 LTS, and stable arrives October 15.

Rust warns maintainers about fake job video calls
Rust's security team says attackers are booking video calls with crate owners under fake job offers, then asking them to install a missing codec.

Rustls 0.23.45 fixes a TLS 1.3 flaw open since 2024
Versions 0.23.13 through 0.23.44 accepted TLS 1.3 handshake messages at the wrong encryption level, a bug introduced in September 2024.
The daily brief
Three to five stories a day, and what each one means for the people who build software. Free, no spam.