{"id":90238,"date":"2025-08-18T10:04:36","date_gmt":"2025-08-18T17:04:36","guid":{"rendered":"https:\/\/github.blog\/?p=90238"},"modified":"2025-08-20T13:46:09","modified_gmt":"2025-08-20T20:46:09","slug":"highlights-from-git-2-51","status":"publish","type":"post","link":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/","title":{"rendered":"Highlights from Git 2.51"},"content":{"rendered":"<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><p>The open source Git project <a href=\"https:\/\/lore.kernel.org\/git\/xmqqikikk1hr.fsf@gitster.g\/T\/\">just released Git 2.51<\/a> with features and bug fixes from over 91 contributors, 21 of them new. We last caught up with you on the latest in Git back <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-50\/\">when 2.50 was released<\/a>.<\/p>\n\n\n\n<p>To celebrate this most recent release, here is GitHub&rsquo;s look at some of the most interesting features and changes introduced since last time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cruft-free-multi-pack-indexes\">Cruft-free multi-pack indexes<\/h2>\n\n\n\n<p>Returning readers will have likely seen our coverage of <a href=\"https:\/\/git-scm.com\/docs\/cruft-packs\/2.37.0\">cruft packs<\/a>, <a href=\"https:\/\/git-scm.com\/docs\/multi-pack-index\/2.50.0\">multi-pack indexes<\/a> (MIDXs), and <a href=\"https:\/\/github.blog\/2015-09-22-counting-objects\/\">reachability bitmaps<\/a>. In case you&rsquo;re new around here or otherwise need a refresher, here&rsquo;s a brief overview:<\/p>\n\n\n\n<p>Git stores repository contents as &ldquo;<a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Git-Objects\">objects<\/a>&rdquo; (blobs, trees, commits), either individually (&ldquo;loose&rdquo; objects, e.g. <code>$GIT_DIR\/objects\/08\/10d6a05...<\/code>) or grouped into &ldquo;<a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Packfiles\">packfiles<\/a>&rdquo; (<code>$GIT_DIR\/objects\/pack<\/code>). Each pack has an <a href=\"https:\/\/git-scm.com\/docs\/gitformat-pack\/2.44.0#_version_2_pack_idx_files_support_packs_larger_than_4_gib_and\">index<\/a> (<code>*.idx<\/code>) that maps object hashes to offsets. With many packs, lookups slow down to <code>O(M*log(N))<\/code>, (where <code>M<\/code> is the number of packs in your repository, and <code>N<\/code> is the number of objects within a given pack).<\/p>\n\n\n\n<p id=\"return1\">A MIDX works like a pack index but covers the objects across multiple individual packfiles, reducing the lookup cost to <code>O(log(N))<\/code>, where <code>N<\/code> is the total number of objects in your repository. We <a href=\"https:\/\/github.blog\/engineering\/scaling-monorepo-maintenance\/\">use MIDXs at GitHub<\/a> to store the contents of your repository after splitting it into multiple packs. We also use MIDXs to store a collection of reachability bitmaps for some selection of commits to quickly determine which object(s) are reachable from a given commit<sup><a href=\"#ref1\">1<\/a><\/sup>.<\/p>\n\n\n\n<p><\/p><p>However, we store unreachable objects separately in what is known as a&nbsp;&ldquo;cruft pack&rdquo;. Cruft packs were meant to exclude unreachable objects from the MIDX, but we realized pretty quickly that doing so was impossible. The exact reasons are spelled out in <a href=\"https:\/\/github.com\/git\/git\/commit\/ddee3703b36e96056f11ddc4621707b6054bab48\">this commit<\/a>, but the gist is as follows: if a once-unreachable object (stored in a cruft pack) later becomes reachable from some bitmapped commit, but the only copy of that object is stored in a cruft pack outside of the MIDX, then that object has no bit position, making it impossible to write a reachability bitmap.<\/p><p>Git 2.51 introduces a change to how the non-cruft portion of your repository is packed. When generating a new pack, Git <a href=\"https:\/\/git-scm.com\/docs\/git-pack-objects\/2.49.0#Documentation\/git-pack-objects.txt---stdin-packs\">used to exclude any object<\/a> which appeared in at least one pack that would not be deleted during a repack operation, including cruft packs. In 2.51, Git now <a href=\"https:\/\/git-scm.com\/docs\/git-pack-objects\/2.51.0#Documentation\/git-pack-objects.txt---stdin-packsmode\">will store additional copies<\/a> of objects (and their ancestors) whose only other copy is within a cruft pack. Carrying this process out repeatedly guarantees that the set of non-cruft packs does not have any object which reaches some other object not stored within that set of packs. (In other words, the set of non-cruft packs is closed under reachability.)<\/p><p>As a result, Git 2.51 has <a href=\"https:\/\/git-scm.com\/docs\/git-pack-objects\/2.51.0#Documentation\/git-pack-objects.txt---stdin-packsltmodegt\">a new <code>repack.MIDXMustContainCruft<\/code> configuration<\/a> which uses the new repacking behavior described above to store cruft packs outside of the MIDX. Using this at GitHub has allowed us to write significantly smaller MIDXs, in a fraction of the time, and resulting in faster repository read performance overall. (In our primary monorepo, MIDXs shrunk by about 38%, we wrote them 35% faster, and improved read performance by around 5%.)<\/p><p>Give cruft-less MIDXs a try today using the new <code>repack.MIDXMustContainCruft<\/code> configuration option.<\/p><p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/a636d395ff0b0ccecb4569c0fc80f7c55f2e5f2e...5ee86c273bfc83fa432910a13c6ce28b74361896\">source<\/a>]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-smaller-packs-with-path-walk\">Smaller packs with path walk<\/h2>\n\n\n\n<p>In Git 2.49, we talked about <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-49\/#faster-packing-with-name-hash-v2\">Git&rsquo;s new &ldquo;name-hash v2&rdquo; feature<\/a>, which changed the way that Git selects pairs of objects to delta-compress against one another. The full details are covered in that post, but here&rsquo;s a quick gist. When preparing a packfile, Git computes a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Hash_function\">hash<\/a> of all objects based on their filepath. Those hashes are then used to sort the list of objects to be packed, and Git uses a sliding window to search between pairs of objects to identify good delta\/base candidates.<\/p>\n\n\n\n<p id=\"return2\">Prior to 2.49, Git used <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.48.0\/pack-objects.h#L191-L209\">a single hash function<\/a> based on the object&rsquo;s filepath, with a heavy bias towards the last 16 characters of the path. That hash function, dating back <a href=\"https:\/\/github.com\/git\/git\/commit\/ce0bd64299ae148ef61a63edcac635de41254cb5\">all the way to 2006<\/a>, works well in many circumstances, but can fall short when, say, unrelated blobs appear in paths whose final 16 characters are similar. Git 2.49 introduced a <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.49.0\/pack-objects.h#L211-L237\">new hash function<\/a> which takes more of the directory structure into account<sup><a href=\"#ref2\">2<\/a><\/sup>, resulting in <a href=\"https:\/\/github.com\/git\/git\/commit\/30696be71f64ca3764b1d334927da927d6d8df78\">significantly smaller packs<\/a> in some circumstances.<\/p>\n\n\n\n<p>Git 2.51 takes the spirit of that change and goes a step further by introducing a new way to collect objects when repacking, called &ldquo;path walk&rdquo;. Instead of walking objects in <a href=\"https:\/\/git-scm.com\/docs\/MyFirstObjectWalk#_changing_the_order\">revision order<\/a> with Git emitting objects with their corresponding path names along the way, the path walk approach emits all objects from a given path at the same time. This approach avoids the name-hash heuristic altogether and can look for deltas within groups of objects that are known to be at the same path.<\/p>\n\n\n\n<p><\/p><p>As a result, Git can generate packs using the path walk approach that are often significantly smaller than even those generated with the new name hash function described above. Its timings are competitive even with generating packs using the existing revision order traversal.<\/p><p>Try it out today by repacking with the new <code>--path-walk<\/code> command-line option.<\/p>\n\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/60f9bc3e30ad38678434b46389f9acb644f94189...c178b02e29f7e3d4033893af9fad8477c9b99be9\">source<\/a>]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-stash-interchange-format\">Stash interchange format<\/h2>\n\n\n\n<p>If you&rsquo;ve ever needed to switch to another branch, but wanted to save any uncommitted changes, you have likely used <code>git stash<\/code>. The <a href=\"https:\/\/git-scm.com\/docs\/git-stash\">stash<\/a> command stores the state of your working copy and index, and then restores your local copy to match whatever was in <code>HEAD<\/code> at the time you stashed.<\/p>\n\n\n\n<p id=\"return3\">If you&rsquo;ve ever wondered how Git actually stores a stash entry, then this section is for you. Whenever you push something onto your stash, Git creates three<sup><a href=\"#ref3\">3<\/a><\/sup> commits behind the scenes. There are two commits generated which capture the staged and unstaged changes. The staged changes represent whatever was in your index at the time of stashing, and the working directory changes represent everything you changed in your local copy but didn&rsquo;t add to the index. Finally, Git creates a third commit listing the other two as its parents, capturing the entire snapshot.<\/p>\n\n\n\n<p>Those internally generated commits are stored in the special <code>refs\/stash<\/code> ref, and multiple stash entries are managed with the <a href=\"https:\/\/git-scm.com\/docs\/git-reflog\">reflog<\/a>. They can be accessed with <code>git stash list<\/code>, and so on. Since there is only one stash entry in <code>refs\/stash<\/code> at a time, it&rsquo;s extremely cumbersome to migrate stash entries from one machine to another.<\/p>\n\n\n\n<p id=\"return4\">Git 2.51 introduces a variant of the internal stash representation that allows multiple stash entries to be represented as a sequence of commits. Instead of using the first two parents to store changes from the index and working copy, this new representation adds one more parent to refer to the previous stash entry. That results in stash entries that contain four<sup><a href=\"#ref4\">4<\/a><\/sup> parents, and can be treated like an ordinary log of commits.<\/p>\n\n\n\n<p>As a consequence of that, you can now export your stashes to a single reference, and then push or pull it like you would a normal branch or tag. Git 2.51 makes this easy by introducing two new sub-commands to git stash to import and export, respectively. You can now do something like:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>$ git stash export --to-ref refs\/stashes\/my-stash\n$ git push origin refs\/stashes\/my-stash<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"$ git stash export --to-ref refs\/stashes\/my-stash\n$ git push origin refs\/stashes\/my-stash\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>on one machine to push the contents of your stash to origin, and then:<\/p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>$ git fetch origin '+refs\/stashes\/*:refs\/stashes\/*'\n$ git stash import refs\/stashes\/my-stash<\/code><\/pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"$ git fetch origin '+refs\/stashes\/*:refs\/stashes\/*'\n$ git stash import refs\/stashes\/my-stash\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"><\/path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"><\/path><\/svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"><\/path><\/svg><\/clipboard-copy><\/div>\n\n\n<p>on another, preserving the contents of your stash between the two.<\/p>\n\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/a013680162522425ab74d12f1d0cd4df1a389383...bc303718cc288b54233b204ce88223a16fb38487\">source<\/a>]<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\" id=\"all-that\">All that&hellip;<\/h2>\n\n\n\n<p>Now that we&rsquo;ve covered some of the larger changes in more detail, let&rsquo;s take a quicker look at a selection of some other new features and updates in this release.<\/p>\n\n\n<ul class=\"wp-block-list\">\n\n\n<li>\n<p>\nIf you&rsquo;ve ever scripted around the object contents of your repository, you have no doubt encountered <code>git cat-file<\/code>, Git&rsquo;s dedicated tool to print the raw contents of a given object.<\/p><p><code>git cat-file<\/code> also has specialized <code>--batch<\/code> and <code>--batch-check<\/code> modes, which take a sequence of objects over stdin and print each object&rsquo;s information (and contents, in the case of <code>--batch<\/code>). For example, here&rsquo;s some basic information about the <code>README.md<\/code> file in Git&rsquo;s own repository.<\/p>\n\n<pre class=\"wp-block-code language-plaintext\"><code>$ echo HEAD:README.md | git.compile cat-file --batch-check\nd87bca1b8c3ebf3f32deb557ae9796ddc5b792ca blob 3662<\/code><\/pre>\n\n<p>Here, Git is telling us the object ID, type, and size for the object we specified, just as we expect. <code>cat-file<\/code> produces the same information for tree and commit objects. But what happens if we give it the path to a submodule? Prior to Git 2.51, <code>cat-file<\/code> would just print <code>missing<\/code>. But Git 2.51 improves this output, making <code>cat-file<\/code> more useful in a new variety of scripting scenarios:<\/p>\n\n<pre class=\"wp-block-code language-plaintext\"><code>[ pre-2.51 git ]\n$ echo HEAD:sha1collisiondetection | git cat-file --batch-check\nHEAD:sha1collisiondetection missing\n\n[ git 2.51 ]\n$ echo HEAD:sha1collisiondetection | git cat-file --batch-check 855827c583bc30645ba427885caa40c5b81764d2 submodule<\/code><\/pre>\n\n\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/5b124e7c16076ad4d34d93854f194a9bc3223bdd...b0b910e052b2c5a8036343c0475dbbb01add6be8\">source<\/a>]<\/p>\n<\/li>\n<li>\n<p>Back in our coverage of 2.28, we talked about Git&rsquo;s new <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-28\/#changed-path-bloom-filters\">changed-path Bloom feature<\/a>. If you aren&rsquo;t familiar with Bloom filters, or could use a refresher about how they&rsquo;re used in Git, then read on.<\/p>\n<p>A <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bloom_filter\">Bloom filter<\/a> is a probabilistic data structure that behaves like a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Set_(abstract_data_type)\">set<\/a>, with one difference. It can only tell you with 100% certainty whether an element is <em>not<\/em> in the set, but may have some false positives when indicating that an item is in the set.<\/p>\n<p>Git uses Bloom filters in its <a href=\"https:\/\/git-scm.com\/docs\/commit-graph\/2.43.0\">commit-graph<\/a> data structure to store a probabilistic set of which paths were modified by that commit relative to its first parent. That allows history traversals like <code>git log origin -- path\/to\/my\/file<\/code> to quickly skip over commits which are known not to modify that path (or any of its parents). However, because Git&rsquo;s full <a href=\"https:\/\/git-scm.com\/docs\/gitglossary\/2.51.0#def_pathspec\">pathspec syntax<\/a> is far more expressive than that, Bloom filters can&rsquo;t always optimize pathspec-scoped history traversals.<\/p>\n<p>Git 2.51 addresses part of that limitation by adding support for using multiple pathspec items, like <code>git log -- path\/to\/a path\/to\/b<\/code>, which previously could not make use of changed-path Bloom filters. At the time of writing, there is <a href=\"https:\/\/lore.kernel.org\/git\/20250807051243.96884-1-yldhome2d2@gmail.com\/\">ongoing discussion<\/a> about adding support for even more special cases.<\/p>\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/0e8243a355a69035dac269528b49dc8c9bc81f8a...2a6ce090f27016d68ee6952809d98fe88ce53522\">source<\/a>]<\/p>\n<\/li>\n<li id=\"return5\">\n<p>The modern equivalents of <code>git checkout<\/code>, known as <code>git switch<\/code> and <code>git restore<\/code> have been considered experimental since <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-23\/\">their introduction back in Git 2.23<\/a>. These commands delineate the many jobs that <code>git checkout<\/code> can perform into separate, more purpose-built commands. Six years later<sup><a href=\"#ref5\">5<\/a><\/sup>, these commands are no longer considered experimental, making their command-line interface stable and backwards compatible across future releases.<\/p>\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/fab596878c5bdac7ea0a95c4d2acd758442c9eaf...f609dc4f7a7cc8b57435696cac1cd0b056f9e8b9\">source<\/a>]<\/p>\n<\/li>\n<li id=\"return6\">\n<p>Even if you&rsquo;re a veteran Git user, it&rsquo;s not unlikely to encounter a new Git command (among the 144!<sup><a href=\"#ref6\">6<\/a><\/sup>)&nbsp; every once in a while. One such command you might not have heard of is <code>git whatchanged<\/code>, which behaves like its modern alternative <code>git log --raw<\/code>.<\/p>\n<p id=\"return7\">That command is now marked as deprecated with eventual plans to remove it in Git 3.0. As with other similar deprecations, you can still use this command behind the aptly-named <code>--i-still-use-this<\/code> flag<sup><a href=\"#ref7\">7<\/a><\/sup>.<\/p>\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/f0135a9047ca37d4d117dcf21f7e3e89fad85d00...e836757e14bf4fd617828d834d29e679e1f527c0\">source<\/a>]<\/p>\n<p><!-- \/wp:post-content --><\/p>\n<\/li>\n<li>\n<p>Speaking of Git 3.0, this release saw a few more entries added to <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.51.0\/Documentation\/BreakingChanges.adoc\">the <code>BreakingChanges<\/code> list<\/a>. First, Git&rsquo;s reftable backend (which we talked about extensively in <a href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-45\/#preliminary-reftable-support\">our coverage of Git 2.45<\/a>) will become the new default format in repositories created with Git 3.0, when it is eventually released. Git 3.0 will also use the SHA-256 hash function as its default hash when initializing new repositories.<\/p>\n<p>Though there is no official release date yet planned for Git 3.0, you can get a feel for some of the new defaults by building Git yourself with the <code>WITH_BREAKING_CHANGES<\/code> flag.<\/p>\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/50d9c342b401d8040cfc484774b38d12474bbe8e...793b14e1c833dd4ea0d85cdef53cc5ab38f7915e\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/90c0775e972847832ac8dfa6a14bc4c3abacd914...c79bb70a2e7d9158ec165ea16ad45371cd6e350d\">source<\/a>]<\/p>\n<\/li>\n<li>\n<p>Last but not least, a couple of updates on Git&rsquo;s internal development process. Git has historically prioritized wide platform compatibility, and, as a result, has taken a conservative approach to adopting features from newer C standards. Though Git has required a C99-compatible compiler since <a href=\"https:\/\/github.com\/git\/git\/commit\/7bc341e21b566c6685b7d993ca80459f9994be38\">near the end of 2021<\/a>, it has adopted features from that standard gradually, since some of the compilers Git targets only have partial support for the standard.<\/p>\n<p>One example is <a href=\"https:\/\/port70.net\/~nsz\/c\/c99\/n1256.html#7.16\">the <code>bool<\/code> keyword<\/a>, which became part of the C standard in C99. Here, the project began experimenting with the <code>bool<\/code> keyword back <a href=\"https:\/\/github.com\/git\/git\/commit\/8277dbe9872205be1588ddfbf01d5439847db1d9\">in late 2023<\/a>. This release declares that experiment a success and now permits the use of <code>bool<\/code> throughout its codebase. This release also began documenting C99 features that the project is <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.51.0\/Documentation\/CodingGuidelines#L304-L310\">using experimentally<\/a> along with C99 features that the project <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.51.0\/Documentation\/CodingGuidelines#L312-L322\">doesn&rsquo;t use<\/a>.<\/p>\n<p>Finally, this release saw an update to Git&rsquo;s guidelines on submitting patches, which have historically required contributions to be non-anonymous, and submitted under a contributor&rsquo;s legal name. Git now aligns more closely with <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/d4563201f33a022fc0353033d9dfeb1606a88330\">the Linux kernel&rsquo;s approach<\/a>, to permit submitting patches with an identity other than the contributor&rsquo;s legal name.<\/p>\n<p>[<a href=\"https:\/\/github.com\/git\/git\/compare\/97e14d99f6def189b0f786ac6207b792ca3197b1...f006e0323ee4b407bee3e0ff241d9d3f7a03b66a\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/8ad370f6683516954bc2f131c3474b0bd3fccc9c...9b2527caa4886dd9c7a1e4fb943f7c6484542c45\">source<\/a>, <a href=\"https:\/\/github.com\/git\/git\/compare\/8c7817c36129dea04e761d5284768edca06518c6...1f0fed312a40620b9f33f712d180a3c649e91e27\">source<\/a>]<\/p>\n<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"and-a-bag-of-chips\">&hellip;and a bag of chips<\/h2>\n<p>That&rsquo;s just a sample of changes from the latest release. For more, check out the release notes for <a href=\"https:\/\/github.com\/git\/git\/blob\/v2.51.0\/Documentation\/RelNotes\/2.51.0.adoc\">2.51<\/a>, or <a href=\"https:\/\/github.com\/git\/git\/tree\/v2.51.0\/Documentation\/RelNotes\">any previous version<\/a> in <a href=\"https:\/\/github.com\/git\/git\">the Git repository<\/a>.<\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n<p id=\"ref1\" class=\"has-small-font-size\"><sup>1<\/sup> For some bit position (corresponding to a single object in your repository,) a <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">1<\/code> means that object can be reached from that bitmap&rsquo;s associated commit, and a <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">0<\/code> means it is not reachable from that commit. There are also four type-level bitmaps (for blobs, trees, commits, and annotated tags); the <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">XOR<\/code> of those bitmaps is the all <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">1<\/code>s bitmap. For more details on multi-pack reachability bitmaps, check out our previous post on <a href=\"https:\/\/github.blog\/2021-04-29-scaling-monorepo-maintenance\/\"><em>Scaling monorepo maintenance<\/em><\/a>. <a href=\"#return1\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref2\" class=\"has-small-font-size\"><sup>2<\/sup>&nbsp;For the curious, each layer of the directory is hashed individually, then downshifted and <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">XOR<\/code> ed into the overall result. This results in a hash function which is more sensitive to the whole path structure, rather than just the final 16 characters. <a href=\"#return2\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref3\" class=\"has-small-font-size\"><sup>3<\/sup> Usually. Git will sometimes generate a fourth commit if you stashed untracked (new files that haven&rsquo;t yet been committed) or ignored files (that match one or more patterns in a <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">.gitignore<\/code>). <a href=\"#return3\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref4\" class=\"has-small-font-size\"><sup>4 <\/sup>Or five. <a href=\"#return4\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref5\" class=\"has-small-font-size\"><sup>5<\/sup> Almost to the day; Git 2.23 was released on August 16, 2019, and Git 2.51 was released on August 18, 2025. <a href=\"#return5\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref6\" class=\"has-small-font-size\"><sup>6<\/sup> It&rsquo;s true; <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">git --list-cmds=builtins | wc -l<\/code> outputs &ldquo;144&rdquo; with Git 2.51. <a href=\"#return6\">&#10548;&#65039;<\/a><\/p>\n<p id=\"ref7\" class=\"has-small-font-size\"><sup>7<\/sup> If you are somehow a diehard <code style=\"padding: 2px 4px;font-size: var(--wp--preset--font-size--small) !important\">git whatchanged<\/code> user, please let us know by sending a message to <a href=\"https:\/\/lore.kernel.org\/git\">the Git mailing list<\/a>. <a href=\"#return7\">&#10548;&#65039;<\/a><\/p><\/body><\/html>\n","protected":false},"excerpt":{"rendered":"<p>The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.<\/p>\n","protected":false},"author":1282,"featured_media":90239,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"yes","_gh_post_is_no_robots":"","_gh_post_is_featured":"yes","_gh_post_is_excluded":"","_gh_post_is_unlisted":"","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"","_gh_post_sq_img_id":"","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"","_gh_post_recirc_hide":"","_gh_post_recirc_col_1":"","_gh_post_recirc_col_2":"","_gh_post_recirc_col_3":"","_gh_post_recirc_col_4":"","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2},"_wpas_customize_per_network":false,"_links_to":"","_links_to_target":""},"categories":[3330,67],"tags":[132],"coauthors":[2189],"class_list":["post-90238","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-git","category-open-source","tag-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Highlights from Git 2.51 - The GitHub Blog<\/title>\n<meta name=\"description\" content=\"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Highlights from Git 2.51\" \/>\n<meta property=\"og:description\" content=\"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-18T17:04:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-20T20:46:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"839\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Taylor Blau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Taylor Blau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/\"},\"author\":{\"name\":\"Taylor Blau\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\"},\"headline\":\"Highlights from Git 2.51\",\"datePublished\":\"2025-08-18T17:04:36+00:00\",\"dateModified\":\"2025-08-20T20:46:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/\"},\"wordCount\":2165,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/git251.png?fit=1600%2C839\",\"keywords\":[\"Git\"],\"articleSection\":[\"Git\",\"Open Source\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/\",\"name\":\"Highlights from Git 2.51 - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/git251.png?fit=1600%2C839\",\"datePublished\":\"2025-08-18T17:04:36+00:00\",\"dateModified\":\"2025-08-20T20:46:09+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\"},\"description\":\"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/git251.png?fit=1600%2C839\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/git251.png?fit=1600%2C839\",\"width\":1600,\"height\":839},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/highlights-from-git-2-51\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Open Source\",\"item\":\"https:\\\/\\\/github.blog\\\/open-source\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Git\",\"item\":\"https:\\\/\\\/github.blog\\\/open-source\\\/git\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Highlights from Git 2.51\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/f2a5dc09d09f41c8c731679cc07da524\",\"name\":\"Taylor Blau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g2ce44289191883c54a58a554d8fc874a\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g\",\"caption\":\"Taylor Blau\"},\"description\":\"Taylor Blau is a Principal Software Engineer at GitHub where he works on Git.\",\"sameAs\":[\"https:\\\/\\\/ttaylorr.com\"],\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/ttaylorr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Highlights from Git 2.51 - The GitHub Blog","description":"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/","og_locale":"en_US","og_type":"article","og_title":"Highlights from Git 2.51","og_description":"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","og_url":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/","og_site_name":"The GitHub Blog","article_published_time":"2025-08-18T17:04:36+00:00","article_modified_time":"2025-08-20T20:46:09+00:00","og_image":[{"width":1600,"height":839,"url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png","type":"image\/png"}],"author":"Taylor Blau","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Taylor Blau","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#article","isPartOf":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/"},"author":{"name":"Taylor Blau","@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524"},"headline":"Highlights from Git 2.51","datePublished":"2025-08-18T17:04:36+00:00","dateModified":"2025-08-20T20:46:09+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/"},"wordCount":2165,"image":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png?fit=1600%2C839","keywords":["Git"],"articleSection":["Git","Open Source"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/","url":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/","name":"Highlights from Git 2.51 - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png?fit=1600%2C839","datePublished":"2025-08-18T17:04:36+00:00","dateModified":"2025-08-20T20:46:09+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524"},"description":"The open source Git project just released Git 2.51. Here is GitHub\u2019s look at some of the most interesting features and changes introduced since last time.","breadcrumb":{"@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png?fit=1600%2C839","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png?fit=1600%2C839","width":1600,"height":839},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/open-source\/git\/highlights-from-git-2-51\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Open Source","item":"https:\/\/github.blog\/open-source\/"},{"@type":"ListItem","position":3,"name":"Git","item":"https:\/\/github.blog\/open-source\/git\/"},{"@type":"ListItem","position":4,"name":"Highlights from Git 2.51"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/f2a5dc09d09f41c8c731679cc07da524","name":"Taylor Blau","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g2ce44289191883c54a58a554d8fc874a","url":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d5f3476f26b6f99cbb6b467e7ed7482f5762c8157bc73f569196e428bdcbea25?s=96&d=mm&r=g","caption":"Taylor Blau"},"description":"Taylor Blau is a Principal Software Engineer at GitHub where he works on Git.","sameAs":["https:\/\/ttaylorr.com"],"url":"https:\/\/github.blog\/author\/ttaylorr\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2025\/08\/git251.png?fit=1600%2C839","jetpack_shortlink":"https:\/\/wp.me\/pamS32-nts","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/90238","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/1282"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=90238"}],"version-history":[{"count":61,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/90238\/revisions"}],"predecessor-version":[{"id":90413,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/90238\/revisions\/90413"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/90239"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=90238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=90238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=90238"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=90238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}