Git - v2.43.0

Backward Compatibility Notes

  • The "--rfc" option of "git format-patch" used to be a valid way to
    override an earlier "--subject-prefix=" on the command
    line and replace it with "[RFC PATCH]", but from this release, it
    merely prefixes the string "RFC " in front of the given subject
    prefix. If you are negatively affected by this change, please use
    "--subject-prefix=PATCH --rfc" as a replacement.

  • In Git 2.42, "git rev-list --stdin" learned to take non-revisions
    (like "--not") from the standard input, but the way such a "--not" was
    handled was quite confusing, which has been rethought. The updated
    rule is that "--not" given from the command line only affects revs
    given from the command line that comes but not revs read from the
    standard input, and "--not" read from the standard input affects
    revs given from the standard input and not revs given from the
    command line.

UI, Workflows & Features

  • A message written in olden time prevented a branch from getting
    checked out, saying it is already checked out elsewhere. But these
    days, we treat a branch that is being bisected or rebased just like
    a branch that is checked out and protect it from getting modified
    with the same codepath. The message has been rephrased to say that
    the branch is "in use" to avoid confusion.

  • Hourly and other schedules of "git maintenance" jobs are randomly
    distributed now.

  • "git cmd -h" learned to signal which options can be negated by
    listing such options like "--[no-]opt".

  • The way authentication related data other than passwords (e.g.,
    oauth token and password expiration data) are stored in libsecret
    keyrings has been rethought.

  • Update the libsecret and wincred credential helpers to correctly
    match which credential to erase; they erased the wrong entry in
    some cases.

  • Git GUI updates.

  • "git format-patch" learned a new "--description-file" option that
    lets cover letter description to be fed; this can be used on
    detached HEAD where there is no branch description available, and
    also can override the branch description if there is one.

  • Use of the "--max-pack-size" option to allow multiple packfiles to
    be created is now supported even when we are sending unreachable
    objects to cruft packs.

  • "git format-patch --rfc --subject-prefix=" used to ignore the
    "--subject-prefix" option and used "[RFC PATCH]"; now we will add
    "RFC" prefix to whatever subject prefix is specified.

  • "git log --format" has been taught the %(decorate) placeholder for
    further customization over what the "--decorate" option offers.

  • The default log message created by "git revert", when reverting a
    commit that records a revert, has been tweaked, to encourage people
    to describe complex "revert of revert of revert" situations better in
    their own words.

  • The command-line completion support (in contrib/) learned to
    complete "git commit --trailer=" for possible trailer keys.

  • "git update-index" learned the "--show-index-version" option to
    inspect the index format version used by the on-disk index file.

  • "git diff" learned the "diff.statNameWidth" configuration variable,
    to give the default width for the name part in the "--stat" output.

  • "git range-diff --notes=foo" compared "log --notes=foo --notes" of
    the two ranges, instead of using just the specified notes tree,
    which has been corrected to use only the specified notes tree.

  • The command line completion script (in contrib/) can be told to
    complete aliases by including ": git ;" in the alias to tell
    it that the alias should be completed in a similar way to how "git
    " is completed. The parsing code for the alias has been
    loosened to allow ';' without an extra space before it.

  • "git for-each-ref" and friends learned to apply mailmap to
    authorname and other fields in a more flexible way than using
    separate placeholder letters like %a[eElL] every time we want to
    come up with small variants.

  • "git repack" machinery learned to pay attention to the "--filter="

  • "git repack" learned the "--max-cruft-size" option to prevent cruft
    packs from growing without bounds.

  • "git merge-tree" learned to take strategy backend specific options
    via the "-X" option, like "git merge" does.

  • "git log" and friends learned the "--dd" option that is a
    short-hand for "--diff-merges=first-parent -p".

  • The attribute subsystem learned to honor the "attr.tree"
    configuration variable that specifies which tree to read the
    .gitattributes files from.

  • "git merge-file" learns a mode to read three variants of the
    contents to be merged from blob objects.

Performance, Internal Implementation, Development Support etc.

  • "git check-attr" has been taught to work better with sparse-index.

  • It may be tempting to leave the help text NULL for a command line
    option that is either hidden or too obvious, but "git subcmd -h"
    and "git subcmd --help-all" would have segfaulted if done so. Now
    the help text is truly optional.

  • Tests that are known to pass with LSan are now marked as such.

  • Flaky "git p4" tests, as well as "git svn" tests, are now skipped
    in the (rather expensive) sanitizer CI job.

  • Tests with LSan from time to time seem to emit harmless messages
    that make our tests unnecessarily flaky; we work around it by
    filtering the uninteresting output.

  • Unused parameters to functions are marked as such, and/or removed,
    in order to bring us closer to "-Wunused-parameter" clean.

  • The code to keep track of existing packs in the repository while
    repacking has been refactored.

  • The "streaming" interface used for bulk-checkin codepath has been
    narrowed to take only blob objects for now, with no real loss of

  • GitHub CI workflow has learned to trigger Coverity check.

  • Test coverage for trailers has been improved.

  • The code to iterate over loose references has been optimized to
    reduce the number of lstat() system calls.

  • The codepaths that read "chunk" formatted files have been corrected
    to pay attention to the chunk size and notice broken files.

  • Replace macos-12 used at GitHub CI with macos-13.
    (merge 682a868f67 js/ci-use-macos-13 later to maint).

Fixes since v2.42

  • Overly long label names used in the sequencer machinery are now
    chopped to fit under filesystem limitation.

  • Scalar updates.

  • Tweak GitHub Actions CI so that pushing the same commit to multiple
    branch tips at the same time will not waste building and testing
    the same thing twice.

  • The commit-graph verification code that detects a mixture of zero and
    non-zero generation numbers has been updated.

  • "git diff -w --exit-code" with various options did not work
    correctly, which has been corrected.

  • The "transfer.unpackLimit" configuration variable ought to be used
    as a fallback, but overrode the more specific "fetch.unpackLimit"
    and "receive.unpackLimit" configuration variables by mistake, which
    has been corrected.

  • The use of API between two calls to require_clean_work_tree() from
    the sequencer code has been cleaned up for consistency.

  • "git diff --no-such-option" and other corner cases around the exit
    status of the "diff" command have been corrected.

  • "git for-each-ref --sort='contents:size'" sorted the refs according
    to size numerically, giving a ref that points at a blob twelve-byte
    (12) long before showing a blob hundred-byte (100) long, which has
    been corrected.

  • We now limit the depth of the tree objects and maximum length of
    pathnames recorded in tree objects.
    (merge 4d5693ba05 jk/tree-name-and-depth-limit later to maint).

  • Various fixes to the behavior of "rebase -i", when the command got
    interrupted by conflicting changes, have been made.

  • References from a description of the --patch option in various
    manual pages have been simplified and improved.

  • "git grep -e A --no-or -e B" is accepted, even though the negation
    of the "--or" option did not mean anything, which has been tightened.

  • The completion script (in contrib/) has been taught to treat the
    "-t" option to "git checkout" and "git switch" just like the
    "--track" option, to complete remote-tracking branches.

  • "git diff --no-index -R <(one) <(two)" did not work correctly,
    which has been corrected.

  • "git maintenance" timers' implementation has been updated, based on
    systemd timers, to work with WSL.

  • "git diff --cached" codepath did not fill the necessary stat
    information for a file when fsmonitor knows it is clean and ended
    up behaving as if it were not clean, which has been corrected.

  • How " = : git cmd ; aliased-command-string" should be
    spelled with necessary whitespace around punctuation marks to work
    has been more clearly documented (but this will be moot with newer
    versions of Git where the parsing rules have been improved).

  • HTTP Header redaction code has been adjusted for a newer version of
    cURL library that shows its traces differently from earlier

  • An error message given by "git send-email", when given a malformed
    address, did not show the offending address, which has been corrected.

  • UBSan options were not propagated through the test framework to git
    run via the httpd, unlike ASan options, which has been corrected.

  • "checkout --merge -- path" and "update-index --unresolve path" did
    not resurrect conflicted state that was resolved to remove path,
    but now they do.
    (merge 5bdedac3c7 jc/unresolve-removal later to maint).

  • The display width table for unicode characters has been updated for
    Unicode 15.1
    (merge 872976c37e bb/unicode-width-table-15 later to maint).

  • Update mailmap entry for Derrick.
    (merge 6e5457d8c7 ds/mailmap-entry-update later to maint).

  • In the ".gitmodules" files, submodules are keyed by their names,
    and the path to the submodule whose name is $name is specified by
    the submodule.$name.path variable. There were a few codepaths that
    mixed the name and path up when consulting the submodule database,
    which have been corrected. It took long for these bugs to be found
    as the name of a submodule initially is the same as its path, and
    the problem does not surface until it is moved to a different path,
    which apparently happens very rarely.

  • "git diff --merge-base X other args..." insisted that X must be a
    commit and errored out when given an annotated tag that peels to a
    commit, but we only need it to be a committish. This has been
    (merge 4adceb5a29 ar/diff-index-merge-base-fix later to maint).

  • "git merge-tree" used to segfault when the "--attr-source"
    option is used, which has been corrected.
    (merge e95bafc52f jc/merge-ort-attr-index-fix later to maint).

  • Unlike "git log --pretty=%D", "git log --pretty="%(decorate)" did
    not auto-initialize the decoration subsystem, which has been

  • Feeding "git stash store" with a random commit that was not created
    by "git stash create" now errors out.
    (merge d9b6634589 jc/fail-stash-to-store-non-stash later to maint).

  • The index file has room only for the lower 32-bit of the file size in
    the cached stat information, which means cached stat information
    will have 0 in its sd_size member for a file whose size is a multiple
    of 4GiB. This is mistaken for a racily clean path. Avoid it by
    storing a bogus sd_size value instead for such files.
    (merge 5143ac07b1 bc/racy-4gb-files later to maint).

  • "git p4" tried to store symlinks to LFS when told, but has been
    fixed not to do so, because it does not make sense.
    (merge 10c89a02b0 mm/p4-symlink-with-lfs later to maint).

  • The codepath to handle recipient addresses git send-email --compose learns from the user was completely broken, which has
    been corrected.
    (merge 3ec6167567 jk/send-email-fix-addresses-from-composed-messages later to maint).

  • "cd sub && git grep -f patterns" tried to read "patterns" file at
    the top level of the working tree; it has been corrected to read
    "sub/patterns" instead.

  • "git reflog expire --single-worktree" has been broken for the past
    20 months or so, which has been corrected.

  • "git send-email" did not have certain pieces of data computed yet
    when it tried to validate the outgoing messages and its recipient
    addresses, which has been sorted out.

  • "git bugreport" learned to complain when it received a command line
    argument that it will not use.

  • The codepath to traverse the commit-graph learned to notice that a
    commit is missing (e.g., corrupt repository lost an object), even
    though it knows something about the commit (like its parents) from
    what is in commit-graph.
    (merge 7a5d604443 ps/do-not-trust-commit-graph-blindly-for-existence later to maint).

  • "git rev-list --missing" did not work for missing commit objects,
    which has been corrected.

  • "git rev-list --unpacked --objects" failed to exclude packed
    non-commit objects, which has been corrected.
    (merge 7b3c8e9f38 tb/rev-list-unpacked-fix later to maint).

  • "To dereference" and "to peel" were sometimes used in in-code
    comments and documentation but without description in the glossary.
    (merge 893dce2ffb vd/glossary-dereference-peel later to maint).

  • Other code cleanup, docfix, build fix, etc.
    (merge c2c349a15c xz/commit-title-soft-limit-doc later to maint).
    (merge 1bd809938a tb/format-pack-doc-update later to maint).
    (merge 8f81532599 an/clang-format-typofix later to maint).
    (merge 3ca86adc2d la/strvec-header-fix later to maint).
    (merge 6789275d37 jc/test-i18ngrep later to maint).
    (merge 9972cd6004 ps/leakfixes later to maint).
    (merge 46edab516b tz/send-email-helpfix later to maint).


Register or login to:
  • 🔍View and search all Git releases.
  • 🛠️Create and share lists to track your tools.
  • 🚨Setup notifications for major, security, feature or patch updates.
  • 🚀Much more coming soon!
Continue with GitHub
Continue with Google