Merge branch 'hn/reftable' into master

Brown-paper-bag fix.

* hn/reftable:
  refs: move the logic to add \t to reflog to the files backend
diff --git a/Documentation/MyFirstContribution.txt b/Documentation/MyFirstContribution.txt
index 427274d..d85c9b5 100644
--- a/Documentation/MyFirstContribution.txt
+++ b/Documentation/MyFirstContribution.txt
@@ -1179,8 +1179,8 @@
 [[after-approval]]
 === After Review Approval
 
-The Git project has four integration branches: `pu`, `next`, `master`, and
-`maint`. Your change will be placed into `pu` fairly early on by the maintainer
+The Git project has four integration branches: `seen`, `next`, `master`, and
+`maint`. Your change will be placed into `seen` fairly early on by the maintainer
 while it is still in the review process; from there, when it is ready for wider
 testing, it will be merged into `next`. Plenty of early testers use `next` and
 may report issues. Eventually, changes in `next` will make it to `master`,
diff --git a/Documentation/RelNotes/2.28.0.txt b/Documentation/RelNotes/2.28.0.txt
index 02e150e..6baf781 100644
--- a/Documentation/RelNotes/2.28.0.txt
+++ b/Documentation/RelNotes/2.28.0.txt
@@ -6,18 +6,8 @@
 
 Backward compatibility notes
 
- * "feature.experimental" configuration variable is to let volunteers
-   easily opt into a set of newer features, which use of the v2
-   transport protocol is now a part of.
-
- * It used to be that setting extensions.* configuration variables
-   alone, while leaving core.repositoryFormatVersion=0, made these
-   settings effective, which was a wrong thing to do.  In version 0,
-   there was no special meaning in extensions.* configuration
-   variables.  This has been corrected.  If you need these repository
-   extensions to be effective, the core.repositoryFormatVersion
-   variable needs to be updated to 1 after vetting these extensions.*
-   variables are set correctly.
+ * "fetch.writeCommitGraph" is deemed to be still a bit too risky and
+   is no longer part of the "feature.experimental" set.
 
 
 UI, Workflows & Features
@@ -41,6 +31,20 @@
  * "git diff-files" has been taught to say paths that are marked as
    intent-to-add are new files, not modified from an empty blob.
 
+ * "git status" learned to report the status of sparse checkout.
+
+ * "git difftool" has trouble dealing with paths added to the index
+   with the intent-to-add bit.
+
+ * "git fast-export --anonymize" learned to take customized mapping to
+   allow its users to tweak its output more usable for debugging.
+
+ * The command line completion support (in contrib/) used to be
+   prepared to work with "set -u" but recent changes got a bit more
+   sloppy.  This has been corrected.
+
+ * "git gui" now allows opening work trees from the start-up dialog.
+
 
 Performance, Internal Implementation, Development Support etc.
 
@@ -90,6 +94,30 @@
 
  * A misdesigned strbuf_write_fd() function has been retired.
 
+ * SHA-256 migration work continues, including CVS/SVN interface.
+
+ * A few fields in "struct commit" that do not have to always be
+   present have been moved to commit slabs.
+
+ * API cleanup for get_worktrees()
+
+ * By renumbering object flag bits, "struct object" managed to lose
+   bloated inter-field padding.
+
+ * The name of the primary branch in existing repositories, and the
+   default name used for the first branch in newly created
+   repositories, is made configurable, so that we can eventually wean
+   ourselves off of the hardcoded 'master'.
+
+ * The effort to avoid using test_must_fail on non-git command continues.
+
+ * In 2.28-rc0, we corrected a bug that some repository extensions are
+   honored by mistake even in a version 0 repositories (these
+   configuration variables in extensions.* namespace were supposed to
+   have special meaning in repositories whose version numbers are 1 or
+   higher), but this was a bit too big a change.  The behaviour in
+   recent versions of Git where certain extensions.* were honored by
+   mistake even in version 0 repositories has been restored.
 
 
 Fixes since v2.27
@@ -158,6 +186,42 @@
  * An in-code comment in "git diff" has been updated.
    (merge c592fd4c83 dl/diff-usage-comment-update later to maint).
 
+ * The documentation and some tests have been adjusted for the recent
+   renaming of "pu" branch to "seen".
+   (merge 6dca5dbf93 js/pu-to-seen later to maint).
+
+ * The code to push changes over "dumb" HTTP had a bad interaction
+   with the commit reachability code due to incorrect allocation of
+   object flag bits, which has been corrected.
+   (merge 64472d15e9 bc/http-push-flagsfix later to maint).
+
+ * "git send-email --in-reply-to=<msg>" did not use the In-Reply-To:
+   header with the value given from the command line, and let it be
+   overridden by the value on In-Reply-To: header in the messages
+   being sent out (if exists).
+   (merge f9f60d7066 ra/send-email-in-reply-to-from-command-line-wins later to maint).
+
+ * "git log -Lx,y:path --before=date" lost track of where the range
+   should be because it didn't take the changes made by the youngest
+   commits that are omitted from the output into account.
+
+ * When "fetch.writeCommitGraph" configuration is set in a shallow
+   repository and a fetch moves the shallow boundary, we wrote out
+   broken commit-graph files that do not match the reality, which has
+   been corrected.
+
+ * "git checkout" failed to catch an error from fstat() after updating
+   a path in the working tree.
+   (merge 35e6e212fd mt/entry-fstat-fallback-fix later to maint).
+
+ * When an aliased command, whose output is piped to a pager by git,
+   gets killed by a signal, the pager got into a funny state, which
+   has been corrected (again).
+   (merge c0d73a59c9 ta/wait-on-aliased-commands-upon-signal later to maint).
+
+ * The code to produce progress output from "git commit-graph --write"
+   had a few breakages, which have been fixed.
+
  * Other code cleanup, docfix, build fix, etc.
    (merge 2c31a7aa44 jx/pkt-line-doc-count-fix later to maint).
    (merge d63ae31962 cb/t5608-cleanup later to maint).
@@ -166,3 +230,7 @@
    (merge b75a219904 es/advertise-contribution-doc later to maint).
    (merge 0c9a4f638a rs/pull-leakfix later to maint).
    (merge d546fe2874 rs/commit-reach-leakfix later to maint).
+   (merge 087bf5409c mk/pb-pretty-email-without-domain-part-fix later to maint).
+   (merge 5f4ee57ad9 es/worktree-code-cleanup later to maint).
+   (merge 0172f7834a cc/cat-file-usage-update later to maint).
+   (merge 81de0c01cf ma/rebase-doc-typofix later to maint).
diff --git a/Documentation/RelNotes/2.29.0.txt b/Documentation/RelNotes/2.29.0.txt
new file mode 100644
index 0000000..7b189d0
--- /dev/null
+++ b/Documentation/RelNotes/2.29.0.txt
@@ -0,0 +1,73 @@
+Git 2.29 Release Notes
+======================
+
+Updates since v2.28
+-------------------
+
+UI, Workflows & Features
+
+ * "git help log" has been enhanced by sharing more material from the
+   documentation for the underlying "git rev-list" command.
+
+ * "git for-each-ref --format=<>" learned %(contents:size).
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * The changed-path Bloom filter is improved using ideas from an
+   independent implementation.
+
+ * Updates to the changed-paths bloom filter.
+
+ * The test framework has been updated so that most tests will run
+   with predictable (artificial) timestamps.
+
+ * Preliminary clean-up of the refs API in preparation for adding a
+   new refs backend "reftable".
+
+ * Dev support to limit the use of test_must_fail to only git commands.
+
+
+Fixes since v2.28
+-----------------
+
+ * "git clone --separate-git-dir=$elsewhere" used to stomp on the
+   contents of the existing directory $elsewhere, which has been
+   taught to fail when $elsewhere is not an empty directory.
+   (merge dfaa209a79 bw/fail-cloning-into-non-empty later to maint).
+
+
+ * With the base fix to 2.27 regresion, any new extensions in a v0
+   repository would still be silently honored, which is not quite
+   right.  Instead, complain and die loudly.
+   (merge ec91ffca04 jk/reject-newer-extensions-in-v0 later to maint).
+
+ * Fetching from a lazily cloned repository resulted at the server
+   side in attempts to lazy fetch objects that the client side has,
+   many of which will not be available from the third-party anyway.
+   (merge 77aa0941ce jt/avoid-lazy-fetching-upon-have-check later to maint).
+
+ * Fix to an ancient bug caused by an over-eager attempt for
+   optimization.
+   (merge a98f7fb366 rs/add-index-entry-optim-fix later to maint).
+
+ * Pushing a ref whose name contains non-ASCII character with the
+   "--force-with-lease" option did not work over smart HTTP protocol,
+   which has been corrected.
+   (merge cd85b447bf bc/push-cas-cquoted-refname later to maint).
+
+ * "git mv src dst", when src is an unmerged path, errored out
+   correctly but with an incorrect error message to claim that src is
+   not tracked, which has been clarified.
+   (merge 9b906af657 ct/mv-unmerged-path-error later to maint).
+
+ * Fix to a regression introduced during 2.27 cycle.
+   (merge cada7308ad en/fill-directory-exponential later to maint).
+
+ * Other code cleanup, docfix, build fix, etc.
+   (merge 84544f2ea3 sk/typofixes later to maint).
+   (merge b17f411ab5 ar/help-guides-doc later to maint).
+   (merge 98c6871fad rs/grep-simpler-parse-object-or-die-call later to maint).
+   (merge 861c4ce141 en/typofixes later to maint).
+   (merge 60e47f6773 sg/ci-git-path-fix-with-pyenv later to maint).
+   (merge e2bfa50ac3 jb/doc-packfile-name later to maint).
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index ecf9438..291b61e 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -19,7 +19,7 @@
   base your work on the tip of the topic.
 
 * A new feature should be based on `master` in general. If the new
-  feature depends on a topic that is in `pu`, but not in `master`,
+  feature depends on a topic that is in `seen`, but not in `master`,
   base your work on the tip of that topic.
 
 * Corrections and enhancements to a topic not yet in `master` should
@@ -28,7 +28,7 @@
   into the series.
 
 * In the exceptional case that a new feature depends on several topics
-  not in `master`, start working on `next` or `pu` privately and send
+  not in `master`, start working on `next` or `seen` privately and send
   out patches for discussion. Before the final merge, you may have to
   wait until some of the dependent topics graduate to `master`, and
   rebase your work.
@@ -38,7 +38,7 @@
   these parts should be based on their trees.
 
 To find the tip of a topic branch, run `git log --first-parent
-master..pu` and look for the merge commit. The second parent of this
+master..seen` and look for the merge commit. The second parent of this
 commit is the tip of the topic branch.
 
 [[separate-commits]]
@@ -424,7 +424,7 @@
   and cooked further and eventually graduates to `master`.
 
 In any time between the (2)-(3) cycle, the maintainer may pick it up
-from the list and queue it to `pu`, in order to make it easier for
+from the list and queue it to `seen`, in order to make it easier for
 people play with it without having to pick up and apply the patch to
 their trees themselves.
 
@@ -435,7 +435,7 @@
   master. `git pull --rebase` will automatically skip already-applied
   patches, and will let you know. This works only if you rebase on top
   of the branch in which your patch has been merged (i.e. it will not
-  tell you if your patch is merged in pu if you rebase on top of
+  tell you if your patch is merged in `seen` if you rebase on top of
   master).
 
 * Read the Git mailing list, the maintainer regularly posts messages
diff --git a/Documentation/config/feature.txt b/Documentation/config/feature.txt
index 28c3360..c0cbf2b 100644
--- a/Documentation/config/feature.txt
+++ b/Documentation/config/feature.txt
@@ -15,14 +15,6 @@
 * `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
 skipping more commits at a time, reducing the number of round trips.
 +
-* `fetch.writeCommitGraph=true` writes a commit-graph after every `git fetch`
-command that downloads a pack-file from a remote. Using the `--split` option,
-most executions will create a very small commit-graph file on top of the
-existing commit-graph file(s). Occasionally, these files will merge and the
-write may take longer. Having an updated commit-graph file helps performance
-of many Git commands, including `git merge-base`, `git push -f`, and
-`git log --graph`.
-+
 * `protocol.version=2` speeds up fetches from repositories with many refs by
 allowing the client to specify which refs to list before the server lists
 them.
diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt
index b1a9b14..b203940 100644
--- a/Documentation/config/fetch.txt
+++ b/Documentation/config/fetch.txt
@@ -90,5 +90,4 @@
 	the existing commit-graph file(s). Occasionally, these files will
 	merge and the write may take longer. Having an updated commit-graph
 	file helps performance of many Git commands, including `git merge-base`,
-	`git push -f`, and `git log --graph`. Defaults to false, unless
-	`feature.experimental` is true.
+	`git push -f`, and `git log --graph`. Defaults to false.
diff --git a/Documentation/config/fmt-merge-msg.txt b/Documentation/config/fmt-merge-msg.txt
index c73cfa9..a8e8f74 100644
--- a/Documentation/config/fmt-merge-msg.txt
+++ b/Documentation/config/fmt-merge-msg.txt
@@ -8,3 +8,15 @@
 	most the specified number of one-line descriptions from the
 	actual commits that are being merged.  Defaults to false, and
 	true is a synonym for 20.
+
+merge.suppressDest::
+	By adding a glob that matches the names of integration
+	branches to this multi-valued configuration variable, the
+	default merge message computed for merges into these
+	integration branches will omit " into <branch name>" from
+	its title.
++
+An element with an empty value can be used to clear the list
+of globs accumulated from previous configuration entries.
+When there is no `merge.suppressDest` variable defined, the
+default value of `master` is used for backward compatibility.
diff --git a/Documentation/config/init.txt b/Documentation/config/init.txt
index 46fa8c6..dc77f8c 100644
--- a/Documentation/config/init.txt
+++ b/Documentation/config/init.txt
@@ -1,3 +1,7 @@
 init.templateDir::
 	Specify the directory from which templates will be copied.
 	(See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].)
+
+init.defaultBranch::
+	Allows overriding the default branch name e.g. when initializing
+	a new repository or when cloning an empty repository.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 135206f..03c0824 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -12,7 +12,7 @@
 	[-v [--abbrev=<length> | --no-abbrev]]
 	[--column[=<options>] | --no-column] [--sort=<key>]
 	[(--merged | --no-merged) [<commit>]]
-	[--contains [<commit]] [--no-contains [<commit>]]
+	[--contains [<commit>]] [--no-contains [<commit>]]
 	[--points-at <object>] [--format=<format>]
 	[(-r | --remotes) | (-a | --all)]
 	[--list] [<pattern>...]
diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt
index 8eca671..8e192d8 100644
--- a/Documentation/git-cat-file.txt
+++ b/Documentation/git-cat-file.txt
@@ -10,7 +10,7 @@
 --------
 [verse]
 'git cat-file' (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv | --filters ) [--path=<path>] <object>
-'git cat-file' (--batch | --batch-check) [ --textconv | --filters ] [--follow-symlinks]
+'git cat-file' (--batch[=<format>] | --batch-check[=<format>]) [ --textconv | --filters ] [--follow-symlinks]
 
 DESCRIPTION
 -----------
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index 08d6045..c898310 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -259,7 +259,7 @@
 branch. This is useful e.g. to maintain minimal clones of the default
 branch of some repository for search indexing.
 
---recurse-submodules[=<pathspec]::
+--recurse-submodules[=<pathspec>]::
 	After the clone is created, initialize and clone submodules
 	within based on the provided pathspec.  If no pathspec is
 	provided, all submodules are initialized and cloned.
diff --git a/Documentation/git-commit-graph.txt b/Documentation/git-commit-graph.txt
index 8ca1764..17405c7 100644
--- a/Documentation/git-commit-graph.txt
+++ b/Documentation/git-commit-graph.txt
@@ -62,7 +62,10 @@
 With the `--changed-paths` option, compute and write information about the
 paths changed between a commit and its first parent. This operation can
 take a while on large repositories. It provides significant performance gains
-for getting history of a directory or a file with `git log -- <path>`.
+for getting history of a directory or a file with `git log -- <path>`. If
+this option is given, future commit-graph writes will automatically assume
+that this option was intended. Use `--no-changed-paths` to stop storing this
+data.
 +
 With the `--split[=<strategy>]` option, write the commit-graph as a
 chain of multiple commit-graph files stored in
diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt
index 1018110..727f24d 100644
--- a/Documentation/git-diff.txt
+++ b/Documentation/git-diff.txt
@@ -63,13 +63,7 @@
 	This is to view the changes between two arbitrary
 	<commit>.
 
-'git diff' [<options>] <commit>..<commit> [--] [<path>...]::
-
-	This is synonymous to the previous form.  If <commit> on
-	one side is omitted, it will have the same effect as
-	using HEAD instead.
-
-'git diff' [<options>] <commit> [<commit>...] <commit> [--] [<path>...]::
+'git diff' [<options>] <commit> <commit>... <commit> [--] [<path>...]::
 
 	This form is to view the results of a merge commit.  The first
 	listed <commit> must be the merge itself; the remaining two or
@@ -78,6 +72,13 @@
 	For instance, if `master` names a merge commit, `git diff master
 	master^@` gives the same combined diff as `git show master`.
 
+'git diff' [<options>] <commit>..<commit> [--] [<path>...]::
+
+	This is synonymous to the earlier form (without the "..") for
+	viewing the changes between two arbitrary <commit>.  If <commit> on
+	one side is omitted, it will have the same effect as
+	using HEAD instead.
+
 'git diff' [<options>] <commit>\...<commit> [--] [<path>...]::
 
 	This form is to view the changes on the branch containing
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
index e8950de..1978dbd 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -119,6 +119,11 @@
 	the shape of the history and stored tree.  See the section on
 	`ANONYMIZING` below.
 
+--anonymize-map=<from>[:<to>]::
+	Convert token `<from>` to `<to>` in the anonymized output. If
+	`<to>` is omitted, map `<from>` to itself (i.e., do not
+	anonymize it). See the section on `ANONYMIZING` below.
+
 --reference-excluded-parents::
 	By default, running a command such as `git fast-export
 	master~5..master` will not include the commit master{tilde}5
@@ -238,6 +243,30 @@
 smaller output, and it is usually easy to quickly confirm that there is
 no private data in the stream.
 
+Reproducing some bugs may require referencing particular commits or
+paths, which becomes challenging after refnames and paths have been
+anonymized. You can ask for a particular token to be left as-is or
+mapped to a new value. For example, if you have a bug which reproduces
+with `git rev-list sensitive -- secret.c`, you can run:
+
+---------------------------------------------------
+$ git fast-export --anonymize --all \
+      --anonymize-map=sensitive:foo \
+      --anonymize-map=secret.c:bar.c \
+      >stream
+---------------------------------------------------
+
+After importing the stream, you can then run `git rev-list foo -- bar.c`
+in the anonymized repository.
+
+Note that paths and refnames are split into tokens at slash boundaries.
+The command above would anonymize `subdir/secret.c` as something like
+`path123/bar.c`; you could then search for `bar.c` in the anonymized
+repository to determine the final pathname.
+
+To make referencing the final pathname simpler, you can map each path
+component; so if you also anonymize `subdir` to `publicdir`, then the
+final pathname would be `publicdir/bar.c`.
 
 LIMITATIONS
 -----------
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index 5b1909f..45b6d8e 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -255,14 +255,14 @@
 * Using refspecs explicitly:
 +
 ------------------------------------------------
-$ git fetch origin +pu:pu maint:tmp
+$ git fetch origin +seen:seen maint:tmp
 ------------------------------------------------
 +
-This updates (or creates, as necessary) branches `pu` and `tmp` in
+This updates (or creates, as necessary) branches `seen` and `tmp` in
 the local repository by fetching from the branches (respectively)
-`pu` and `maint` from the remote repository.
+`seen` and `maint` from the remote repository.
 +
-The `pu` branch will be updated even if it does not fast-forward,
+The `seen` branch will be updated even if it does not fast-forward,
 because it is prefixed with a plus sign; `tmp` will not be.
 
 * Peek at a remote's branch, without configuring the remote in your local
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 6dcd39f..2ea71c5 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -232,12 +232,27 @@
 `committer`, and `tagger`) can be suffixed with `name`, `email`,
 and `date` to extract the named component.
 
-The complete message in a commit and tag object is `contents`.
-Its first line is `contents:subject`, where subject is the concatenation
-of all lines of the commit message up to the first blank line.  The next
-line is `contents:body`, where body is all of the lines after the first
-blank line.  The optional GPG signature is `contents:signature`.  The
-first `N` lines of the message is obtained using `contents:lines=N`.
+The message in a commit or a tag object is `contents`, from which
+`contents:<part>` can be used to extract various parts out of:
+
+contents:size::
+	The size in bytes of the commit or tag message.
+
+contents:subject::
+	The first paragraph of the message, which typically is a
+	single line, is taken as the "subject" of the commit or the
+	tag message.
+
+contents:body::
+	The remainder of the commit or the tag message that follows
+	the "subject".
+
+contents:signature::
+	The optional GPG signature of the tag.
+
+contents:lines=N::
+	The first `N` lines of the message.
+
 Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
 are obtained as `trailers` (or by using the historical alias
 `contents:trailers`).  Non-trailer lines from the trailer block can be omitted
diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt
index f71db0d..69c0c5c 100644
--- a/Documentation/git-help.txt
+++ b/Documentation/git-help.txt
@@ -8,7 +8,7 @@
 SYNOPSIS
 --------
 [verse]
-'git help' [-a|--all [--[no-]verbose]] [-g|--guide]
+'git help' [-a|--all [--[no-]verbose]] [-g|--guides]
 	   [-i|--info|-m|--man|-w|--web] [COMMAND|GUIDE]
 
 DESCRIPTION
@@ -21,7 +21,7 @@
 If the option `--all` or `-a` is given, all available commands are
 printed on the standard output.
 
-If the option `--guide` or `-g` is given, a list of the useful
+If the option `--guides` or `-g` is given, a list of the useful
 Git guides is also printed on the standard output.
 
 If a command, or a guide, is given, a manual page for that command or
diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt
index d5b7560..ac74d05 100644
--- a/Documentation/git-index-pack.txt
+++ b/Documentation/git-index-pack.txt
@@ -93,11 +93,19 @@
 --max-input-size=<size>::
 	Die, if the pack is larger than <size>.
 
+--object-format=<hash-algorithm>::
+	Specify the given object format (hash algorithm) for the pack.  The valid
+	values are 'sha1' and (if enabled) 'sha256'.  The default is the algorithm for
+	the current repository (set by `extensions.objectFormat`), or 'sha1' if no
+	value is set or outside a repository.
++
+This option cannot be used with --stdin.
+
 NOTES
 -----
 
-Once the index has been created, the list of object names is sorted
-and the SHA-1 hash of that list is printed to stdout. If --stdin was
+Once the index has been created, the hash that goes into the name of
+the pack/idx file is printed to stdout. If --stdin was
 also used then this is prefixed by either "pack\t", or "keep\t" if a
 new .keep file was successfully created. This is useful to remove a
 .keep file used as a lock to prevent the race with 'git repack'
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index adc6adf..ddfe265 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -10,7 +10,8 @@
 --------
 [verse]
 'git init' [-q | --quiet] [--bare] [--template=<template_directory>]
-	  [--separate-git-dir <git dir>] [--object-format=<format]
+	  [--separate-git-dir <git dir>] [--object-format=<format>]
+	  [-b <branch-name> | --initial-branch=<branch-name>]
 	  [--shared[=<permissions>]] [directory]
 
 
@@ -67,6 +68,12 @@
 +
 If this is reinitialization, the repository will be moved to the specified path.
 
+-b <branch-name::
+--initial-branch=<branch-name>::
+
+Use the specified name for the initial branch in the newly created repository.
+If not specified, fall back to the default name: `master`.
+
 --shared[=(false|true|umask|group|all|world|everybody|0xxx)]::
 
 Specify that the Git repository is to be shared amongst several users.  This
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 20e6d21..3fd26d5 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -15,9 +15,12 @@
 -----------
 Shows the commit logs.
 
-The command takes options applicable to the `git rev-list`
+:git-log: 1
+include::rev-list-description.txt[]
+
+The command takes options applicable to the linkgit:git-rev-list[1]
 command to control what is shown and how, and options applicable to
-the `git diff-*` commands to control how the changes
+the linkgit:git-diff[1] command to control how the changes
 each commit introduces are shown.
 
 
diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt
index 0a5c8b7..492e573 100644
--- a/Documentation/git-ls-remote.txt
+++ b/Documentation/git-ls-remote.txt
@@ -101,9 +101,9 @@
 7ceca275d047c90c0c7d5afb13ab97efdf51bd6e	refs/tags/v0.99.3
 c5db5456ae3b0873fc659c19fafdde22313cc441	refs/tags/v0.99.2
 0918385dbd9656cab0d1d81ba7453d49bbc16250	refs/tags/junio-gpg-pub
-$ git ls-remote http://www.kernel.org/pub/scm/git/git.git master pu rc
+$ git ls-remote http://www.kernel.org/pub/scm/git/git.git master seen rc
 5fe978a5381f1fbad26a80e682ddd2a401966740	refs/heads/master
-c781a84b5204fb294c9ccc79f8b3baceeb32c061	refs/heads/pu
+c781a84b5204fb294c9ccc79f8b3baceeb32c061	refs/heads/seen
 $ git remote add korg http://www.kernel.org/pub/scm/git/git.git
 $ git ls-remote --tags korg v\*
 d6602ec5194c87b0fc87103ca4d67251c76f233a	refs/tags/v0.99
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 4624cfd..374d248 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -259,7 +259,7 @@
 	unchanged as a result. If a temporary stash entry was created
 	using --autostash, it will be saved to the stash list.
 
---apply:
+--apply::
 	Use applying strategies to rebase (calling `git-am`
 	internally).  This option may become a no-op in the future
 	once the merge backend handles everything the apply one does.
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 025c911..5da6623 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -14,44 +14,8 @@
 DESCRIPTION
 -----------
 
-List commits that are reachable by following the `parent` links from the
-given commit(s), but exclude commits that are reachable from the one(s)
-given with a '{caret}' in front of them.  The output is given in reverse
-chronological order by default.
-
-You can think of this as a set operation.  Commits given on the command
-line form a set of commits that are reachable from any of them, and then
-commits reachable from any of the ones given with '{caret}' in front are
-subtracted from that set.  The remaining commits are what comes out in the
-command's output.  Various other options and paths parameters can be used
-to further limit the result.
-
-Thus, the following command:
-
------------------------------------------------------------------------
-	$ git rev-list foo bar ^baz
------------------------------------------------------------------------
-
-means "list all the commits which are reachable from 'foo' or 'bar', but
-not from 'baz'".
-
-A special notation "'<commit1>'..'<commit2>'" can be used as a
-short-hand for "{caret}'<commit1>' '<commit2>'". For example, either of
-the following may be used interchangeably:
-
------------------------------------------------------------------------
-	$ git rev-list origin..HEAD
-	$ git rev-list HEAD ^origin
------------------------------------------------------------------------
-
-Another special notation is "'<commit1>'...'<commit2>'" which is useful
-for merges.  The resulting set of commits is the symmetric difference
-between the two operands.  The following two commands are equivalent:
-
------------------------------------------------------------------------
-	$ git rev-list A B --not $(git merge-base --all A B)
-	$ git rev-list A...B
------------------------------------------------------------------------
+:git-rev-list: 1
+include::rev-list-description.txt[]
 
 'rev-list' is a very essential Git command, since it
 provides the ability to build and traverse commit ancestry graphs. For
diff --git a/Documentation/git-show-index.txt b/Documentation/git-show-index.txt
index 424e4ba..39b1d8e 100644
--- a/Documentation/git-show-index.txt
+++ b/Documentation/git-show-index.txt
@@ -9,7 +9,7 @@
 SYNOPSIS
 --------
 [verse]
-'git show-index'
+'git show-index' [--object-format=<hash-algorithm>]
 
 
 DESCRIPTION
@@ -36,6 +36,15 @@
 linkgit:git-verify-pack[1]. However, as this command considers only the
 index file itself, it's both faster and more flexible.
 
+OPTIONS
+-------
+
+--object-format=<hash-algorithm>::
+	Specify the given object format (hash algorithm) for the index file.  The
+	valid values are 'sha1' and (if enabled) 'sha256'.  The default is the
+	algorithm for the current repository (set by `extensions.objectFormat`), or
+	'sha1' if no value is set or outside a repository..
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index c9ed2bf..7e5f995 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -183,7 +183,7 @@
 	Sets the default remote tracking branch for the submodule. The
 	`--branch` option allows the remote branch to be specified. The
 	`--default` option removes the submodule.<name>.branch configuration
-	key, which causes the tracking branch to default to 'master'.
+	key, which causes the tracking branch to default to the remote 'HEAD'.
 
 set-url [--] <path> <newurl>::
 	Sets the URL of the specified submodule to <newurl>. Then, it will
@@ -284,7 +284,7 @@
 	`.gitmodules` for `update --remote`.  A special value of `.` is used to
 	indicate that the name of the branch in the submodule should be the
 	same name as the current branch in the current repository.  If the
-	option is not specified, it defaults to 'master'.
+	option is not specified, it defaults to the remote 'HEAD'.
 
 -f::
 --force::
@@ -322,10 +322,10 @@
 	the superproject's recorded SHA-1 to update the submodule, use the
 	status of the submodule's remote-tracking branch.  The remote used
 	is branch's remote (`branch.<name>.remote`), defaulting to `origin`.
-	The remote branch used defaults to `master`, but the branch name may
-	be overridden by setting the `submodule.<name>.branch` option in
-	either `.gitmodules` or `.git/config` (with `.git/config` taking
-	precedence).
+	The remote branch used defaults to the remote `HEAD`, but the branch
+	name may be overridden by setting the `submodule.<name>.branch`
+	option in either `.gitmodules` or `.git/config` (with `.git/config`
+	taking precedence).
 +
 This works for any of the supported update procedures (`--checkout`,
 `--rebase`, etc.).  The only change is the source of the target SHA-1.
diff --git a/Documentation/giteveryday.txt b/Documentation/giteveryday.txt
index 1bd919f..faba2ef 100644
--- a/Documentation/giteveryday.txt
+++ b/Documentation/giteveryday.txt
@@ -278,13 +278,13 @@
 $ compile/test
 $ git switch -c hold/linus && git am -3 -i -s ./+hold-linus <5>
 $ git switch topic/one && git rebase master <6>
-$ git switch -C pu next <7>
+$ git switch -C seen next <7>
 $ git merge topic/one topic/two && git merge hold/linus <8>
 $ git switch maint
 $ git cherry-pick master~4 <9>
 $ compile/test
 $ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
-$ git fetch ko && for branch in master maint next pu <11>
+$ git fetch ko && for branch in master maint next seen <11>
     do
 	git show-branch ko/$branch $branch <12>
     done
@@ -294,14 +294,14 @@
 <1> see what you were in the middle of doing, if anything.
 <2> see which branches haven't been merged into `master` yet.
 Likewise for any other integration branches e.g. `maint`, `next`
-and `pu` (potential updates).
+and `seen`.
 <3> read mails, save ones that are applicable, and save others
 that are not quite ready (other mail readers are available).
 <4> apply them, interactively, with your sign-offs.
 <5> create topic branch as needed and apply, again with sign-offs.
 <6> rebase internal topic branch that has not been merged to the
 master or exposed as a part of a stable branch.
-<7> restart `pu` every time from the next.
+<7> restart `seen` every time from the next.
 <8> and bundle topic branches still cooking.
 <9> backport a critical fix.
 <10> create a signed tag.
@@ -323,7 +323,7 @@
 	fetch = refs/heads/*:refs/remotes/ko/*
 	push = refs/heads/master
 	push = refs/heads/next
-	push = +refs/heads/pu
+	push = +refs/heads/seen
 	push = refs/heads/maint
 ------------
 
diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt
index 81f2a87..31b601e 100644
--- a/Documentation/githooks.txt
+++ b/Documentation/githooks.txt
@@ -404,6 +404,35 @@
 `git send-pack` on the other end, so you can simply `echo` messages
 for the user.
 
+reference-transaction
+~~~~~~~~~~~~~~~~~~~~~
+
+This hook is invoked by any Git command that performs reference
+updates. It executes whenever a reference transaction is prepared,
+committed or aborted and may thus get called multiple times.
+
+The hook takes exactly one argument, which is the current state the
+given reference transaction is in:
+
+    - "prepared": All reference updates have been queued to the
+      transaction and references were locked on disk.
+
+    - "committed": The reference transaction was committed and all
+      references now have their respective new value.
+
+    - "aborted": The reference transaction was aborted, no changes
+      were performed and the locks have been released.
+
+For each reference update that was added to the transaction, the hook
+receives on standard input a line of the format:
+
+  <old-value> SP <new-value> SP <ref-name> LF
+
+The exit status of the hook is ignored for any state except for the
+"prepared" state. In the "prepared" state, a non-zero exit status will
+cause the transaction to be aborted. The hook will not be called with
+"aborted" state in that case.
+
 push-to-checkout
 ~~~~~~~~~~~~~~~~
 
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index 67275fd..539b4e1 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -49,9 +49,9 @@
 
 submodule.<name>.branch::
 	A remote branch name for tracking updates in the upstream submodule.
-	If the option is not specified, it defaults to 'master'.  A special
-	value of `.` is used to indicate that the name of the branch in the
-	submodule should be the same name as the current branch in the
+	If the option is not specified, it defaults to the remote 'HEAD'.
+	A special value of `.` is used to indicate that the name of the branch
+	in the submodule should be the same name as the current branch in the
 	current repository.  See the `--remote` documentation in
 	linkgit:git-submodule[1] for details.
 
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index 93baeeb..6f1e269 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -238,6 +238,9 @@
 	`--signed-tags=verbatim` to linkgit:git-fast-export[1].  In the
 	absence of this capability, Git will use `--signed-tags=warn-strip`.
 
+'object-format'::
+	This indicates that the helper is able to interact with the remote
+	side using an explicit hash algorithm extension.
 
 
 COMMANDS
@@ -257,12 +260,14 @@
 'list'::
 	Lists the refs, one per line, in the format "<value> <name>
 	[<attr> ...]". The value may be a hex sha1 hash, "@<dest>" for
-	a symref, or "?" to indicate that the helper could not get the
-	value of the ref. A space-separated list of attributes follows
-	the name; unrecognized attributes are ignored. The list ends
-	with a blank line.
+	a symref, ":<keyword> <value>" for a key-value pair, or
+	"?" to indicate that the helper could not get the value of the
+	ref. A space-separated list of attributes follows the name;
+	unrecognized attributes are ignored. The list ends with a
+	blank line.
 +
 See REF LIST ATTRIBUTES for a list of currently defined attributes.
+See REF LIST KEYWORDS for a list of currently defined keywords.
 +
 Supported if the helper has the "fetch" or "import" capability.
 
@@ -432,6 +437,18 @@
 	This ref is unchanged since the last import or fetch, although
 	the helper cannot necessarily determine what value that produced.
 
+REF LIST KEYWORDS
+-----------------
+
+The 'list' command may produce a list of key-value pairs.
+The following keys are defined.
+
+'object-format'::
+	The refs are using the given hash algorithm.  This keyword is only
+	used if the server and client both support the object-format
+	extension.
+
+
 OPTIONS
 -------
 
@@ -516,6 +533,14 @@
 	transaction.  If successful, all refs will be updated, or none will.  If the
 	remote side does not support this capability, the push will fail.
 
+'option object-format' {'true'|algorithm}::
+	If 'true', indicate that the caller wants hash algorithm information
+	to be passed back from the remote.  This mode is used when fetching
+	refs.
++
+If set to an algorithm, indicate that the caller wants to interact with
+the remote side using that algorithm.
+
 SEE ALSO
 --------
 linkgit:git-remote[1]
diff --git a/Documentation/gitworkflows.txt b/Documentation/gitworkflows.txt
index abc0dc6..47cf97f 100644
--- a/Documentation/gitworkflows.txt
+++ b/Documentation/gitworkflows.txt
@@ -85,15 +85,15 @@
 
 There is a fourth official branch that is used slightly differently:
 
-* 'pu' (proposed updates) is an integration branch for things that are
-  not quite ready for inclusion yet (see "Integration Branches"
-  below).
+* 'seen' (patches seen by the maintainer) is an integration branch for
+  things that are not quite ready for inclusion yet (see "Integration
+  Branches" below).
 
 Each of the four branches is usually a direct descendant of the one
 above it.
 
 Conceptually, the feature enters at an unstable branch (usually 'next'
-or 'pu'), and "graduates" to 'master' for the next release once it is
+or 'seen'), and "graduates" to 'master' for the next release once it is
 considered stable enough.
 
 
@@ -207,7 +207,7 @@
 right after the testing, you can even publish this branch, for example
 to give the testers a chance to work with it, or other developers a
 chance to see if their in-progress work will be compatible.  `git.git`
-has such an official throw-away integration branch called 'pu'.
+has such an official throw-away integration branch called 'seen'.
 
 
 Branch management for a release
@@ -291,8 +291,8 @@
 described in the previous section.
 
 
-Branch management for next and pu after a feature release
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Branch management for next and seen after a feature release
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 After a feature release, the integration branch 'next' may optionally be
 rewound and rebuilt from the tip of 'master' using the surviving
@@ -319,8 +319,8 @@
 If you do this, then you should make a public announcement indicating
 that 'next' was rewound and rebuilt.
 
-The same rewind and rebuild process may be followed for 'pu'. A public
-announcement is not necessary since 'pu' is a throw-away branch, as
+The same rewind and rebuild process may be followed for 'seen'. A public
+announcement is not necessary since 'seen' is a throw-away branch, as
 described above.
 
 
diff --git a/Documentation/howto/maintain-git.txt b/Documentation/howto/maintain-git.txt
index 73be8b4..a67130d 100644
--- a/Documentation/howto/maintain-git.txt
+++ b/Documentation/howto/maintain-git.txt
@@ -66,7 +66,7 @@
    demonstrated to be regression free.  New changes are tested
    in 'next' before merged to 'master'.
 
- - 'pu' branch is used to publish other proposed changes that do
+ - 'seen' branch is used to publish other proposed changes that do
    not yet pass the criteria set for 'next'.
 
  - The tips of 'master' and 'maint' branches will not be rewound to
@@ -76,7 +76,7 @@
    of the cycle.
 
  - Usually 'master' contains all of 'maint' and 'next' contains all
-   of 'master'.  'pu' contains all the topics merged to 'next', but
+   of 'master'.  'seen' contains all the topics merged to 'next', but
    is rebuilt directly on 'master'.
 
  - The tip of 'master' is meant to be more stable than any
@@ -229,12 +229,12 @@
    series?)
 
  - Prepare 'jch' branch, which is used to represent somewhere
-   between 'master' and 'pu' and often is slightly ahead of 'next'.
+   between 'master' and 'seen' and often is slightly ahead of 'next'.
 
-     $ Meta/Reintegrate master..pu >Meta/redo-jch.sh
+     $ Meta/Reintegrate master..seen >Meta/redo-jch.sh
 
    The result is a script that lists topics to be merged in order to
-   rebuild 'pu' as the input to Meta/Reintegrate script.  Remove
+   rebuild 'seen' as the input to Meta/Reintegrate script.  Remove
    later topics that should not be in 'jch' yet.  Add a line that
    consists of '### match next' before the name of the first topic
    in the output that should be in 'jch' but not in 'next' yet.
@@ -291,29 +291,29 @@
    merged to 'master'.  This may lose '### match next' marker;
    add it again to the appropriate place when it happens.
 
- - Rebuild 'pu'.
+ - Rebuild 'seen'.
 
-     $ Meta/Reintegrate master..pu >Meta/redo-pu.sh
+     $ Meta/Reintegrate master..seen >Meta/redo-seen.sh
 
-   Edit the result by adding new topics that are not still in 'pu'
+   Edit the result by adding new topics that are not still in 'seen'
    in the script.  Then
 
-     $ git checkout -B pu jch
-     $ sh Meta/redo-pu.sh
+     $ git checkout -B seen jch
+     $ sh Meta/redo-seen.sh
 
-   When all is well, clean up the redo-pu.sh script with
+   When all is well, clean up the redo-seen.sh script with
 
-     $ sh Meta/redo-pu.sh -u
+     $ sh Meta/redo-seen.sh -u
 
    Double check by running
 
-     $ git branch --no-merged pu
+     $ git branch --no-merged seen
 
    to see there is no unexpected leftover topics.
 
    At this point, build-test the result for semantic conflicts, and
    if there are, prepare an appropriate merge-fix first (see
-   appendix), and rebuild the 'pu' branch from scratch, starting at
+   appendix), and rebuild the 'seen' branch from scratch, starting at
    the tip of 'jch'.
 
  - Update "What's cooking" message to review the updates to
@@ -323,14 +323,14 @@
 
      $ Meta/cook
 
-   This script inspects the history between master..pu, finds tips
+   This script inspects the history between master..seen, finds tips
    of topic branches, compares what it found with the current
    contents in Meta/whats-cooking.txt, and updates that file.
-   Topics not listed in the file but are found in master..pu are
+   Topics not listed in the file but are found in master..seen are
    added to the "New topics" section, topics listed in the file that
-   are no longer found in master..pu are moved to the "Graduated to
+   are no longer found in master..seen are moved to the "Graduated to
    master" section, and topics whose commits changed their states
-   (e.g. used to be only in 'pu', now merged to 'next') are updated
+   (e.g. used to be only in 'seen', now merged to 'next') are updated
    with change markers "<<" and ">>".
 
    Look for lines enclosed in "<<" and ">>"; they hold contents from
@@ -360,7 +360,7 @@
 Some observations to be made.
 
  * Each topic is tested individually, and also together with other
-   topics cooking first in 'pu', then in 'jch' and then in 'next'.
+   topics cooking first in 'seen', then in 'jch' and then in 'next'.
    Until it matures, no part of it is merged to 'master'.
 
  * A topic already in 'next' can get fixes while still in
@@ -411,7 +411,7 @@
 are merged together, the reference to the variable newly added by
 the latter topic will still use the old name in the result.
 
-The Meta/Reintegrate script that is used by redo-jch and redo-pu
+The Meta/Reintegrate script that is used by redo-jch and redo-seen
 scripts implements a crude but usable way to work this issue around.
 When the script merges branch $X, it checks if "refs/merge-fix/$X"
 exists, and if so, the effect of it is squashed into the result of
@@ -431,14 +431,14 @@
 correct semantic conflicts.
 
 After finding that the result of merging branch "ai/topic" to an
-integration branch had such a semantic conflict, say pu~4, check the
+integration branch had such a semantic conflict, say seen~4, check the
 problematic merge out on a detached HEAD, edit the working tree to
 fix the semantic conflict, and make a separate commit to record the
 fix-up:
 
-     $ git checkout pu~4
+     $ git checkout seen~4
      $ git show -s --pretty=%s ;# double check
-     Merge branch 'ai/topic' to pu
+     Merge branch 'ai/topic' to seen
      $ edit
      $ git commit -m 'merge-fix/ai/topic' -a
 
@@ -450,9 +450,9 @@
 Then double check the result by asking Meta/Reintegrate to redo the
 merge:
 
-     $ git checkout pu~5 ;# the parent of the problem merge
+     $ git checkout seen~5 ;# the parent of the problem merge
      $ echo ai/topic | Meta/Reintegrate
-     $ git diff pu~4
+     $ git diff seen~4
 
 This time, because you prepared refs/merge-fix/ai/topic, the
 resulting merge should have been tweaked to include the fix for the
@@ -464,7 +464,7 @@
 to the integration branch changed the underlying assumption ai/topic
 branch made (e.g. ai/topic branch added a site to refer to a
 variable, while the other branch renamed that variable and adjusted
-existing use sites), and if you changed redo-jch (or redo-pu) script
+existing use sites), and if you changed redo-jch (or redo-seen) script
 to merge ai/topic branch before the other branch, then the above
 merge-fix should not be applied while merging ai/topic, but should
 instead be applied while merging the other branch.  You would need
diff --git a/Documentation/howto/rebase-from-internal-branch.txt b/Documentation/howto/rebase-from-internal-branch.txt
index 02cb5f7..f2e10a7 100644
--- a/Documentation/howto/rebase-from-internal-branch.txt
+++ b/Documentation/howto/rebase-from-internal-branch.txt
@@ -4,7 +4,7 @@
 Subject: Re: sending changesets from the middle of a git tree
 Date:	Sun, 14 Aug 2005 18:37:39 -0700
 Abstract: In this article, JC talks about how he rebases the
- public "pu" branch using the core Git tools when he updates
+ public "seen" branch using the core Git tools when he updates
  the "master" branch, and how "rebase" works.  Also discussed
  is how this applies to individual developers who sends patches
  upstream.
@@ -20,8 +20,8 @@
 > where Junio C Hamano <junkio@cox.net> told me that...
 >> Linus Torvalds <torvalds@osdl.org> writes:
 >>
->> > Junio, maybe you want to talk about how you move patches from your "pu"
->> > branch to the real branches.
+>> > Junio, maybe you want to talk about how you move patches from your
+>> > "seen" branch to the real branches.
 >>
 > Actually, wouldn't this be also precisely for what StGIT is intended to?
 --------------------------------------
@@ -33,12 +33,12 @@
 I just have done a simpler one, this time using only the core
 Git tools.
 
-I had a handful of commits that were ahead of master in pu, and I
+I had a handful of commits that were ahead of master in 'seen', and I
 wanted to add some documentation bypassing my usual habit of
-placing new things in pu first.  At the beginning, the commit
+placing new things in 'seen' first.  At the beginning, the commit
 ancestry graph looked like this:
 
-                             *"pu" head
+			     *"seen" head
     master --> #1 --> #2 --> #3
 
 So I started from master, made a bunch of edits, and committed:
@@ -50,7 +50,7 @@
 
 After the commit, the ancestry graph would look like this:
 
-                              *"pu" head
+			      *"seen" head
     master^ --> #1 --> #2 --> #3
           \
             \---> master
@@ -58,31 +58,31 @@
 The old master is now master^ (the first parent of the master).
 The new master commit holds my documentation updates.
 
-Now I have to deal with "pu" branch.
+Now I have to deal with "seen" branch.
 
 This is the kind of situation I used to have all the time when
 Linus was the maintainer and I was a contributor, when you look
-at "master" branch being the "maintainer" branch, and "pu"
+at "master" branch being the "maintainer" branch, and "seen"
 branch being the "contributor" branch.  Your work started at the
 tip of the "maintainer" branch some time ago, you made a lot of
 progress in the meantime, and now the maintainer branch has some
 other commits you do not have yet.  And "git rebase" was written
 with the explicit purpose of helping to maintain branches like
-"pu".  You _could_ merge master to pu and keep going, but if you
+"seen".  You _could_ merge master to 'seen' and keep going, but if you
 eventually want to cherrypick and merge some but not necessarily
 all changes back to the master branch, it often makes later
 operations for _you_ easier if you rebase (i.e. carry forward
-your changes) "pu" rather than merge.  So I ran "git rebase":
+your changes) "seen" rather than merge.  So I ran "git rebase":
 
-    $ git checkout pu
-    $ git rebase master pu
+    $ git checkout seen
+    $ git rebase master seen
 
 What this does is to pick all the commits since the current
-branch (note that I now am on "pu" branch) forked from the
+branch (note that I now am on "seen" branch) forked from the
 master branch, and forward port these changes.
 
     master^ --> #1 --> #2 --> #3
-          \                                  *"pu" head
+	  \                                  *"seen" head
             \---> master --> #1' --> #2' --> #3'
 
 The diff between master^ and #1 is applied to master and
@@ -92,7 +92,7 @@
 
 Old #3 is not recorded in any of the .git/refs/heads/ file
 anymore, so after doing this you will have dangling commit if
-you ran fsck-cache, which is normal.  After testing "pu", you
+you ran fsck-cache, which is normal.  After testing "seen", you
 can run "git prune" to get rid of those original three commits.
 
 While I am talking about "git rebase", I should talk about how
diff --git a/Documentation/howto/revert-branch-rebase.txt b/Documentation/howto/revert-branch-rebase.txt
index 149508e..a3e5595 100644
--- a/Documentation/howto/revert-branch-rebase.txt
+++ b/Documentation/howto/revert-branch-rebase.txt
@@ -15,7 +15,7 @@
 break building Git with GCC 2.95.  While they were well-intentioned
 portability fixes, keeping things working with gcc-2.95 was also
 important.  Here is what I did to revert the change in the 'master'
-branch and to adjust the 'pu' branch, using core Git tools and
+branch and to adjust the 'seen' branch, using core Git tools and
 barebone Porcelain.
 
 First, prepare a throw-away branch in case I screw things up.
@@ -104,11 +104,11 @@
 
 says nothing.
 
-Then we rebase the 'pu' branch as usual.
+Then we rebase the 'seen' branch as usual.
 
 ------------------------------------------------
-$ git checkout pu
-$ git tag pu-anchor pu
+$ git checkout seen
+$ git tag seen-anchor seen
 $ git rebase master
 * Applying: Redo "revert" using three-way merge machinery.
 First trying simple merge strategy to cherry-pick.
@@ -127,11 +127,11 @@
 First trying simple merge strategy to cherry-pick.
 ------------------------------------------------
 
-The temporary tag 'pu-anchor' is me just being careful, in case 'git
+The temporary tag 'seen-anchor' is me just being careful, in case 'git
 rebase' screws up.  After this, I can do these for sanity check:
 
 ------------------------------------------------
-$ git diff pu-anchor..pu ;# make sure we got the master fix.
+$ git diff seen-anchor..seen ;# make sure we got the master fix.
 $ make CC=gcc-2.95 clean test ;# make sure it fixed the breakage.
 $ make clean test ;# make sure it did not cause other breakage.
 ------------------------------------------------
@@ -140,7 +140,7 @@
 or tag anymore, so remove them:
 
 ------------------------------------------------
-$ rm -f .git/refs/tags/pu-anchor
+$ rm -f .git/refs/tags/seen-anchor
 $ git branch -d revert-c99
 ------------------------------------------------
 
@@ -168,18 +168,18 @@
 And the final repository status looks like this:
 
 ------------------------------------------------
-$ git show-branch --more=1 master pu rc
+$ git show-branch --more=1 master seen rc
 ! [master] Revert "Replace zero-length array decls with []."
- ! [pu] git-repack: Add option to repack all objects.
+ ! [seen] git-repack: Add option to repack all objects.
   * [rc] Merge refs/heads/master from .
 ---
- +  [pu] git-repack: Add option to repack all objects.
- +  [pu~1] More documentation updates.
- +  [pu~2] Show commits in topo order and name all commits.
- +  [pu~3] mailinfo and applymbox updates
- +  [pu~4] Document "git cherry-pick" and "git revert"
- +  [pu~5] Remove git-apply-patch-script.
- +  [pu~6] Redo "revert" using three-way merge machinery.
+ +  [seen] git-repack: Add option to repack all objects.
+ +  [seen~1] More documentation updates.
+ +  [seen~2] Show commits in topo order and name all commits.
+ +  [seen~3] mailinfo and applymbox updates
+ +  [seen~4] Document "git cherry-pick" and "git revert"
+ +  [seen~5] Remove git-apply-patch-script.
+ +  [seen~6] Redo "revert" using three-way merge machinery.
   - [rc] Merge refs/heads/master from .
 ++* [master] Revert "Replace zero-length array decls with []."
   - [rc~1] Merge refs/heads/master from .
diff --git a/Documentation/howto/update-hook-example.txt b/Documentation/howto/update-hook-example.txt
index 89821ec..151ee84 100644
--- a/Documentation/howto/update-hook-example.txt
+++ b/Documentation/howto/update-hook-example.txt
@@ -179,7 +179,7 @@
 whom.  The format of each file would look like this:
 
     refs/heads/master   junio
-    +refs/heads/pu      junio
+    +refs/heads/seen    junio
     refs/heads/cogito$  pasky
     refs/heads/bw/.*    linus
     refs/heads/tmp/.*   .*
@@ -187,6 +187,6 @@
 
 With this, Linus can push or create "bw/penguin" or "bw/zebra"
 or "bw/panda" branches, Pasky can do only "cogito", and JC can
-do master and pu branches and make versioned tags.  And anybody
-can do tmp/blah branches. The '+' sign at the pu record means
+do master and "seen" branches and make versioned tags.  And anybody
+can do tmp/blah branches. The '+' sign at the "seen" record means
 that JC can make non-fast-forward pushes on it.
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 547a552..84bbc74 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -196,8 +196,8 @@
 '%ce':: committer email
 '%cE':: committer email (respecting .mailmap, see
 	linkgit:git-shortlog[1] or linkgit:git-blame[1])
-'%cl':: author email local-part (the part before the '@' sign)
-'%cL':: author local-part (see '%cl') respecting .mailmap, see
+'%cl':: committer email local-part (the part before the '@' sign)
+'%cL':: committer local-part (see '%cl') respecting .mailmap, see
 	linkgit:git-shortlog[1] or linkgit:git-blame[1])
 '%cd':: committer date (format respects --date= option)
 '%cD':: committer date, RFC2822 style
diff --git a/Documentation/rev-list-description.txt b/Documentation/rev-list-description.txt
new file mode 100644
index 0000000..a9efa7f
--- /dev/null
+++ b/Documentation/rev-list-description.txt
@@ -0,0 +1,61 @@
+List commits that are reachable by following the `parent` links from the
+given commit(s), but exclude commits that are reachable from the one(s)
+given with a '{caret}' in front of them.  The output is given in reverse
+chronological order by default.
+
+You can think of this as a set operation. Commits reachable from any of
+the commits given on the command line form a set, and then commits reachable
+from any of the ones given with '{caret}' in front are subtracted from that
+set.  The remaining commits are what comes out in the command's output.
+Various other options and paths parameters can be used to further limit the
+result.
+
+Thus, the following command:
+
+ifdef::git-rev-list[]
+-----------------------------------------------------------------------
+$ git rev-list foo bar ^baz
+-----------------------------------------------------------------------
+endif::git-rev-list[]
+ifdef::git-log[]
+-----------------------------------------------------------------------
+$ git log foo bar ^baz
+-----------------------------------------------------------------------
+endif::git-log[]
+
+means "list all the commits which are reachable from 'foo' or 'bar', but
+not from 'baz'".
+
+A special notation "'<commit1>'..'<commit2>'" can be used as a
+short-hand for "^'<commit1>' '<commit2>'". For example, either of
+the following may be used interchangeably:
+
+ifdef::git-rev-list[]
+-----------------------------------------------------------------------
+$ git rev-list origin..HEAD
+$ git rev-list HEAD ^origin
+-----------------------------------------------------------------------
+endif::git-rev-list[]
+ifdef::git-log[]
+-----------------------------------------------------------------------
+$ git log origin..HEAD
+$ git log HEAD ^origin
+-----------------------------------------------------------------------
+endif::git-log[]
+
+Another special notation is "'<commit1>'...'<commit2>'" which is useful
+for merges.  The resulting set of commits is the symmetric difference
+between the two operands.  The following two commands are equivalent:
+
+ifdef::git-rev-list[]
+-----------------------------------------------------------------------
+$ git rev-list A B --not $(git merge-base --all A B)
+$ git rev-list A...B
+-----------------------------------------------------------------------
+endif::git-rev-list[]
+ifdef::git-log[]
+-----------------------------------------------------------------------
+$ git log A B --not $(git merge-base --all A B)
+$ git log A...B
+-----------------------------------------------------------------------
+endif::git-log[]
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 1ad9506..d9169c0 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -254,6 +254,9 @@
 previous section, means the set of commits `reachable` from the given
 commit.
 
+Specifying several revisions means the set of commits reachable from
+any of the given commits.
+
 A commit's reachable set is the commit itself and the commits in
 its ancestry chain.
 
diff --git a/Documentation/technical/commit-graph-format.txt b/Documentation/technical/commit-graph-format.txt
index 1beef17..4405410 100644
--- a/Documentation/technical/commit-graph-format.txt
+++ b/Documentation/technical/commit-graph-format.txt
@@ -32,7 +32,7 @@
 of the body. The header includes certain values, such as number of chunks
 and hash type.
 
-All 4-byte numbers are in network order.
+All multi-byte numbers are in network byte order.
 
 HEADER:
 
diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt
index 2b267c0..36ccd14 100644
--- a/Documentation/technical/protocol-capabilities.txt
+++ b/Documentation/technical/protocol-capabilities.txt
@@ -176,6 +176,21 @@
 purposes, and MUST NOT be used to programmatically assume the presence
 or absence of particular features.
 
+object-format
+-------------
+
+This capability, which takes a hash algorithm as an argument, indicates
+that the server supports the given hash algorithms.  It may be sent
+multiple times; if so, the first one given is the one used in the ref
+advertisement.
+
+When provided by the client, this indicates that it intends to use the
+given hash algorithm to communicate.  The algorithm provided must be one
+that the server supports.
+
+If this capability is not provided, it is assumed that the only
+supported algorithm is SHA-1.
+
 symref
 ------
 
diff --git a/Documentation/technical/protocol-v2.txt b/Documentation/technical/protocol-v2.txt
index 5852f49..e597b74 100644
--- a/Documentation/technical/protocol-v2.txt
+++ b/Documentation/technical/protocol-v2.txt
@@ -483,3 +483,12 @@
 a request.
 
 The provided options must not contain a NUL or LF character.
+
+ object-format
+~~~~~~~~~~~~~~~
+
+The server can advertise the `object-format` capability with a value `X` (in the
+form `object-format=X`) to notify the client that the server is able to deal
+with objects using hash algorithm X.  If not specified, the server is assumed to
+only handle SHA-1.  If the client would like to use a hash algorithm other than
+SHA-1, it should specify its object-format string.
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 8336529..fd480b8 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -347,7 +347,7 @@
   origin/man
   origin/master
   origin/next
-  origin/pu
+  origin/seen
   origin/todo
 ------------------------------------------------
 
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 7b0cfeb..9db2f4f 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.27.GIT
+DEF_VER=v2.28.0
 
 LF='
 '
diff --git a/RelNotes b/RelNotes
index a7b4f6d..9143650 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.28.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.29.0.txt
\ No newline at end of file
diff --git a/add-patch.c b/add-patch.c
index f899389..a1d66c1 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -1203,7 +1203,7 @@
 	for (;;) {
 		int res = edit_hunk_manually(s, hunk);
 		if (res == 0) {
-			/* abandonded */
+			/* abandoned */
 			*hunk = backup;
 			return -1;
 		}
diff --git a/alloc.c b/alloc.c
index 1c64c4d..957a0af 100644
--- a/alloc.c
+++ b/alloc.c
@@ -99,23 +99,27 @@
 	return obj;
 }
 
-static unsigned int alloc_commit_index(struct repository *r)
+/*
+ * The returned count is to be used as an index into commit slabs,
+ * that are *NOT* maintained per repository, and that is why a single
+ * global counter is used.
+ */
+static unsigned int alloc_commit_index(void)
 {
-	return r->parsed_objects->commit_count++;
+	static unsigned int parsed_commits_count;
+	return parsed_commits_count++;
 }
 
-void init_commit_node(struct repository *r, struct commit *c)
+void init_commit_node(struct commit *c)
 {
 	c->object.type = OBJ_COMMIT;
-	c->index = alloc_commit_index(r);
-	c->graph_pos = COMMIT_NOT_FROM_GRAPH;
-	c->generation = GENERATION_NUMBER_INFINITY;
+	c->index = alloc_commit_index();
 }
 
 void *alloc_commit_node(struct repository *r)
 {
 	struct commit *c = alloc_node(r->parsed_objects->commit_state, sizeof(struct commit));
-	init_commit_node(r, c);
+	init_commit_node(c);
 	return c;
 }
 
diff --git a/alloc.h b/alloc.h
index ed1071c..371d388 100644
--- a/alloc.h
+++ b/alloc.h
@@ -9,7 +9,7 @@
 
 void *alloc_blob_node(struct repository *r);
 void *alloc_tree_node(struct repository *r);
-void init_commit_node(struct repository *r, struct commit *c);
+void init_commit_node(struct commit *c);
 void *alloc_commit_node(struct repository *r);
 void *alloc_tag_node(struct repository *r);
 void *alloc_object_node(struct repository *r);
diff --git a/blame.c b/blame.c
index da7e288..82fa16d 100644
--- a/blame.c
+++ b/blame.c
@@ -1272,7 +1272,7 @@
 	if (!bd)
 		return 1;
 
-	if (origin->commit->generation == GENERATION_NUMBER_INFINITY)
+	if (commit_graph_generation(origin->commit) == GENERATION_NUMBER_INFINITY)
 		return 1;
 
 	filter = get_bloom_filter(r, origin->commit, 0);
diff --git a/blob.c b/blob.c
index 36f9abd..182718a 100644
--- a/blob.c
+++ b/blob.c
@@ -10,7 +10,7 @@
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_blob_node(r));
-	return object_as_type(r, obj, OBJ_BLOB, 0);
+	return object_as_type(obj, OBJ_BLOB, 0);
 }
 
 int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size)
diff --git a/bloom.c b/bloom.c
index 6c76118..1a57322 100644
--- a/bloom.c
+++ b/bloom.c
@@ -33,15 +33,16 @@
 					struct commit *c)
 {
 	uint32_t lex_pos, start_index, end_index;
+	uint32_t graph_pos = commit_graph_position(c);
 
-	while (c->graph_pos < g->num_commits_in_base)
+	while (graph_pos < g->num_commits_in_base)
 		g = g->base_graph;
 
 	/* The commit graph commit 'c' lives in doesn't carry bloom filters. */
 	if (!g->chunk_bloom_indexes)
 		return 0;
 
-	lex_pos = c->graph_pos - g->num_commits_in_base;
+	lex_pos = graph_pos - g->num_commits_in_base;
 
 	end_index = get_be32(g->chunk_bloom_indexes + 4 * lex_pos);
 
@@ -186,24 +187,22 @@
 	struct diff_options diffopt;
 	int max_changes = 512;
 
-	if (bloom_filters.slab_size == 0)
+	if (!bloom_filters.slab_size)
 		return NULL;
 
 	filter = bloom_filter_slab_at(&bloom_filters, c);
 
 	if (!filter->data) {
 		load_commit_graph_info(r, c);
-		if (c->graph_pos != COMMIT_NOT_FROM_GRAPH &&
-			r->objects->commit_graph->chunk_bloom_indexes) {
-			if (load_bloom_filter_from_graph(r->objects->commit_graph, filter, c))
-				return filter;
-			else
-				return NULL;
-		}
+		if (commit_graph_position(c) != COMMIT_NOT_FROM_GRAPH &&
+			r->objects->commit_graph->chunk_bloom_indexes)
+			load_bloom_filter_from_graph(r->objects->commit_graph, filter, c);
 	}
 
-	if (filter->data || !compute_if_not_present)
+	if (filter->data)
 		return filter;
+	if (!compute_if_not_present)
+		return NULL;
 
 	repo_diff_setup(r, &diffopt);
 	diffopt.flags.recursive = 1;
diff --git a/branch.c b/branch.c
index 2d9e767..7095f78 100644
--- a/branch.c
+++ b/branch.c
@@ -370,7 +370,7 @@
 				      const char *logmsg)
 {
 	int ret = 0;
-	struct worktree **worktrees = get_worktrees(0);
+	struct worktree **worktrees = get_worktrees();
 	int i;
 
 	for (i = 0; worktrees[i]; i++) {
diff --git a/builtin/branch.c b/builtin/branch.c
index 99633ad..e82301f 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -468,7 +468,7 @@
 
 static void reject_rebase_or_bisect_branch(const char *target)
 {
-	struct worktree **worktrees = get_worktrees(0);
+	struct worktree **worktrees = get_worktrees();
 	int i;
 
 	for (i = 0; worktrees[i]; i++) {
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index ae18e20..5ebf133 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -596,7 +596,7 @@
 
 static const char * const cat_file_usage[] = {
 	N_("git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <type> | --textconv | --filters) [--path=<path>] <object>"),
-	N_("git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --filters]"),
+	N_("git cat-file (--batch[=<format>] | --batch-check[=<format>]) [--follow-symlinks] [--textconv | --filters]"),
 	NULL
 };
 
diff --git a/builtin/clone.c b/builtin/clone.c
index 2a8e3aa..a9f3312 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -946,7 +946,7 @@
 	int is_bundle = 0, is_local;
 	const char *repo_name, *repo, *work_tree, *git_dir;
 	char *path, *dir, *display_repo = NULL;
-	int dest_exists;
+	int dest_exists, real_dest_exists = 0;
 	const struct ref *refs, *remote_head;
 	const struct ref *remote_head_points_at;
 	const struct ref *our_head_points_at;
@@ -1021,6 +1021,14 @@
 		die(_("destination path '%s' already exists and is not "
 			"an empty directory."), dir);
 
+	if (real_git_dir) {
+		real_dest_exists = path_exists(real_git_dir);
+		if (real_dest_exists && !is_empty_dir(real_git_dir))
+			die(_("repository path '%s' already exists and is not "
+				"an empty directory."), real_git_dir);
+	}
+
+
 	strbuf_addf(&reflog_msg, "clone: from %s",
 		    display_repo ? display_repo : repo);
 	free(display_repo);
@@ -1057,7 +1065,7 @@
 	}
 
 	if (real_git_dir) {
-		if (path_exists(real_git_dir))
+		if (real_dest_exists)
 			junk_git_dir_flags |= REMOVE_DIR_KEEP_TOPLEVEL;
 		junk_git_dir = real_git_dir;
 	} else {
@@ -1111,7 +1119,8 @@
 		}
 	}
 
-	init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN, INIT_DB_QUIET);
+	init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN, NULL,
+		INIT_DB_QUIET);
 
 	if (real_git_dir)
 		git_dir = real_git_dir;
@@ -1220,6 +1229,15 @@
 	refs = transport_get_remote_refs(transport, &ref_prefixes);
 
 	if (refs) {
+		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
+
+		/*
+		 * Now that we know what algorithm the remote side is using,
+		 * let's set ours to the same thing.
+		 */
+		initialize_repository_version(hash_algo);
+		repo_set_hash_algo(the_repository, hash_algo);
+
 		mapped_refs = wanted_peer_refs(refs, &remote->fetch);
 		/*
 		 * transport_get_remote_refs() may return refs with null sha-1
@@ -1266,9 +1284,13 @@
 		remote_head_points_at = NULL;
 		remote_head = NULL;
 		option_no_checkout = 1;
-		if (!option_bare)
-			install_branch_config(0, "master", option_origin,
-					      "refs/heads/master");
+		if (!option_bare) {
+			const char *branch = git_default_branch_name();
+			char *ref = xstrfmt("refs/heads/%s", branch);
+
+			install_branch_config(0, branch, option_origin, ref);
+			free(ref);
+		}
 	}
 
 	write_refspec_config(src_ref_prefix, our_head_points_at,
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
index 75455da..523501f 100644
--- a/builtin/commit-graph.c
+++ b/builtin/commit-graph.c
@@ -154,7 +154,7 @@
 			   NULL, 0);
 	if (!result)
 		return error(_("invalid object: %s"), hash);
-	else if (object_as_type(the_repository, result, OBJ_COMMIT, 1))
+	else if (object_as_type(result, OBJ_COMMIT, 1))
 		oidset_insert(commits, &result->oid);
 
 	display_progress(progress, oidset_size(commits));
@@ -201,6 +201,7 @@
 	};
 
 	opts.progress = isatty(2);
+	opts.enable_changed_paths = -1;
 	split_opts.size_multiple = 2;
 	split_opts.max_commits = 0;
 	split_opts.expire_time = 0;
@@ -221,7 +222,9 @@
 		flags |= COMMIT_GRAPH_WRITE_SPLIT;
 	if (opts.progress)
 		flags |= COMMIT_GRAPH_WRITE_PROGRESS;
-	if (opts.enable_changed_paths ||
+	if (!opts.enable_changed_paths)
+		flags |= COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS;
+	if (opts.enable_changed_paths == 1 ||
 	    git_env_bool(GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS, 0))
 		flags |= COMMIT_GRAPH_WRITE_BLOOM_FILTERS;
 
@@ -251,7 +254,7 @@
 			}
 		}
 
-
+		stop_progress(&progress);
 	}
 
 	if (write_commit_graph(odb,
@@ -264,8 +267,6 @@
 cleanup:
 	string_list_clear(&pack_indexes, 0);
 	strbuf_release(&buf);
-	if (progress)
-		stop_progress(&progress);
 	return result;
 }
 
diff --git a/builtin/config.c b/builtin/config.c
index ee4aef6..5e39f61 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -672,7 +672,7 @@
 		given_config_source.file = git_pathdup("config");
 		given_config_source.scope = CONFIG_SCOPE_LOCAL;
 	} else if (use_worktree_config) {
-		struct worktree **worktrees = get_worktrees(0);
+		struct worktree **worktrees = get_worktrees();
 		if (repository_format_worktree_config)
 			given_config_source.file = git_pathdup("config.worktree");
 		else if (worktrees[0] && worktrees[1])
diff --git a/builtin/diff.c b/builtin/diff.c
index 8c36da0..cb98811 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -355,9 +355,9 @@
 
 	sym->left = rev->pending.objects[lpos].name;
 	sym->right = rev->pending.objects[rpos].name;
-	sym->base = rev->pending.objects[basepos].name;
 	if (basecount == 0)
 		die(_("%s...%s: no merge base"), sym->left, sym->right);
+	sym->base = rev->pending.objects[basepos].name;
 	bitmap_unset(map, basepos);	/* unmark the base we want */
 	sym->warn = basecount > 1;
 	sym->skip = map;
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 8586816..9f37895 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -45,6 +45,7 @@
 static struct string_list tag_refs = STRING_LIST_INIT_NODUP;
 static struct refspec refspecs = REFSPEC_INIT_FETCH;
 static int anonymize;
+static struct hashmap anonymized_seeds;
 static struct revision_sources revision_sources;
 
 static int parse_opt_signed_tag_mode(const struct option *opt,
@@ -120,24 +121,33 @@
 
 struct anonymized_entry {
 	struct hashmap_entry hash;
+	const char *anon;
+	const char orig[FLEX_ARRAY];
+};
+
+struct anonymized_entry_key {
+	struct hashmap_entry hash;
 	const char *orig;
 	size_t orig_len;
-	const char *anon;
-	size_t anon_len;
 };
 
 static int anonymized_entry_cmp(const void *unused_cmp_data,
 				const struct hashmap_entry *eptr,
 				const struct hashmap_entry *entry_or_key,
-				const void *unused_keydata)
+				const void *keydata)
 {
 	const struct anonymized_entry *a, *b;
 
 	a = container_of(eptr, const struct anonymized_entry, hash);
-	b = container_of(entry_or_key, const struct anonymized_entry, hash);
+	if (keydata) {
+		const struct anonymized_entry_key *key = keydata;
+		int equal = !strncmp(a->orig, key->orig, key->orig_len) &&
+			    !a->orig[key->orig_len];
+		return !equal;
+	}
 
-	return a->orig_len != b->orig_len ||
-		memcmp(a->orig, b->orig, a->orig_len);
+	b = container_of(entry_or_key, const struct anonymized_entry, hash);
+	return strcmp(a->orig, b->orig);
 }
 
 /*
@@ -145,31 +155,39 @@
  * the same anonymized string with another. The actual generation
  * is farmed out to the generate function.
  */
-static const void *anonymize_mem(struct hashmap *map,
-				 void *(*generate)(const void *, size_t *),
-				 const void *orig, size_t *len)
+static const char *anonymize_str(struct hashmap *map,
+				 char *(*generate)(void *),
+				 const char *orig, size_t len,
+				 void *data)
 {
-	struct anonymized_entry key, *ret;
+	struct anonymized_entry_key key;
+	struct anonymized_entry *ret;
 
 	if (!map->cmpfn)
 		hashmap_init(map, anonymized_entry_cmp, NULL, 0);
 
-	hashmap_entry_init(&key.hash, memhash(orig, *len));
+	hashmap_entry_init(&key.hash, memhash(orig, len));
 	key.orig = orig;
-	key.orig_len = *len;
-	ret = hashmap_get_entry(map, &key, hash, NULL);
+	key.orig_len = len;
 
+	/* First check if it's a token the user configured manually... */
+	if (anonymized_seeds.cmpfn)
+		ret = hashmap_get_entry(&anonymized_seeds, &key, hash, &key);
+	else
+		ret = NULL;
+
+	/* ...otherwise check if we've already seen it in this context... */
+	if (!ret)
+		ret = hashmap_get_entry(map, &key, hash, &key);
+
+	/* ...and finally generate a new mapping if necessary */
 	if (!ret) {
-		ret = xmalloc(sizeof(*ret));
+		FLEX_ALLOC_MEM(ret, orig, orig, len);
 		hashmap_entry_init(&ret->hash, key.hash.hash);
-		ret->orig = xstrdup(orig);
-		ret->orig_len = *len;
-		ret->anon = generate(orig, len);
-		ret->anon_len = *len;
+		ret->anon = generate(data);
 		hashmap_put(map, &ret->hash);
 	}
 
-	*len = ret->anon_len;
 	return ret->anon;
 }
 
@@ -181,13 +199,13 @@
  */
 static void anonymize_path(struct strbuf *out, const char *path,
 			   struct hashmap *map,
-			   void *(*generate)(const void *, size_t *))
+			   char *(*generate)(void *))
 {
 	while (*path) {
 		const char *end_of_component = strchrnul(path, '/');
 		size_t len = end_of_component - path;
-		const char *c = anonymize_mem(map, generate, path, &len);
-		strbuf_add(out, c, len);
+		const char *c = anonymize_str(map, generate, path, len, NULL);
+		strbuf_addstr(out, c);
 		path = end_of_component;
 		if (*path)
 			strbuf_addch(out, *path++);
@@ -361,12 +379,12 @@
 		printf("%s", path);
 }
 
-static void *anonymize_path_component(const void *path, size_t *len)
+static char *anonymize_path_component(void *data)
 {
 	static int counter;
 	struct strbuf out = STRBUF_INIT;
 	strbuf_addf(&out, "path%d", counter++);
-	return strbuf_detach(&out, len);
+	return strbuf_detach(&out, NULL);
 }
 
 static void print_path(const char *path)
@@ -383,20 +401,23 @@
 	}
 }
 
-static void *generate_fake_oid(const void *old, size_t *len)
+static char *generate_fake_oid(void *data)
 {
 	static uint32_t counter = 1; /* avoid null oid */
 	const unsigned hashsz = the_hash_algo->rawsz;
-	unsigned char *out = xcalloc(hashsz, 1);
+	unsigned char out[GIT_MAX_RAWSZ];
+	char *hex = xmallocz(GIT_MAX_HEXSZ);
+
+	hashclr(out);
 	put_be32(out + hashsz - 4, counter++);
-	return out;
+	return hash_to_hex_algop_r(hex, out, the_hash_algo);
 }
 
-static const struct object_id *anonymize_oid(const struct object_id *oid)
+static const char *anonymize_oid(const char *oid_hex)
 {
 	static struct hashmap objs;
-	size_t len = the_hash_algo->rawsz;
-	return anonymize_mem(&objs, generate_fake_oid, oid, &len);
+	size_t len = strlen(oid_hex);
+	return anonymize_str(&objs, generate_fake_oid, oid_hex, len, NULL);
 }
 
 static void show_filemodify(struct diff_queue_struct *q,
@@ -455,9 +476,9 @@
 			 */
 			if (no_data || S_ISGITLINK(spec->mode))
 				printf("M %06o %s ", spec->mode,
-				       oid_to_hex(anonymize ?
-						  anonymize_oid(&spec->oid) :
-						  &spec->oid));
+				       anonymize ?
+				       anonymize_oid(oid_to_hex(&spec->oid)) :
+				       oid_to_hex(&spec->oid));
 			else {
 				struct object *object = lookup_object(the_repository,
 								      &spec->oid);
@@ -493,12 +514,12 @@
 	return bol;
 }
 
-static void *anonymize_ref_component(const void *old, size_t *len)
+static char *anonymize_ref_component(void *data)
 {
 	static int counter;
 	struct strbuf out = STRBUF_INIT;
 	strbuf_addf(&out, "ref%d", counter++);
-	return strbuf_detach(&out, len);
+	return strbuf_detach(&out, NULL);
 }
 
 static const char *anonymize_refname(const char *refname)
@@ -517,13 +538,6 @@
 	static struct strbuf anon = STRBUF_INIT;
 	int i;
 
-	/*
-	 * We also leave "master" as a special case, since it does not reveal
-	 * anything interesting.
-	 */
-	if (!strcmp(refname, "refs/heads/master"))
-		return refname;
-
 	strbuf_reset(&anon);
 	for (i = 0; i < ARRAY_SIZE(prefixes); i++) {
 		if (skip_prefix(refname, prefixes[i], &refname)) {
@@ -546,14 +560,13 @@
 	return xstrfmt("subject %d\n\nbody\n", counter++);
 }
 
-static struct hashmap idents;
-static void *anonymize_ident(const void *old, size_t *len)
+static char *anonymize_ident(void *data)
 {
 	static int counter;
 	struct strbuf out = STRBUF_INIT;
 	strbuf_addf(&out, "User %d <user%d@example.com>", counter, counter);
 	counter++;
-	return strbuf_detach(&out, len);
+	return strbuf_detach(&out, NULL);
 }
 
 /*
@@ -563,6 +576,7 @@
  */
 static void anonymize_ident_line(const char **beg, const char **end)
 {
+	static struct hashmap idents;
 	static struct strbuf buffers[] = { STRBUF_INIT, STRBUF_INIT };
 	static unsigned which_buffer;
 
@@ -588,9 +602,9 @@
 		size_t len;
 
 		len = split.mail_end - split.name_begin;
-		ident = anonymize_mem(&idents, anonymize_ident,
-				      split.name_begin, &len);
-		strbuf_add(out, ident, len);
+		ident = anonymize_str(&idents, anonymize_ident,
+				      split.name_begin, len, NULL);
+		strbuf_addstr(out, ident);
 		strbuf_addch(out, ' ');
 		strbuf_add(out, split.date_begin, split.tz_end - split.date_begin);
 	} else {
@@ -712,9 +726,10 @@
 		if (mark)
 			printf(":%d\n", mark);
 		else
-			printf("%s\n", oid_to_hex(anonymize ?
-						  anonymize_oid(&obj->oid) :
-						  &obj->oid));
+			printf("%s\n",
+			       anonymize ?
+			       anonymize_oid(oid_to_hex(&obj->oid)) :
+			       oid_to_hex(&obj->oid));
 		i++;
 	}
 
@@ -729,12 +744,12 @@
 	show_progress();
 }
 
-static void *anonymize_tag(const void *old, size_t *len)
+static char *anonymize_tag(void *data)
 {
 	static int counter;
 	struct strbuf out = STRBUF_INIT;
 	strbuf_addf(&out, "tag message %d", counter++);
-	return strbuf_detach(&out, len);
+	return strbuf_detach(&out, NULL);
 }
 
 static void handle_tail(struct object_array *commits, struct rev_info *revs,
@@ -804,8 +819,8 @@
 		name = anonymize_refname(name);
 		if (message) {
 			static struct hashmap tags;
-			message = anonymize_mem(&tags, anonymize_tag,
-						message, &message_size);
+			message = anonymize_str(&tags, anonymize_tag,
+						message, message_size, NULL);
 		}
 	}
 
@@ -1136,6 +1151,37 @@
 	}
 }
 
+static char *anonymize_seed(void *data)
+{
+	return xstrdup(data);
+}
+
+static int parse_opt_anonymize_map(const struct option *opt,
+				   const char *arg, int unset)
+{
+	struct hashmap *map = opt->value;
+	const char *delim, *value;
+	size_t keylen;
+
+	BUG_ON_OPT_NEG(unset);
+
+	delim = strchr(arg, ':');
+	if (delim) {
+		keylen = delim - arg;
+		value = delim + 1;
+	} else {
+		keylen = strlen(arg);
+		value = arg;
+	}
+
+	if (!keylen || !*value)
+		return error(_("--anonymize-map token cannot be empty"));
+
+	anonymize_str(map, anonymize_seed, arg, keylen, (void *)value);
+
+	return 0;
+}
+
 int cmd_fast_export(int argc, const char **argv, const char *prefix)
 {
 	struct rev_info revs;
@@ -1177,6 +1223,9 @@
 		OPT_STRING_LIST(0, "refspec", &refspecs_list, N_("refspec"),
 			     N_("Apply refspec to exported refs")),
 		OPT_BOOL(0, "anonymize", &anonymize, N_("anonymize output")),
+		OPT_CALLBACK_F(0, "anonymize-map", &anonymized_seeds, N_("from:to"),
+			       N_("convert <from> to <to> in anonymized output"),
+			       PARSE_OPT_NONEG, parse_opt_anonymize_map),
 		OPT_BOOL(0, "reference-excluded-parents",
 			 &reference_excluded_commits, N_("Reference parents which are not in fast-export stream by object id")),
 		OPT_BOOL(0, "show-original-ids", &show_original_ids,
@@ -1204,6 +1253,9 @@
 	if (argc > 1)
 		usage_with_options (fast_export_usage, options);
 
+	if (anonymized_seeds.cmpfn && !anonymize)
+		die(_("--anonymize-map without --anonymize does not make sense"));
+
 	if (refspecs_list.nr) {
 		int i;
 
diff --git a/builtin/fsck.c b/builtin/fsck.c
index f02cbdb..37aa07d 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -241,7 +241,7 @@
 		enum object_type type = oid_object_info(the_repository,
 							&obj->oid, NULL);
 		if (type > 0)
-			object_as_type(the_repository, obj, type, 0);
+			object_as_type(obj, type, 0);
 	}
 
 	options.walk = mark_used;
@@ -577,7 +577,7 @@
 
 	for_each_rawref(fsck_handle_ref, NULL);
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	for (p = worktrees; *p; p++) {
 		struct worktree *wt = *p;
 		struct strbuf ref = STRBUF_INIT;
diff --git a/builtin/grep.c b/builtin/grep.c
index a5056f3..5975cf5 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -466,7 +466,7 @@
 		struct strbuf base = STRBUF_INIT;
 
 		obj_read_lock();
-		object = parse_object_or_die(oid, oid_to_hex(oid));
+		object = parse_object_or_die(oid, NULL);
 		obj_read_unlock();
 		data = read_object_with_reference(&subrepo,
 						  &object->oid, tree_type,
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index f176dd2..f865666 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -1555,13 +1555,9 @@
 {
 	const uint32_t *idx1, *idx2;
 	uint32_t i;
-	const uint32_t hashwords = the_hash_algo->rawsz / sizeof(uint32_t);
 
 	/* The address of the 4-byte offset table */
-	idx1 = (((const uint32_t *)p->index_data)
-		+ 2 /* 8-byte header */
-		+ 256 /* fan out */
-		+ hashwords * p->num_objects /* object ID table */
+	idx1 = (((const uint32_t *)((const uint8_t *)p->index_data + p->crc_offset))
 		+ p->num_objects /* CRC32 table */
 		);
 
@@ -1671,6 +1667,7 @@
 	unsigned char pack_hash[GIT_MAX_RAWSZ];
 	unsigned foreign_nr = 1;	/* zero is a "good" value, assume bad */
 	int report_end_of_input = 0;
+	int hash_algo = 0;
 
 	/*
 	 * index-pack never needs to fetch missing objects except when
@@ -1764,6 +1761,11 @@
 					die(_("bad %s"), arg);
 			} else if (skip_prefix(arg, "--max-input-size=", &arg)) {
 				max_input_size = strtoumax(arg, NULL, 10);
+			} else if (skip_prefix(arg, "--object-format=", &arg)) {
+				hash_algo = hash_algo_by_name(arg);
+				if (hash_algo == GIT_HASH_UNKNOWN)
+					die(_("unknown hash algorithm '%s'"), arg);
+				repo_set_hash_algo(the_repository, hash_algo);
 			} else
 				usage(index_pack_usage);
 			continue;
@@ -1780,6 +1782,8 @@
 		die(_("--fix-thin cannot be used without --stdin"));
 	if (from_stdin && !startup_info->have_repository)
 		die(_("--stdin requires a git repository"));
+	if (from_stdin && hash_algo)
+		die(_("--object-format cannot be used with --stdin"));
 	if (!index_name && pack_name)
 		index_name = derive_filename(pack_name, "idx", &index_name_buf);
 
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 0b7222e..cee6482 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -203,6 +203,7 @@
 
 static int create_default_files(const char *template_path,
 				const char *original_git_dir,
+				const char *initial_branch,
 				const struct repository_format *fmt)
 {
 	struct stat st1;
@@ -258,15 +259,26 @@
 		die("failed to set up refs db: %s", err.buf);
 
 	/*
-	 * Create the default symlink from ".git/HEAD" to the "master"
-	 * branch, if it does not exist yet.
+	 * Point the HEAD symref to the initial branch with if HEAD does
+	 * not yet exist.
 	 */
 	path = git_path_buf(&buf, "HEAD");
 	reinit = (!access(path, R_OK)
 		  || readlink(path, junk, sizeof(junk)-1) != -1);
 	if (!reinit) {
-		if (create_symref("HEAD", "refs/heads/master", NULL) < 0)
+		char *ref;
+
+		if (!initial_branch)
+			initial_branch = git_default_branch_name();
+
+		ref = xstrfmt("refs/heads/%s", initial_branch);
+		if (check_refname_format(ref, 0) < 0)
+			die(_("invalid initial branch name: '%s'"),
+			    initial_branch);
+
+		if (create_symref("HEAD", ref, NULL) < 0)
 			exit(1);
+		free(ref);
 	}
 
 	initialize_repository_version(fmt->hash_algo);
@@ -383,7 +395,8 @@
 }
 
 int init_db(const char *git_dir, const char *real_git_dir,
-	    const char *template_dir, int hash, unsigned int flags)
+	    const char *template_dir, int hash, const char *initial_branch,
+	    unsigned int flags)
 {
 	int reinit;
 	int exist_ok = flags & INIT_DB_EXIST_OK;
@@ -425,7 +438,11 @@
 
 	validate_hash_algorithm(&repo_fmt, hash);
 
-	reinit = create_default_files(template_dir, original_git_dir, &repo_fmt);
+	reinit = create_default_files(template_dir, original_git_dir,
+				      initial_branch, &repo_fmt);
+	if (reinit && initial_branch)
+		warning(_("re-init: ignored --initial-branch=%s"),
+			initial_branch);
 
 	create_object_directory();
 
@@ -528,6 +545,7 @@
 	const char *template_dir = NULL;
 	unsigned int flags = 0;
 	const char *object_format = NULL;
+	const char *initial_branch = NULL;
 	int hash_algo = GIT_HASH_UNKNOWN;
 	const struct option init_db_options[] = {
 		OPT_STRING(0, "template", &template_dir, N_("template-directory"),
@@ -541,6 +559,8 @@
 		OPT_BIT('q', "quiet", &flags, N_("be quiet"), INIT_DB_QUIET),
 		OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
 			   N_("separate git dir from working tree")),
+		OPT_STRING('b', "initial-branch", &initial_branch, N_("name"),
+			   N_("override the name of the initial branch")),
 		OPT_STRING(0, "object-format", &object_format, N_("hash"),
 			   N_("specify the hash algorithm to use")),
 		OPT_END()
@@ -652,5 +672,6 @@
 	UNLEAK(work_tree);
 
 	flags |= INIT_DB_EXIST_OK;
-	return init_db(git_dir, real_git_dir, template_dir, hash_algo, flags);
+	return init_db(git_dir, real_git_dir, template_dir, hash_algo,
+		       initial_branch, flags);
 }
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 6ef5195..3a4dd12 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -118,6 +118,10 @@
 		transport->server_options = &server_options;
 
 	ref = transport_get_remote_refs(transport, &ref_prefixes);
+	if (ref) {
+		int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
+		repo_set_hash_algo(the_repository, hash_algo);
+	}
 	if (transport_disconnect(transport)) {
 		UNLEAK(sorting);
 		return 1;
diff --git a/builtin/mv.c b/builtin/mv.c
index be15ba7..7dac714 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -132,6 +132,7 @@
 	struct stat st;
 	struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
 	struct lock_file lock_file = LOCK_INIT;
+	struct cache_entry *ce;
 
 	git_config(git_default_config, NULL);
 
@@ -220,9 +221,11 @@
 				}
 				argc += last - first;
 			}
-		} else if (cache_name_pos(src, length) < 0)
+		} else if (!(ce = cache_file_exists(src, length, ignore_case))) {
 			bad = _("not under version control");
-		else if (lstat(dst, &st) == 0 &&
+		} else if (ce_stage(ce)) {
+			bad = _("conflicted");
+		} else if (lstat(dst, &st) == 0 &&
 			 (!ignore_case || strcasecmp(src, dst))) {
 			bad = _("destination exists");
 			if (force) {
diff --git a/builtin/pull.c b/builtin/pull.c
index 8e6572d..8159c5d 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -1025,7 +1025,8 @@
 			commit_list_insert(head, &list);
 			merge_head = lookup_commit_reference(the_repository,
 							     &merge_heads.oid[0]);
-			if (is_descendant_of(merge_head, list)) {
+			if (repo_is_descendant_of(the_repository,
+						  merge_head, list)) {
 				/* we can fast-forward this without invoking rebase */
 				opt_ff = "--ff-only";
 				ran_ff = 1;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index ea3d0f0..d43663b 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -249,6 +249,7 @@
 			strbuf_addf(&cap, " push-cert=%s", push_cert_nonce);
 		if (advertise_push_options)
 			strbuf_addstr(&cap, " push-options");
+		strbuf_addf(&cap, " object-format=%s", the_hash_algo->name);
 		strbuf_addf(&cap, " agent=%s", git_user_agent_sanitized());
 		packet_write_fmt(1, "%s %s%c%s\n",
 			     oid_to_hex(oid), path, 0, cap.buf);
@@ -1624,6 +1625,8 @@
 		linelen = strlen(reader->line);
 		if (linelen < reader->pktlen) {
 			const char *feature_list = reader->line + linelen + 1;
+			const char *hash = NULL;
+			int len = 0;
 			if (parse_feature_request(feature_list, "report-status"))
 				report_status = 1;
 			if (parse_feature_request(feature_list, "side-band-64k"))
@@ -1636,6 +1639,13 @@
 			if (advertise_push_options
 			    && parse_feature_request(feature_list, "push-options"))
 				use_push_options = 1;
+			hash = parse_feature_value(feature_list, "object-format", &len, NULL);
+			if (!hash) {
+				hash = hash_algos[GIT_HASH_SHA1].name;
+				len = strlen(hash);
+			}
+			if (xstrncmpz(the_hash_algo->name, hash, len))
+				die("error: unsupported object format '%s'", hash);
 		}
 
 		if (!strcmp(reader->line, "push-cert")) {
diff --git a/builtin/reflog.c b/builtin/reflog.c
index 52ecf6d..ca1d807 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -615,7 +615,7 @@
 		int i;
 
 		memset(&collected, 0, sizeof(collected));
-		worktrees = get_worktrees(0);
+		worktrees = get_worktrees();
 		for (p = worktrees; *p; p++) {
 			if (!all_worktrees && !(*p)->is_current)
 				continue;
diff --git a/builtin/show-index.c b/builtin/show-index.c
index 0826f6a..8106b03 100644
--- a/builtin/show-index.c
+++ b/builtin/show-index.c
@@ -1,9 +1,12 @@
 #include "builtin.h"
 #include "cache.h"
 #include "pack.h"
+#include "parse-options.h"
 
-static const char show_index_usage[] =
-"git show-index";
+static const char *const show_index_usage[] = {
+	"git show-index [--object-format=<hash-algorithm>]",
+	NULL
+};
 
 int cmd_show_index(int argc, const char **argv, const char *prefix)
 {
@@ -11,10 +14,26 @@
 	unsigned nr;
 	unsigned int version;
 	static unsigned int top_index[256];
-	const unsigned hashsz = the_hash_algo->rawsz;
+	unsigned hashsz;
+	const char *hash_name = NULL;
+	int hash_algo;
+	const struct option show_index_options[] = {
+		OPT_STRING(0, "object-format", &hash_name, N_("hash-algorithm"),
+			   N_("specify the hash algorithm to use")),
+		OPT_END()
+	};
 
-	if (argc != 1)
-		usage(show_index_usage);
+	argc = parse_options(argc, argv, prefix, show_index_options, show_index_usage, 0);
+
+	if (hash_name) {
+		hash_algo = hash_algo_by_name(hash_name);
+		if (hash_algo == GIT_HASH_UNKNOWN)
+			die(_("Unknown hash algorithm"));
+		repo_set_hash_algo(the_repository, hash_algo);
+	}
+
+	hashsz = the_hash_algo->rawsz;
+
 	if (fread(top_index, 2 * 4, 1, stdin) != 1)
 		die("unable to read header");
 	if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 59c1e12..a1c7560 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1981,7 +1981,7 @@
 	free(key);
 
 	if (!branch)
-		return "master";
+		return "HEAD";
 
 	if (!strcmp(branch, ".")) {
 		const char *refname = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 1238b6b..f0cbdef 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -325,7 +325,7 @@
 	struct strbuf sb_name = STRBUF_INIT;
 	struct worktree **worktrees;
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	check_candidate_path(path, opts->force, worktrees, "add");
 	free_worktrees(worktrees);
 	worktrees = NULL;
@@ -697,6 +697,23 @@
 	}
 }
 
+static int pathcmp(const void *a_, const void *b_)
+{
+	const struct worktree *const *a = a_;
+	const struct worktree *const *b = b_;
+	return fspathcmp((*a)->path, (*b)->path);
+}
+
+static void pathsort(struct worktree **wt)
+{
+	int n = 0;
+	struct worktree **p = wt;
+
+	while (*p++)
+		n++;
+	QSORT(wt, n, pathcmp);
+}
+
 static int list(int ac, const char **av, const char *prefix)
 {
 	int porcelain = 0;
@@ -710,9 +727,12 @@
 	if (ac)
 		usage_with_options(worktree_usage, options);
 	else {
-		struct worktree **worktrees = get_worktrees(GWT_SORT_LINKED);
+		struct worktree **worktrees = get_worktrees();
 		int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
 
+		/* sort worktrees by path but keep main worktree at top */
+		pathsort(worktrees + 1);
+
 		if (!porcelain)
 			measure_widths(worktrees, &abbrev, &path_maxlen);
 
@@ -741,7 +761,7 @@
 	if (ac != 1)
 		usage_with_options(worktree_usage, options);
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	wt = find_worktree(worktrees, prefix, av[0]);
 	if (!wt)
 		die(_("'%s' is not a working tree"), av[0]);
@@ -774,7 +794,7 @@
 	if (ac != 1)
 		usage_with_options(worktree_usage, options);
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	wt = find_worktree(worktrees, prefix, av[0]);
 	if (!wt)
 		die(_("'%s' is not a working tree"), av[0]);
@@ -848,7 +868,7 @@
 	strbuf_addstr(&dst, path);
 	free(path);
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	wt = find_worktree(worktrees, prefix, av[0]);
 	if (!wt)
 		die(_("'%s' is not a working tree"), av[0]);
@@ -974,7 +994,7 @@
 	if (ac != 1)
 		usage_with_options(worktree_usage, options);
 
-	worktrees = get_worktrees(0);
+	worktrees = get_worktrees();
 	wt = find_worktree(worktrees, prefix, av[0]);
 	if (!wt)
 		die(_("'%s' is not a working tree"), av[0]);
diff --git a/bundle.c b/bundle.c
index 99439e0..2a0d744 100644
--- a/bundle.c
+++ b/bundle.c
@@ -23,6 +23,17 @@
 	list->nr++;
 }
 
+static const struct git_hash_algo *detect_hash_algo(struct strbuf *buf)
+{
+	size_t len = strcspn(buf->buf, " \n");
+	int algo;
+
+	algo = hash_algo_by_length(len / 2);
+	if (algo == GIT_HASH_UNKNOWN)
+		return NULL;
+	return &hash_algos[algo];
+}
+
 static int parse_bundle_header(int fd, struct bundle_header *header,
 			       const char *report_path)
 {
@@ -52,12 +63,21 @@
 		}
 		strbuf_rtrim(&buf);
 
+		if (!header->hash_algo) {
+			header->hash_algo = detect_hash_algo(&buf);
+			if (!header->hash_algo) {
+				error(_("unknown hash algorithm length"));
+				status = -1;
+				break;
+			}
+		}
+
 		/*
 		 * Tip lines have object name, SP, and refname.
 		 * Prerequisites have object name that is optionally
 		 * followed by SP and subject line.
 		 */
-		if (parse_oid_hex(buf.buf, &oid, &p) ||
+		if (parse_oid_hex_algop(buf.buf, &oid, &p, header->hash_algo) ||
 		    (*p && !isspace(*p)) ||
 		    (!is_prereq && !*p)) {
 			if (report_path)
diff --git a/bundle.h b/bundle.h
index ceab0c7..2dc9442 100644
--- a/bundle.h
+++ b/bundle.h
@@ -15,6 +15,7 @@
 struct bundle_header {
 	struct ref_list prerequisites;
 	struct ref_list references;
+	const struct git_hash_algo *hash_algo;
 };
 
 int is_bundle(const char *path, int quiet);
diff --git a/cache.h b/cache.h
index e5885cc..0290849 100644
--- a/cache.h
+++ b/cache.h
@@ -628,7 +628,7 @@
 
 int init_db(const char *git_dir, const char *real_git_dir,
 	    const char *template_dir, int hash_algo,
-	    unsigned int flags);
+	    const char *initial_branch, unsigned int flags);
 void initialize_repository_version(int hash_algo);
 
 void sanitize_stdfds(void);
@@ -1042,9 +1042,9 @@
 	int worktree_config;
 	int is_bare;
 	int hash_algo;
-	int has_extensions;
 	char *work_tree;
 	struct string_list unknown_extensions;
+	struct string_list v1_only_extensions;
 };
 
 /*
@@ -1058,6 +1058,7 @@
 	.is_bare = -1, \
 	.hash_algo = GIT_HASH_SHA1, \
 	.unknown_extensions = STRING_LIST_INIT_DUP, \
+	.v1_only_extensions = STRING_LIST_INIT_DUP, \
 }
 
 /*
diff --git a/ci/lib.sh b/ci/lib.sh
index ff24c54..3eefec5 100755
--- a/ci/lib.sh
+++ b/ci/lib.sh
@@ -184,9 +184,9 @@
 	if [ "$jobname" = linux-gcc ]
 	then
 		export CC=gcc-8
-		MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=$(which python3)"
+		MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python3"
 	else
-		MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=$(which python2)"
+		MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python2"
 	fi
 
 	export GIT_TEST_HTTPD=true
diff --git a/column.c b/column.c
index 4a38eed..a58969b 100644
--- a/column.c
+++ b/column.c
@@ -107,7 +107,7 @@
 		printf("%s%s%s", indent, list->items[i].string, nl);
 }
 
-/* Print a cell to stdout with all necessary leading/traling space */
+/* Print a cell to stdout with all necessary leading/trailing space */
 static int display_cell(struct column_data *data, int initial_width,
 			const char *empty_cell, int x, int y)
 {
diff --git a/command-list.txt b/command-list.txt
index cbb960c..89aa60c 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -136,7 +136,7 @@
 git-pack-refs                           ancillarymanipulators
 git-parse-remote                        synchelpers
 git-patch-id                            purehelpers
-git-prune                               ancillarymanipulators
+git-prune                               ancillarymanipulators   complete
 git-prune-packed                        plumbingmanipulators
 git-pull                                mainporcelain           remote
 git-push                                mainporcelain           remote
diff --git a/commit-graph.c b/commit-graph.c
index 2ff042f..e51c91d 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -1,7 +1,5 @@
-#include "cache.h"
-#include "config.h"
-#include "dir.h"
 #include "git-compat-util.h"
+#include "config.h"
 #include "lockfile.h"
 #include "pack.h"
 #include "packfile.h"
@@ -19,6 +17,8 @@
 #include "bloom.h"
 #include "commit-slab.h"
 #include "shallow.h"
+#include "json-writer.h"
+#include "trace2.h"
 
 void git_test_write_commit_graph_or_die(void)
 {
@@ -87,15 +87,69 @@
 	       commit_pos_at(&commit_pos, b);
 }
 
+define_commit_slab(commit_graph_data_slab, struct commit_graph_data);
+static struct commit_graph_data_slab commit_graph_data_slab =
+	COMMIT_SLAB_INIT(1, commit_graph_data_slab);
+
+uint32_t commit_graph_position(const struct commit *c)
+{
+	struct commit_graph_data *data =
+		commit_graph_data_slab_peek(&commit_graph_data_slab, c);
+
+	return data ? data->graph_pos : COMMIT_NOT_FROM_GRAPH;
+}
+
+uint32_t commit_graph_generation(const struct commit *c)
+{
+	struct commit_graph_data *data =
+		commit_graph_data_slab_peek(&commit_graph_data_slab, c);
+
+	if (!data)
+		return GENERATION_NUMBER_INFINITY;
+	else if (data->graph_pos == COMMIT_NOT_FROM_GRAPH)
+		return GENERATION_NUMBER_INFINITY;
+
+	return data->generation;
+}
+
+static struct commit_graph_data *commit_graph_data_at(const struct commit *c)
+{
+	unsigned int i, nth_slab;
+	struct commit_graph_data *data =
+		commit_graph_data_slab_peek(&commit_graph_data_slab, c);
+
+	if (data)
+		return data;
+
+	nth_slab = c->index / commit_graph_data_slab.slab_size;
+	data = commit_graph_data_slab_at(&commit_graph_data_slab, c);
+
+	/*
+	 * commit-slab initializes elements with zero, overwrite this with
+	 * COMMIT_NOT_FROM_GRAPH for graph_pos.
+	 *
+	 * We avoid initializing generation with checking if graph position
+	 * is not COMMIT_NOT_FROM_GRAPH.
+	 */
+	for (i = 0; i < commit_graph_data_slab.slab_size; i++) {
+		commit_graph_data_slab.slab[nth_slab][i].graph_pos =
+			COMMIT_NOT_FROM_GRAPH;
+	}
+
+	return data;
+}
+
 static int commit_gen_cmp(const void *va, const void *vb)
 {
 	const struct commit *a = *(const struct commit **)va;
 	const struct commit *b = *(const struct commit **)vb;
 
+	uint32_t generation_a = commit_graph_generation(a);
+	uint32_t generation_b = commit_graph_generation(b);
 	/* lower generation commits first */
-	if (a->generation < b->generation)
+	if (generation_a < generation_b)
 		return -1;
-	else if (a->generation > b->generation)
+	else if (generation_a > generation_b)
 		return 1;
 
 	/* use date as a heuristic when generations are equal */
@@ -149,7 +203,8 @@
 	}
 
 	prepare_commit_graft(r);
-	if (r->parsed_objects && r->parsed_objects->grafts_nr)
+	if (r->parsed_objects &&
+	    (r->parsed_objects->grafts_nr || r->parsed_objects->substituted_parent))
 		return 0;
 	if (is_repository_shallow(r))
 		return 0;
@@ -230,8 +285,7 @@
 	const unsigned char *data, *chunk_lookup;
 	uint32_t i;
 	struct commit_graph *graph;
-	uint64_t last_chunk_offset;
-	uint32_t last_chunk_id;
+	uint64_t next_chunk_offset;
 	uint32_t graph_signature;
 	unsigned char graph_version, hash_version;
 
@@ -271,24 +325,26 @@
 	graph->data = graph_map;
 	graph->data_len = graph_size;
 
-	last_chunk_id = 0;
-	last_chunk_offset = 8;
+	if (graph_size < GRAPH_HEADER_SIZE +
+			 (graph->num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH +
+			 GRAPH_FANOUT_SIZE + the_hash_algo->rawsz) {
+		error(_("commit-graph file is too small to hold %u chunks"),
+		      graph->num_chunks);
+		free(graph);
+		return NULL;
+	}
+
 	chunk_lookup = data + 8;
+	next_chunk_offset = get_be64(chunk_lookup + 4);
 	for (i = 0; i < graph->num_chunks; i++) {
 		uint32_t chunk_id;
-		uint64_t chunk_offset;
+		uint64_t chunk_offset = next_chunk_offset;
 		int chunk_repeated = 0;
 
-		if (data + graph_size - chunk_lookup <
-		    GRAPH_CHUNKLOOKUP_WIDTH) {
-			error(_("commit-graph chunk lookup table entry missing; file may be incomplete"));
-			goto free_and_return;
-		}
-
 		chunk_id = get_be32(chunk_lookup + 0);
-		chunk_offset = get_be64(chunk_lookup + 4);
 
 		chunk_lookup += GRAPH_CHUNKLOOKUP_WIDTH;
+		next_chunk_offset = get_be64(chunk_lookup + 4);
 
 		if (chunk_offset > graph_size - the_hash_algo->rawsz) {
 			error(_("commit-graph improper chunk offset %08x%08x"), (uint32_t)(chunk_offset >> 32),
@@ -307,8 +363,11 @@
 		case GRAPH_CHUNKID_OIDLOOKUP:
 			if (graph->chunk_oid_lookup)
 				chunk_repeated = 1;
-			else
+			else {
 				graph->chunk_oid_lookup = data + chunk_offset;
+				graph->num_commits = (next_chunk_offset - chunk_offset)
+						     / graph->hash_len;
+			}
 			break;
 
 		case GRAPH_CHUNKID_DATA:
@@ -362,15 +421,6 @@
 			error(_("commit-graph chunk id %08x appears multiple times"), chunk_id);
 			goto free_and_return;
 		}
-
-		if (last_chunk_id == GRAPH_CHUNKID_OIDLOOKUP)
-		{
-			graph->num_commits = (chunk_offset - last_chunk_offset)
-					     / graph->hash_len;
-		}
-
-		last_chunk_id = chunk_id;
-		last_chunk_offset = chunk_offset;
 	}
 
 	if (graph->chunk_bloom_indexes && graph->chunk_bloom_data) {
@@ -569,10 +619,6 @@
 		return !!r->objects->commit_graph;
 	r->objects->commit_graph_attempted = 1;
 
-	if (git_env_bool(GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD, 0))
-		die("dying as requested by the '%s' variable on commit-graph load!",
-		    GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD);
-
 	prepare_repo_settings(r);
 
 	if (!git_env_bool(GIT_TEST_COMMIT_GRAPH, 0) &&
@@ -670,13 +716,14 @@
 	c = lookup_commit(r, &oid);
 	if (!c)
 		die(_("could not find commit %s"), oid_to_hex(&oid));
-	c->graph_pos = pos;
+	commit_graph_data_at(c)->graph_pos = pos;
 	return &commit_list_insert(c, pptr)->next;
 }
 
 static void fill_commit_graph_info(struct commit *item, struct commit_graph *g, uint32_t pos)
 {
 	const unsigned char *commit_data;
+	struct commit_graph_data *graph_data;
 	uint32_t lex_index;
 
 	while (pos < g->num_commits_in_base)
@@ -684,8 +731,10 @@
 
 	lex_index = pos - g->num_commits_in_base;
 	commit_data = g->chunk_commit_data + GRAPH_DATA_WIDTH * lex_index;
-	item->graph_pos = pos;
-	item->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
+
+	graph_data = commit_graph_data_at(item);
+	graph_data->graph_pos = pos;
+	graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
 }
 
 static inline void set_commit_tree(struct commit *c, struct tree *t)
@@ -701,6 +750,7 @@
 	uint32_t *parent_data_ptr;
 	uint64_t date_low, date_high;
 	struct commit_list **pptr;
+	struct commit_graph_data *graph_data;
 	const unsigned char *commit_data;
 	uint32_t lex_index;
 
@@ -714,7 +764,8 @@
 	 * Store the "full" position, but then use the
 	 * "local" position for the rest of the calculation.
 	 */
-	item->graph_pos = pos;
+	graph_data = commit_graph_data_at(item);
+	graph_data->graph_pos = pos;
 	lex_index = pos - g->num_commits_in_base;
 
 	commit_data = g->chunk_commit_data + (g->hash_len + 16) * lex_index;
@@ -727,7 +778,7 @@
 	date_low = get_be32(commit_data + g->hash_len + 12);
 	item->date = (timestamp_t)((date_high << 32) | date_low);
 
-	item->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
+	graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
 
 	pptr = &item->parents;
 
@@ -759,8 +810,9 @@
 
 static int find_commit_in_graph(struct commit *item, struct commit_graph *g, uint32_t *pos)
 {
-	if (item->graph_pos != COMMIT_NOT_FROM_GRAPH) {
-		*pos = item->graph_pos;
+	uint32_t graph_pos = commit_graph_position(item);
+	if (graph_pos != COMMIT_NOT_FROM_GRAPH) {
+		*pos = graph_pos;
 		return 1;
 	} else {
 		struct commit_graph *cur_g = g;
@@ -795,6 +847,14 @@
 
 int parse_commit_in_graph(struct repository *r, struct commit *item)
 {
+	static int checked_env = 0;
+
+	if (!checked_env &&
+	    git_env_bool(GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE, 0))
+		die("dying as requested by the '%s' variable on commit-graph parse!",
+		    GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE);
+	checked_env = 1;
+
 	if (!prepare_commit_graph(r))
 		return 0;
 	return parse_commit_in_graph_one(r, r->objects->commit_graph, item);
@@ -815,12 +875,13 @@
 {
 	struct object_id oid;
 	const unsigned char *commit_data;
+	uint32_t graph_pos = commit_graph_position(c);
 
-	while (c->graph_pos < g->num_commits_in_base)
+	while (graph_pos < g->num_commits_in_base)
 		g = g->base_graph;
 
 	commit_data = g->chunk_commit_data +
-			GRAPH_DATA_WIDTH * (c->graph_pos - g->num_commits_in_base);
+			GRAPH_DATA_WIDTH * (graph_pos - g->num_commits_in_base);
 
 	hashcpy(oid.hash, commit_data);
 	set_commit_tree(c, lookup_tree(r, &oid));
@@ -834,7 +895,7 @@
 {
 	if (c->maybe_tree)
 		return c->maybe_tree;
-	if (c->graph_pos == COMMIT_NOT_FROM_GRAPH)
+	if (commit_graph_position(c) == COMMIT_NOT_FROM_GRAPH)
 		BUG("get_commit_tree_in_graph_one called from non-commit-graph commit");
 
 	return load_tree_for_commit(r, g, (struct commit *)c);
@@ -886,10 +947,11 @@
 
 	const struct split_commit_graph_opts *split_opts;
 	size_t total_bloom_filter_data_size;
+	const struct bloom_filter_settings *bloom_settings;
 };
 
-static void write_graph_chunk_fanout(struct hashfile *f,
-				     struct write_commit_graph_context *ctx)
+static int write_graph_chunk_fanout(struct hashfile *f,
+				    struct write_commit_graph_context *ctx)
 {
 	int i, count = 0;
 	struct commit **list = ctx->commits.list;
@@ -910,17 +972,21 @@
 
 		hashwrite_be32(f, count);
 	}
+
+	return 0;
 }
 
-static void write_graph_chunk_oids(struct hashfile *f, int hash_len,
-				   struct write_commit_graph_context *ctx)
+static int write_graph_chunk_oids(struct hashfile *f,
+				  struct write_commit_graph_context *ctx)
 {
 	struct commit **list = ctx->commits.list;
 	int count;
 	for (count = 0; count < ctx->commits.nr; count++, list++) {
 		display_progress(ctx->progress, ++ctx->progress_cnt);
-		hashwrite(f, (*list)->object.oid.hash, (int)hash_len);
+		hashwrite(f, (*list)->object.oid.hash, the_hash_algo->rawsz);
 	}
+
+	return 0;
 }
 
 static const unsigned char *commit_to_sha1(size_t index, void *table)
@@ -929,8 +995,8 @@
 	return commits[index]->object.oid.hash;
 }
 
-static void write_graph_chunk_data(struct hashfile *f, int hash_len,
-				   struct write_commit_graph_context *ctx)
+static int write_graph_chunk_data(struct hashfile *f,
+				  struct write_commit_graph_context *ctx)
 {
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
@@ -947,7 +1013,7 @@
 			die(_("unable to parse commit %s"),
 				oid_to_hex(&(*list)->object.oid));
 		tree = get_commit_tree_oid(*list);
-		hashwrite(f, tree->hash, hash_len);
+		hashwrite(f, tree->hash, the_hash_algo->rawsz);
 
 		parent = (*list)->parents;
 
@@ -1020,17 +1086,19 @@
 		else
 			packedDate[0] = 0;
 
-		packedDate[0] |= htonl((*list)->generation << 2);
+		packedDate[0] |= htonl(commit_graph_data_at(*list)->generation << 2);
 
 		packedDate[1] = htonl((*list)->date);
 		hashwrite(f, packedDate, 8);
 
 		list++;
 	}
+
+	return 0;
 }
 
-static void write_graph_chunk_extra_edges(struct hashfile *f,
-					  struct write_commit_graph_context *ctx)
+static int write_graph_chunk_extra_edges(struct hashfile *f,
+					 struct write_commit_graph_context *ctx)
 {
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
@@ -1079,59 +1147,67 @@
 
 		list++;
 	}
+
+	return 0;
 }
 
-static void write_graph_chunk_bloom_indexes(struct hashfile *f,
-					    struct write_commit_graph_context *ctx)
+static int write_graph_chunk_bloom_indexes(struct hashfile *f,
+					   struct write_commit_graph_context *ctx)
 {
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
 	uint32_t cur_pos = 0;
-	struct progress *progress = NULL;
-	int i = 0;
-
-	if (ctx->report_progress)
-		progress = start_delayed_progress(
-			_("Writing changed paths Bloom filters index"),
-			ctx->commits.nr);
 
 	while (list < last) {
 		struct bloom_filter *filter = get_bloom_filter(ctx->r, *list, 0);
-		cur_pos += filter->len;
-		display_progress(progress, ++i);
+		size_t len = filter ? filter->len : 0;
+		cur_pos += len;
+		display_progress(ctx->progress, ++ctx->progress_cnt);
 		hashwrite_be32(f, cur_pos);
 		list++;
 	}
 
-	stop_progress(&progress);
+	return 0;
 }
 
-static void write_graph_chunk_bloom_data(struct hashfile *f,
-					 struct write_commit_graph_context *ctx,
-					 const struct bloom_filter_settings *settings)
+static void trace2_bloom_filter_settings(struct write_commit_graph_context *ctx)
+{
+	struct json_writer jw = JSON_WRITER_INIT;
+
+	jw_object_begin(&jw, 0);
+	jw_object_intmax(&jw, "hash_version", ctx->bloom_settings->hash_version);
+	jw_object_intmax(&jw, "num_hashes", ctx->bloom_settings->num_hashes);
+	jw_object_intmax(&jw, "bits_per_entry", ctx->bloom_settings->bits_per_entry);
+	jw_end(&jw);
+
+	trace2_data_json("bloom", ctx->r, "settings", &jw);
+
+	jw_release(&jw);
+}
+
+static int write_graph_chunk_bloom_data(struct hashfile *f,
+					struct write_commit_graph_context *ctx)
 {
 	struct commit **list = ctx->commits.list;
 	struct commit **last = ctx->commits.list + ctx->commits.nr;
-	struct progress *progress = NULL;
-	int i = 0;
 
-	if (ctx->report_progress)
-		progress = start_delayed_progress(
-			_("Writing changed paths Bloom filters data"),
-			ctx->commits.nr);
+	trace2_bloom_filter_settings(ctx);
 
-	hashwrite_be32(f, settings->hash_version);
-	hashwrite_be32(f, settings->num_hashes);
-	hashwrite_be32(f, settings->bits_per_entry);
+	hashwrite_be32(f, ctx->bloom_settings->hash_version);
+	hashwrite_be32(f, ctx->bloom_settings->num_hashes);
+	hashwrite_be32(f, ctx->bloom_settings->bits_per_entry);
 
 	while (list < last) {
 		struct bloom_filter *filter = get_bloom_filter(ctx->r, *list, 0);
-		display_progress(progress, ++i);
-		hashwrite(f, filter->data, filter->len * sizeof(unsigned char));
+		size_t len = filter ? filter->len : 0;
+
+		display_progress(ctx->progress, ++ctx->progress_cnt);
+		if (len)
+			hashwrite(f, filter->data, len * sizeof(unsigned char));
 		list++;
 	}
 
-	stop_progress(&progress);
+	return 0;
 }
 
 static int oid_compare(const void *_a, const void *_b)
@@ -1219,7 +1295,7 @@
 			continue;
 		if (ctx->split) {
 			if ((!parse_commit(commit) &&
-			     commit->graph_pos == COMMIT_NOT_FROM_GRAPH) ||
+			     commit_graph_position(commit) == COMMIT_NOT_FROM_GRAPH) ||
 			    flags == COMMIT_GRAPH_SPLIT_REPLACE)
 				add_missing_parents(ctx, commit);
 		} else if (!parse_commit_no_graph(commit))
@@ -1251,9 +1327,11 @@
 					_("Computing commit graph generation numbers"),
 					ctx->commits.nr);
 	for (i = 0; i < ctx->commits.nr; i++) {
+		uint32_t generation = commit_graph_data_at(ctx->commits.list[i])->generation;
+
 		display_progress(ctx->progress, i + 1);
-		if (ctx->commits.list[i]->generation != GENERATION_NUMBER_INFINITY &&
-		    ctx->commits.list[i]->generation != GENERATION_NUMBER_ZERO)
+		if (generation != GENERATION_NUMBER_INFINITY &&
+		    generation != GENERATION_NUMBER_ZERO)
 			continue;
 
 		commit_list_insert(ctx->commits.list[i], &list);
@@ -1264,22 +1342,26 @@
 			uint32_t max_generation = 0;
 
 			for (parent = current->parents; parent; parent = parent->next) {
-				if (parent->item->generation == GENERATION_NUMBER_INFINITY ||
-				    parent->item->generation == GENERATION_NUMBER_ZERO) {
+				generation = commit_graph_data_at(parent->item)->generation;
+
+				if (generation == GENERATION_NUMBER_INFINITY ||
+				    generation == GENERATION_NUMBER_ZERO) {
 					all_parents_computed = 0;
 					commit_list_insert(parent->item, &list);
 					break;
-				} else if (parent->item->generation > max_generation) {
-					max_generation = parent->item->generation;
+				} else if (generation > max_generation) {
+					max_generation = generation;
 				}
 			}
 
 			if (all_parents_computed) {
-				current->generation = max_generation + 1;
+				struct commit_graph_data *data = commit_graph_data_at(current);
+
+				data->generation = max_generation + 1;
 				pop_commit(&list);
 
-				if (current->generation > GENERATION_NUMBER_MAX)
-					current->generation = GENERATION_NUMBER_MAX;
+				if (data->generation > GENERATION_NUMBER_MAX)
+					data->generation = GENERATION_NUMBER_MAX;
 			}
 		}
 	}
@@ -1355,12 +1437,13 @@
 			_("Collecting referenced commits"), 0);
 
 	for_each_ref(add_ref_to_set, &data);
+
+	stop_progress(&data.progress);
+
 	result = write_commit_graph(odb, NULL, &commits,
 				    flags, split_opts);
 
 	oidset_clear(&commits);
-	if (data.progress)
-		stop_progress(&data.progress);
 	return result;
 }
 
@@ -1458,7 +1541,7 @@
 			if (ctx->split) {
 				struct commit *c = lookup_commit(ctx->r, &ctx->oids.list[i]);
 
-				if (!c || c->graph_pos != COMMIT_NOT_FROM_GRAPH)
+				if (!c || commit_graph_position(c) != COMMIT_NOT_FROM_GRAPH)
 					continue;
 			}
 
@@ -1492,7 +1575,7 @@
 		ctx->commits.list[ctx->commits.nr] = lookup_commit(ctx->r, &ctx->oids.list[i]);
 
 		if (ctx->split && flags != COMMIT_GRAPH_SPLIT_REPLACE &&
-		    ctx->commits.list[ctx->commits.nr]->graph_pos != COMMIT_NOT_FROM_GRAPH)
+		    commit_graph_position(ctx->commits.list[ctx->commits.nr]) != COMMIT_NOT_FROM_GRAPH)
 			continue;
 
 		if (ctx->split && flags == COMMIT_GRAPH_SPLIT_REPLACE)
@@ -1535,19 +1618,36 @@
 	return 0;
 }
 
+typedef int (*chunk_write_fn)(struct hashfile *f,
+			      struct write_commit_graph_context *ctx);
+
+struct chunk_info {
+	uint32_t id;
+	uint64_t size;
+	chunk_write_fn write_fn;
+};
+
 static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 {
 	uint32_t i;
 	int fd;
 	struct hashfile *f;
 	struct lock_file lk = LOCK_INIT;
-	uint32_t chunk_ids[MAX_NUM_CHUNKS + 1];
-	uint64_t chunk_offsets[MAX_NUM_CHUNKS + 1];
+	struct chunk_info chunks[MAX_NUM_CHUNKS + 1];
 	const unsigned hashsz = the_hash_algo->rawsz;
 	struct strbuf progress_title = STRBUF_INIT;
 	int num_chunks = 3;
+	uint64_t chunk_offset;
 	struct object_id file_hash;
-	const struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
+	struct bloom_filter_settings bloom_settings = DEFAULT_BLOOM_FILTER_SETTINGS;
+
+	if (!ctx->bloom_settings) {
+		bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
+							      bloom_settings.bits_per_entry);
+		bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
+							  bloom_settings.num_hashes);
+		ctx->bloom_settings = &bloom_settings;
+	}
 
 	if (ctx->split) {
 		struct strbuf tmp_file = STRBUF_INIT;
@@ -1593,51 +1693,41 @@
 		f = hashfd(lk.tempfile->fd, lk.tempfile->filename.buf);
 	}
 
-	chunk_ids[0] = GRAPH_CHUNKID_OIDFANOUT;
-	chunk_ids[1] = GRAPH_CHUNKID_OIDLOOKUP;
-	chunk_ids[2] = GRAPH_CHUNKID_DATA;
+	chunks[0].id = GRAPH_CHUNKID_OIDFANOUT;
+	chunks[0].size = GRAPH_FANOUT_SIZE;
+	chunks[0].write_fn = write_graph_chunk_fanout;
+	chunks[1].id = GRAPH_CHUNKID_OIDLOOKUP;
+	chunks[1].size = hashsz * ctx->commits.nr;
+	chunks[1].write_fn = write_graph_chunk_oids;
+	chunks[2].id = GRAPH_CHUNKID_DATA;
+	chunks[2].size = (hashsz + 16) * ctx->commits.nr;
+	chunks[2].write_fn = write_graph_chunk_data;
 	if (ctx->num_extra_edges) {
-		chunk_ids[num_chunks] = GRAPH_CHUNKID_EXTRAEDGES;
+		chunks[num_chunks].id = GRAPH_CHUNKID_EXTRAEDGES;
+		chunks[num_chunks].size = 4 * ctx->num_extra_edges;
+		chunks[num_chunks].write_fn = write_graph_chunk_extra_edges;
 		num_chunks++;
 	}
 	if (ctx->changed_paths) {
-		chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMINDEXES;
+		chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMINDEXES;
+		chunks[num_chunks].size = sizeof(uint32_t) * ctx->commits.nr;
+		chunks[num_chunks].write_fn = write_graph_chunk_bloom_indexes;
 		num_chunks++;
-		chunk_ids[num_chunks] = GRAPH_CHUNKID_BLOOMDATA;
+		chunks[num_chunks].id = GRAPH_CHUNKID_BLOOMDATA;
+		chunks[num_chunks].size = sizeof(uint32_t) * 3
+					  + ctx->total_bloom_filter_data_size;
+		chunks[num_chunks].write_fn = write_graph_chunk_bloom_data;
 		num_chunks++;
 	}
 	if (ctx->num_commit_graphs_after > 1) {
-		chunk_ids[num_chunks] = GRAPH_CHUNKID_BASE;
+		chunks[num_chunks].id = GRAPH_CHUNKID_BASE;
+		chunks[num_chunks].size = hashsz * (ctx->num_commit_graphs_after - 1);
+		chunks[num_chunks].write_fn = write_graph_chunk_base;
 		num_chunks++;
 	}
 
-	chunk_ids[num_chunks] = 0;
-
-	chunk_offsets[0] = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
-	chunk_offsets[1] = chunk_offsets[0] + GRAPH_FANOUT_SIZE;
-	chunk_offsets[2] = chunk_offsets[1] + hashsz * ctx->commits.nr;
-	chunk_offsets[3] = chunk_offsets[2] + (hashsz + 16) * ctx->commits.nr;
-
-	num_chunks = 3;
-	if (ctx->num_extra_edges) {
-		chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
-						4 * ctx->num_extra_edges;
-		num_chunks++;
-	}
-	if (ctx->changed_paths) {
-		chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
-						sizeof(uint32_t) * ctx->commits.nr;
-		num_chunks++;
-
-		chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
-						sizeof(uint32_t) * 3 + ctx->total_bloom_filter_data_size;
-		num_chunks++;
-	}
-	if (ctx->num_commit_graphs_after > 1) {
-		chunk_offsets[num_chunks + 1] = chunk_offsets[num_chunks] +
-						hashsz * (ctx->num_commit_graphs_after - 1);
-		num_chunks++;
-	}
+	chunks[num_chunks].id = 0;
+	chunks[num_chunks].size = 0;
 
 	hashwrite_be32(f, GRAPH_SIGNATURE);
 
@@ -1646,13 +1736,16 @@
 	hashwrite_u8(f, num_chunks);
 	hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
 
+	chunk_offset = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
 	for (i = 0; i <= num_chunks; i++) {
 		uint32_t chunk_write[3];
 
-		chunk_write[0] = htonl(chunk_ids[i]);
-		chunk_write[1] = htonl(chunk_offsets[i] >> 32);
-		chunk_write[2] = htonl(chunk_offsets[i] & 0xffffffff);
+		chunk_write[0] = htonl(chunks[i].id);
+		chunk_write[1] = htonl(chunk_offset >> 32);
+		chunk_write[2] = htonl(chunk_offset & 0xffffffff);
 		hashwrite(f, chunk_write, 12);
+
+		chunk_offset += chunks[i].size;
 	}
 
 	if (ctx->report_progress) {
@@ -1665,19 +1758,19 @@
 			progress_title.buf,
 			num_chunks * ctx->commits.nr);
 	}
-	write_graph_chunk_fanout(f, ctx);
-	write_graph_chunk_oids(f, hashsz, ctx);
-	write_graph_chunk_data(f, hashsz, ctx);
-	if (ctx->num_extra_edges)
-		write_graph_chunk_extra_edges(f, ctx);
-	if (ctx->changed_paths) {
-		write_graph_chunk_bloom_indexes(f, ctx);
-		write_graph_chunk_bloom_data(f, ctx, &bloom_settings);
+
+	for (i = 0; i < num_chunks; i++) {
+		uint64_t start_offset = f->total + f->offset;
+
+		if (chunks[i].write_fn(f, ctx))
+			return -1;
+
+		if (f->total + f->offset != start_offset + chunks[i].size)
+			BUG("expected to write %"PRId64" bytes to chunk %"PRIx32", but wrote %"PRId64" instead",
+			    chunks[i].size, chunks[i].id,
+			    f->total + f->offset - start_offset);
 	}
-	if (ctx->num_commit_graphs_after > 1 &&
-	    write_graph_chunk_base(f, ctx)) {
-		return -1;
-	}
+
 	stop_progress(&ctx->progress);
 	strbuf_release(&progress_title);
 
@@ -2011,9 +2104,23 @@
 	ctx->report_progress = flags & COMMIT_GRAPH_WRITE_PROGRESS ? 1 : 0;
 	ctx->split = flags & COMMIT_GRAPH_WRITE_SPLIT ? 1 : 0;
 	ctx->split_opts = split_opts;
-	ctx->changed_paths = flags & COMMIT_GRAPH_WRITE_BLOOM_FILTERS ? 1 : 0;
 	ctx->total_bloom_filter_data_size = 0;
 
+	if (flags & COMMIT_GRAPH_WRITE_BLOOM_FILTERS)
+		ctx->changed_paths = 1;
+	if (!(flags & COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS)) {
+		struct commit_graph *g;
+		prepare_commit_graph_one(ctx->r, ctx->odb);
+
+		g = ctx->r->objects->commit_graph;
+
+		/* We have changed-paths already. Keep them in the next graph */
+		if (g && g->chunk_bloom_data) {
+			ctx->changed_paths = 1;
+			ctx->bloom_settings = g->bloom_filter_settings;
+		}
+	}
+
 	if (ctx->split) {
 		struct commit_graph *g;
 		prepare_commit_graph(ctx->r);
@@ -2241,6 +2348,7 @@
 		struct commit *graph_commit, *odb_commit;
 		struct commit_list *graph_parents, *odb_parents;
 		uint32_t max_generation = 0;
+		uint32_t generation;
 
 		display_progress(progress, i + 1);
 		hashcpy(cur_oid.hash, g->chunk_oid_lookup + g->hash_len * i);
@@ -2279,8 +2387,9 @@
 					     oid_to_hex(&graph_parents->item->object.oid),
 					     oid_to_hex(&odb_parents->item->object.oid));
 
-			if (graph_parents->item->generation > max_generation)
-				max_generation = graph_parents->item->generation;
+			generation = commit_graph_generation(graph_parents->item);
+			if (generation > max_generation)
+				max_generation = generation;
 
 			graph_parents = graph_parents->next;
 			odb_parents = odb_parents->next;
@@ -2290,7 +2399,7 @@
 			graph_report(_("commit-graph parent list for commit %s terminates early"),
 				     oid_to_hex(&cur_oid));
 
-		if (!graph_commit->generation) {
+		if (!commit_graph_generation(graph_commit)) {
 			if (generation_zero == GENERATION_NUMBER_EXISTS)
 				graph_report(_("commit-graph has generation number zero for commit %s, but non-zero elsewhere"),
 					     oid_to_hex(&cur_oid));
@@ -2310,10 +2419,11 @@
 		if (max_generation == GENERATION_NUMBER_MAX)
 			max_generation--;
 
-		if (graph_commit->generation != max_generation + 1)
+		generation = commit_graph_generation(graph_commit);
+		if (generation != max_generation + 1)
 			graph_report(_("commit-graph generation for commit %s is %u != %u"),
 				     oid_to_hex(&cur_oid),
-				     graph_commit->generation,
+				     generation,
 				     max_generation + 1);
 
 		if (graph_commit->date != odb_commit->date)
diff --git a/commit-graph.h b/commit-graph.h
index 3ba0da1..09a9703 100644
--- a/commit-graph.h
+++ b/commit-graph.h
@@ -2,14 +2,11 @@
 #define COMMIT_GRAPH_H
 
 #include "git-compat-util.h"
-#include "repository.h"
-#include "string-list.h"
-#include "cache.h"
 #include "object-store.h"
 #include "oidset.h"
 
 #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH"
-#define GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD "GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD"
+#define GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE "GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE"
 #define GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS "GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS"
 
 /*
@@ -23,6 +20,9 @@
 
 struct commit;
 struct bloom_filter_settings;
+struct repository;
+struct raw_object_store;
+struct string_list;
 
 char *get_commit_graph_filename(struct object_directory *odb);
 int open_commit_graph(const char *graph_file, int *fd, struct stat *st);
@@ -92,6 +92,7 @@
 	COMMIT_GRAPH_WRITE_PROGRESS   = (1 << 1),
 	COMMIT_GRAPH_WRITE_SPLIT      = (1 << 2),
 	COMMIT_GRAPH_WRITE_BLOOM_FILTERS = (1 << 3),
+	COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS = (1 << 4),
 };
 
 enum commit_graph_split_flags {
@@ -135,4 +136,14 @@
  */
 void disable_commit_graph(struct repository *r);
 
+struct commit_graph_data {
+	uint32_t graph_pos;
+	uint32_t generation;
+};
+
+/*
+ * Commits should be parsed before accessing generation, graph positions.
+ */
+uint32_t commit_graph_generation(const struct commit *);
+uint32_t commit_graph_position(const struct commit *);
 #endif
diff --git a/commit-reach.c b/commit-reach.c
index 1761217..efd5925 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -58,14 +58,15 @@
 		struct commit *commit = prio_queue_get(&queue);
 		struct commit_list *parents;
 		int flags;
+		uint32_t generation = commit_graph_generation(commit);
 
-		if (min_generation && commit->generation > last_gen)
+		if (min_generation && generation > last_gen)
 			BUG("bad generation skip %8x > %8x at %s",
-			    commit->generation, last_gen,
+			    generation, last_gen,
 			    oid_to_hex(&commit->object.oid));
-		last_gen = commit->generation;
+		last_gen = generation;
 
-		if (commit->generation < min_generation)
+		if (generation < min_generation)
 			break;
 
 		flags = commit->object.flags & (PARENT1 | PARENT2 | STALE);
@@ -176,18 +177,20 @@
 		repo_parse_commit(r, array[i]);
 	for (i = 0; i < cnt; i++) {
 		struct commit_list *common;
-		uint32_t min_generation = array[i]->generation;
+		uint32_t min_generation = commit_graph_generation(array[i]);
 
 		if (redundant[i])
 			continue;
 		for (j = filled = 0; j < cnt; j++) {
+			uint32_t curr_generation;
 			if (i == j || redundant[j])
 				continue;
 			filled_index[filled] = j;
 			work[filled++] = array[j];
 
-			if (array[j]->generation < min_generation)
-				min_generation = array[j]->generation;
+			curr_generation = commit_graph_generation(array[j]);
+			if (curr_generation < min_generation)
+				min_generation = curr_generation;
 		}
 		common = paint_down_to_common(r, array[i], filled,
 					      work, min_generation);
@@ -283,9 +286,9 @@
 /*
  * Is "commit" a descendant of one of the elements on the "with_commit" list?
  */
-static int repo_is_descendant_of(struct repository *r,
-				 struct commit *commit,
-				 struct commit_list *with_commit)
+int repo_is_descendant_of(struct repository *r,
+			  struct commit *commit,
+			  struct commit_list *with_commit)
 {
 	if (!with_commit)
 		return 1;
@@ -310,11 +313,6 @@
 	}
 }
 
-int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
-{
-	return repo_is_descendant_of(the_repository, commit, with_commit);
-}
-
 /*
  * Is "commit" an ancestor of one of the "references"?
  */
@@ -323,23 +321,26 @@
 {
 	struct commit_list *bases;
 	int ret = 0, i;
-	uint32_t min_generation = GENERATION_NUMBER_INFINITY;
+	uint32_t generation, min_generation = GENERATION_NUMBER_INFINITY;
 
 	if (repo_parse_commit(r, commit))
 		return ret;
 	for (i = 0; i < nr_reference; i++) {
 		if (repo_parse_commit(r, reference[i]))
 			return ret;
-		if (reference[i]->generation < min_generation)
-			min_generation = reference[i]->generation;
+
+		generation = commit_graph_generation(reference[i]);
+		if (generation < min_generation)
+			min_generation = generation;
 	}
 
-	if (commit->generation > min_generation)
+	generation = commit_graph_generation(commit);
+	if (generation > min_generation)
 		return ret;
 
 	bases = paint_down_to_common(r, commit,
 				     nr_reference, reference,
-				     commit->generation);
+				     generation);
 	if (commit->object.flags & PARENT2)
 		ret = 1;
 	clear_commit_marks(commit, all_flags);
@@ -433,7 +434,8 @@
 		return 0;
 
 	commit_list_insert(old_commit, &old_commit_list);
-	ret = is_descendant_of(new_commit, old_commit_list);
+	ret = repo_is_descendant_of(the_repository,
+				    new_commit, old_commit_list);
 	free_commit_list(old_commit_list);
 	return ret;
 }
@@ -485,7 +487,7 @@
 	/* Otherwise, we don't know; prepare to recurse */
 	parse_commit_or_die(candidate);
 
-	if (candidate->generation < cutoff)
+	if (commit_graph_generation(candidate) < cutoff)
 		return CONTAINS_NO;
 
 	return CONTAINS_UNKNOWN;
@@ -508,10 +510,12 @@
 	const struct commit_list *p;
 
 	for (p = want; p; p = p->next) {
+		uint32_t generation;
 		struct commit *c = p->item;
 		load_commit_graph_info(the_repository, c);
-		if (c->generation < cutoff)
-			cutoff = c->generation;
+		generation = commit_graph_generation(c);
+		if (generation < cutoff)
+			cutoff = generation;
 	}
 
 	result = contains_test(candidate, want, cache, cutoff);
@@ -554,7 +558,7 @@
 {
 	if (filter->with_commit_tag_algo)
 		return contains_tag_algo(commit, list, cache) == CONTAINS_YES;
-	return is_descendant_of(commit, list);
+	return repo_is_descendant_of(the_repository, commit, list);
 }
 
 static int compare_commits_by_gen(const void *_a, const void *_b)
@@ -562,9 +566,12 @@
 	const struct commit *a = *(const struct commit * const *)_a;
 	const struct commit *b = *(const struct commit * const *)_b;
 
-	if (a->generation < b->generation)
+	uint32_t generation_a = commit_graph_generation(a);
+	uint32_t generation_b = commit_graph_generation(b);
+
+	if (generation_a < generation_b)
 		return -1;
-	if (a->generation > b->generation)
+	if (generation_a > generation_b)
 		return 1;
 	return 0;
 }
@@ -603,7 +610,7 @@
 
 		list[nr_commits] = (struct commit *)from_one;
 		if (parse_commit(list[nr_commits]) ||
-		    list[nr_commits]->generation < min_generation) {
+		    commit_graph_generation(list[nr_commits]) < min_generation) {
 			result = 0;
 			goto cleanup;
 		}
@@ -639,7 +646,7 @@
 
 					if (parse_commit(parent->item) ||
 					    parent->item->date < min_commit_date ||
-					    parent->item->generation < min_generation)
+					    commit_graph_generation(parent->item) < min_generation)
 						continue;
 
 					commit_list_insert(parent->item, &stack);
@@ -680,11 +687,13 @@
 		add_object_array(&from_iter->item->object, NULL, &from_objs);
 
 		if (!parse_commit(from_iter->item)) {
+			uint32_t generation;
 			if (from_iter->item->date < min_commit_date)
 				min_commit_date = from_iter->item->date;
 
-			if (from_iter->item->generation < min_generation)
-				min_generation = from_iter->item->generation;
+			generation = commit_graph_generation(from_iter->item);
+			if (generation < min_generation)
+				min_generation = generation;
 		}
 
 		from_iter = from_iter->next;
@@ -692,11 +701,13 @@
 
 	while (to_iter) {
 		if (!parse_commit(to_iter->item)) {
+			uint32_t generation;
 			if (to_iter->item->date < min_commit_date)
 				min_commit_date = to_iter->item->date;
 
-			if (to_iter->item->generation < min_generation)
-				min_generation = to_iter->item->generation;
+			generation = commit_graph_generation(to_iter->item);
+			if (generation < min_generation)
+				min_generation = generation;
 		}
 
 		to_iter->item->object.flags |= PARENT2;
@@ -736,11 +747,13 @@
 	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
 
 	for (item = to; item < to_last; item++) {
+		uint32_t generation;
 		struct commit *c = *item;
 
 		parse_commit(c);
-		if (c->generation < min_generation)
-			min_generation = c->generation;
+		generation = commit_graph_generation(c);
+		if (generation < min_generation)
+			min_generation = generation;
 
 		if (!(c->object.flags & PARENT1)) {
 			c->object.flags |= PARENT1;
@@ -773,7 +786,7 @@
 
 			parse_commit(p);
 
-			if (p->generation < min_generation)
+			if (commit_graph_generation(p) < min_generation)
 				continue;
 
 			if (p->object.flags & PARENT2)
diff --git a/commit-reach.h b/commit-reach.h
index 99a43e8..b49ad71 100644
--- a/commit-reach.h
+++ b/commit-reach.h
@@ -27,7 +27,9 @@
 
 struct commit_list *get_octopus_merge_bases(struct commit_list *in);
 
-int is_descendant_of(struct commit *commit, struct commit_list *with_commit);
+int repo_is_descendant_of(struct repository *r,
+			  struct commit *commit,
+			  struct commit_list *with_commit);
 int repo_in_merge_bases(struct repository *r,
 			struct commit *commit,
 			struct commit *reference);
diff --git a/commit-slab-decl.h b/commit-slab-decl.h
index bfbed15..98de2c9 100644
--- a/commit-slab-decl.h
+++ b/commit-slab-decl.h
@@ -32,6 +32,7 @@
 void init_ ##slabname## _with_stride(struct slabname *s, unsigned stride); \
 void init_ ##slabname(struct slabname *s);				\
 void clear_ ##slabname(struct slabname *s);				\
+void deep_clear_ ##slabname(struct slabname *s, void (*free_fn)(elemtype *ptr)); \
 elemtype *slabname## _at_peek(struct slabname *s, const struct commit *c, int add_if_missing); \
 elemtype *slabname## _at(struct slabname *s, const struct commit *c);	\
 elemtype *slabname## _peek(struct slabname *s, const struct commit *c)
diff --git a/commit-slab-impl.h b/commit-slab-impl.h
index 5c0eb91..557738d 100644
--- a/commit-slab-impl.h
+++ b/commit-slab-impl.h
@@ -38,6 +38,19 @@
 	FREE_AND_NULL(s->slab);						\
 }									\
 									\
+scope void deep_clear_ ##slabname(struct slabname *s, void (*free_fn)(elemtype *)) \
+{									\
+	unsigned int i;							\
+	for (i = 0; i < s->slab_count; i++) {				\
+		unsigned int j;						\
+		if (!s->slab[i])					\
+			continue;					\
+		for (j = 0; j < s->slab_size; j++)			\
+			free_fn(&s->slab[i][j * s->stride]);		\
+	}								\
+	clear_ ##slabname(s);						\
+}									\
+									\
 scope elemtype *slabname## _at_peek(struct slabname *s,			\
 						  const struct commit *c, \
 						  int add_if_missing)   \
diff --git a/commit-slab.h b/commit-slab.h
index 05b3f28..8e72a30 100644
--- a/commit-slab.h
+++ b/commit-slab.h
@@ -47,6 +47,16 @@
  *
  *   Call this function before the slab falls out of scope to avoid
  *   leaking memory.
+ *
+ * - void deep_clear_indegree(struct indegree *, void (*free_fn)(int*))
+ *
+ *   Empties the slab, similar to clear_indegree(), but in addition it
+ *   calls the given 'free_fn' for each slab entry to release any
+ *   additional memory that might be owned by the entry (but not the
+ *   entry itself!).
+ *   Note that 'free_fn' might be called even for entries for which no
+ *   indegree_at() call has been made; in this case 'free_fn' is invoked
+ *   with a pointer to a zero-initialized location.
  */
 
 #define define_commit_slab(slabname, elemtype) \
diff --git a/commit.c b/commit.c
index 87686a7..7128895 100644
--- a/commit.c
+++ b/commit.c
@@ -37,7 +37,7 @@
 
 	if (!obj)
 		return NULL;
-	return object_as_type(r, obj, OBJ_COMMIT, quiet);
+	return object_as_type(obj, OBJ_COMMIT, quiet);
 }
 
 struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid)
@@ -62,7 +62,7 @@
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_commit_node(r));
-	return object_as_type(r, obj, OBJ_COMMIT, 0);
+	return object_as_type(obj, OBJ_COMMIT, 0);
 }
 
 struct commit *lookup_commit_reference_by_name(const char *name)
@@ -339,7 +339,7 @@
 	if (commit->maybe_tree || !commit->object.parsed)
 		return commit->maybe_tree;
 
-	if (commit->graph_pos != COMMIT_NOT_FROM_GRAPH)
+	if (commit_graph_position(commit) != COMMIT_NOT_FROM_GRAPH)
 		return get_commit_tree_in_graph(r, commit);
 
 	return NULL;
@@ -423,6 +423,8 @@
 	pptr = &item->parents;
 
 	graft = lookup_commit_graft(r, &item->object.oid);
+	if (graft)
+		r->parsed_objects->substituted_parent = 1;
 	while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) {
 		struct commit *new_parent;
 
@@ -729,11 +731,13 @@
 int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, void *unused)
 {
 	const struct commit *a = a_, *b = b_;
+	const uint32_t generation_a = commit_graph_generation(a),
+		       generation_b = commit_graph_generation(b);
 
 	/* newer commits first */
-	if (a->generation < b->generation)
+	if (generation_a < generation_b)
 		return 1;
-	else if (a->generation > b->generation)
+	else if (generation_a > generation_b)
 		return -1;
 
 	/* use date as a heuristic when generations are equal */
diff --git a/commit.h b/commit.h
index 1b2dea5..e901538 100644
--- a/commit.h
+++ b/commit.h
@@ -36,8 +36,6 @@
 	 * or get_commit_tree_oid().
 	 */
 	struct tree *maybe_tree;
-	uint32_t graph_pos;
-	uint32_t generation;
 	unsigned int index;
 };
 
diff --git a/connect.c b/connect.c
index 0df45a1..e0d5b9f 100644
--- a/connect.c
+++ b/connect.c
@@ -18,7 +18,7 @@
 
 static char *server_capabilities_v1;
 static struct argv_array server_capabilities_v2 = ARGV_ARRAY_INIT;
-static const char *parse_feature_value(const char *, const char *, int *);
+static const char *next_server_feature_value(const char *feature, int *len, int *offset);
 
 static int check_ref(const char *name, unsigned int flags)
 {
@@ -83,6 +83,21 @@
 	return 0;
 }
 
+int server_feature_v2(const char *c, const char **v)
+{
+	int i;
+
+	for (i = 0; i < server_capabilities_v2.argc; i++) {
+		const char *out;
+		if (skip_prefix(server_capabilities_v2.argv[i], c, &out) &&
+		    (*out == '=')) {
+			*v = out + 1;
+			return 1;
+		}
+	}
+	return 0;
+}
+
 int server_supports_feature(const char *c, const char *feature,
 			    int die_on_error)
 {
@@ -181,17 +196,16 @@
 static void annotate_refs_with_symref_info(struct ref *ref)
 {
 	struct string_list symref = STRING_LIST_INIT_DUP;
-	const char *feature_list = server_capabilities_v1;
+	int offset = 0;
 
-	while (feature_list) {
+	while (1) {
 		int len;
 		const char *val;
 
-		val = parse_feature_value(feature_list, "symref", &len);
+		val = next_server_feature_value("symref", &len, &offset);
 		if (!val)
 			break;
 		parse_one_symref_info(&symref, val, len);
-		feature_list = val + 1;
 	}
 	string_list_sort(&symref);
 
@@ -205,21 +219,36 @@
 	string_list_clear(&symref, 0);
 }
 
-static void process_capabilities(const char *line, int *len)
+static void process_capabilities(struct packet_reader *reader, int *linelen)
 {
+	const char *feat_val;
+	int feat_len;
+	const char *line = reader->line;
 	int nul_location = strlen(line);
-	if (nul_location == *len)
+	if (nul_location == *linelen)
 		return;
 	server_capabilities_v1 = xstrdup(line + nul_location + 1);
-	*len = nul_location;
+	*linelen = nul_location;
+
+	feat_val = server_feature_value("object-format", &feat_len);
+	if (feat_val) {
+		char *hash_name = xstrndup(feat_val, feat_len);
+		int hash_algo = hash_algo_by_name(hash_name);
+		if (hash_algo != GIT_HASH_UNKNOWN)
+			reader->hash_algo = &hash_algos[hash_algo];
+		free(hash_name);
+	} else {
+		reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
+	}
 }
 
-static int process_dummy_ref(const char *line)
+static int process_dummy_ref(const struct packet_reader *reader)
 {
+	const char *line = reader->line;
 	struct object_id oid;
 	const char *name;
 
-	if (parse_oid_hex(line, &oid, &name))
+	if (parse_oid_hex_algop(line, &oid, &name, reader->hash_algo))
 		return 0;
 	if (*name != ' ')
 		return 0;
@@ -235,13 +264,15 @@
 			line + strlen(line));
 }
 
-static int process_ref(const char *line, int len, struct ref ***list,
-		       unsigned int flags, struct oid_array *extra_have)
+static int process_ref(const struct packet_reader *reader, int len,
+		       struct ref ***list, unsigned int flags,
+		       struct oid_array *extra_have)
 {
+	const char *line = reader->line;
 	struct object_id old_oid;
 	const char *name;
 
-	if (parse_oid_hex(line, &old_oid, &name))
+	if (parse_oid_hex_algop(line, &old_oid, &name, reader->hash_algo))
 		return 0;
 	if (*name != ' ')
 		return 0;
@@ -261,16 +292,17 @@
 	return 1;
 }
 
-static int process_shallow(const char *line, int len,
+static int process_shallow(const struct packet_reader *reader, int len,
 			   struct oid_array *shallow_points)
 {
+	const char *line = reader->line;
 	const char *arg;
 	struct object_id old_oid;
 
 	if (!skip_prefix(line, "shallow ", &arg))
 		return 0;
 
-	if (get_oid_hex(arg, &old_oid))
+	if (get_oid_hex_algop(arg, &old_oid, reader->hash_algo))
 		die(_("protocol error: expected shallow sha-1, got '%s'"), arg);
 	if (!shallow_points)
 		die(_("repository on the other end cannot be shallow"));
@@ -317,20 +349,20 @@
 
 		switch (state) {
 		case EXPECTING_FIRST_REF:
-			process_capabilities(reader->line, &len);
-			if (process_dummy_ref(reader->line)) {
+			process_capabilities(reader, &len);
+			if (process_dummy_ref(reader)) {
 				state = EXPECTING_SHALLOW;
 				break;
 			}
 			state = EXPECTING_REF;
 			/* fallthrough */
 		case EXPECTING_REF:
-			if (process_ref(reader->line, len, &list, flags, extra_have))
+			if (process_ref(reader, len, &list, flags, extra_have))
 				break;
 			state = EXPECTING_SHALLOW;
 			/* fallthrough */
 		case EXPECTING_SHALLOW:
-			if (process_shallow(reader->line, len, shallow_points))
+			if (process_shallow(reader, len, shallow_points))
 				break;
 			die(_("protocol error: unexpected '%s'"), reader->line);
 		case EXPECTING_DONE:
@@ -344,7 +376,7 @@
 }
 
 /* Returns 1 when a valid ref has been added to `list`, 0 otherwise */
-static int process_ref_v2(const char *line, struct ref ***list)
+static int process_ref_v2(struct packet_reader *reader, struct ref ***list)
 {
 	int ret = 1;
 	int i = 0;
@@ -352,6 +384,7 @@
 	struct ref *ref;
 	struct string_list line_sections = STRING_LIST_INIT_DUP;
 	const char *end;
+	const char *line = reader->line;
 
 	/*
 	 * Ref lines have a number of fields which are space deliminated.  The
@@ -364,7 +397,7 @@
 		goto out;
 	}
 
-	if (parse_oid_hex(line_sections.items[i++].string, &old_oid, &end) ||
+	if (parse_oid_hex_algop(line_sections.items[i++].string, &old_oid, &end, reader->hash_algo) ||
 	    *end) {
 		ret = 0;
 		goto out;
@@ -372,7 +405,7 @@
 
 	ref = alloc_ref(line_sections.items[i++].string);
 
-	oidcpy(&ref->old_oid, &old_oid);
+	memcpy(ref->old_oid.hash, old_oid.hash, reader->hash_algo->rawsz);
 	**list = ref;
 	*list = &ref->next;
 
@@ -385,7 +418,8 @@
 			struct object_id peeled_oid;
 			char *peeled_name;
 			struct ref *peeled;
-			if (parse_oid_hex(arg, &peeled_oid, &end) || *end) {
+			if (parse_oid_hex_algop(arg, &peeled_oid, &end,
+						reader->hash_algo) || *end) {
 				ret = 0;
 				goto out;
 			}
@@ -393,7 +427,8 @@
 			peeled_name = xstrfmt("%s^{}", ref->name);
 			peeled = alloc_ref(peeled_name);
 
-			oidcpy(&peeled->old_oid, &peeled_oid);
+			memcpy(peeled->old_oid.hash, peeled_oid.hash,
+			       reader->hash_algo->rawsz);
 			**list = peeled;
 			*list = &peeled->next;
 
@@ -423,6 +458,7 @@
 			     int stateless_rpc)
 {
 	int i;
+	const char *hash_name;
 	*list = NULL;
 
 	if (server_supports_v2("ls-refs", 1))
@@ -431,6 +467,16 @@
 	if (server_supports_v2("agent", 0))
 		packet_write_fmt(fd_out, "agent=%s", git_user_agent_sanitized());
 
+	if (server_feature_v2("object-format", &hash_name)) {
+		int hash_algo = hash_algo_by_name(hash_name);
+		if (hash_algo == GIT_HASH_UNKNOWN)
+			die(_("unknown object format '%s' specified by server"), hash_name);
+		reader->hash_algo = &hash_algos[hash_algo];
+		packet_write_fmt(fd_out, "object-format=%s", reader->hash_algo->name);
+	} else {
+		reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
+	}
+
 	if (server_options && server_options->nr &&
 	    server_supports_v2("server-option", 1))
 		for (i = 0; i < server_options->nr; i++)
@@ -450,7 +496,7 @@
 
 	/* Process response from server */
 	while (packet_reader_read(reader) == PACKET_READ_NORMAL) {
-		if (!process_ref_v2(reader->line, &list))
+		if (!process_ref_v2(reader, &list))
 			die(_("invalid ls-refs response: %s"), reader->line);
 	}
 
@@ -463,7 +509,7 @@
 	return list;
 }
 
-static const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp)
+const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp, int *offset)
 {
 	int len;
 
@@ -471,6 +517,8 @@
 		return NULL;
 
 	len = strlen(feature);
+	if (offset)
+		feature_list += *offset;
 	while (*feature_list) {
 		const char *found = strstr(feature_list, feature);
 		if (!found)
@@ -485,9 +533,14 @@
 			}
 			/* feature with a value (e.g., "agent=git/1.2.3") */
 			else if (*value == '=') {
+				int end;
+
 				value++;
+				end = strcspn(value, " \t\n");
 				if (lenp)
-					*lenp = strcspn(value, " \t\n");
+					*lenp = end;
+				if (offset)
+					*offset = value + end - feature_list;
 				return value;
 			}
 			/*
@@ -500,14 +553,41 @@
 	return NULL;
 }
 
+int server_supports_hash(const char *desired, int *feature_supported)
+{
+	int offset = 0;
+	int len;
+	const char *hash;
+
+	hash = next_server_feature_value("object-format", &len, &offset);
+	if (feature_supported)
+		*feature_supported = !!hash;
+	if (!hash) {
+		hash = hash_algos[GIT_HASH_SHA1].name;
+		len = strlen(hash);
+	}
+	while (hash) {
+		if (!xstrncmpz(desired, hash, len))
+			return 1;
+
+		hash = next_server_feature_value("object-format", &len, &offset);
+	}
+	return 0;
+}
+
 int parse_feature_request(const char *feature_list, const char *feature)
 {
-	return !!parse_feature_value(feature_list, feature, NULL);
+	return !!parse_feature_value(feature_list, feature, NULL, NULL);
+}
+
+static const char *next_server_feature_value(const char *feature, int *len, int *offset)
+{
+	return parse_feature_value(server_capabilities_v1, feature, len, offset);
 }
 
 const char *server_feature_value(const char *feature, int *len)
 {
-	return parse_feature_value(server_capabilities_v1, feature, len);
+	return parse_feature_value(server_capabilities_v1, feature, len, NULL);
 }
 
 int server_supports(const char *feature)
diff --git a/connect.h b/connect.h
index 235bc66..c53586e 100644
--- a/connect.h
+++ b/connect.h
@@ -18,7 +18,10 @@
 struct packet_reader;
 enum protocol_version discover_version(struct packet_reader *reader);
 
+int server_supports_hash(const char *desired, int *feature_supported);
+const char *parse_feature_value(const char *feature_list, const char *feature, int *lenp, int *offset);
 int server_supports_v2(const char *c, int die_on_error);
+int server_feature_v2(const char *c, const char **v);
 int server_supports_feature(const char *c, const char *feature,
 			    int die_on_error);
 
diff --git a/contrib/coccinelle/commit.cocci b/contrib/coccinelle/commit.cocci
index 778e470..af6dd4c 100644
--- a/contrib/coccinelle/commit.cocci
+++ b/contrib/coccinelle/commit.cocci
@@ -32,3 +32,21 @@
 - c->maybe_tree
 + repo_get_commit_tree(specify_the_right_repo_here, c)
   ...>}
+
+@@
+struct commit *c;
+expression E;
+@@
+(
+- c->generation = E;
++ commit_graph_data_at(c)->generation = E;
+|
+- c->graph_pos = E;
++ commit_graph_data_at(c)->graph_pos = E;
+|
+- c->generation
++ commit_graph_generation(c)
+|
+- c->graph_pos
++ commit_graph_position(c)
+)
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index de5d0fb..ee468ea 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -50,7 +50,7 @@
 # variable.
 __git_find_repo_path ()
 {
-	if [ -n "$__git_repo_path" ]; then
+	if [ -n "${__git_repo_path-}" ]; then
 		# we already know where it is
 		return
 	fi
@@ -404,12 +404,12 @@
 	# spaces must be replaced with underscore for multi-word
 	# commands, e.g. "git remote add" becomes remote_add.
 	local cmd="$1"
-	local incl="$2"
-	local excl="$3"
+	local incl="${2-}"
+	local excl="${3-}"
 
 	local var=__gitcomp_builtin_"${cmd/-/_}"
 	local options
-	eval "options=\$$var"
+	eval "options=\${$var-}"
 
 	if [ -z "$options" ]; then
 		# leading and trailing spaces are significant to make
@@ -801,7 +801,7 @@
 #                --remote is only compatible with --mode=refs.
 __git_complete_refs ()
 {
-	local remote dwim pfx cur_="$cur" sfx=" " mode="refs"
+	local remote= dwim= pfx= cur_="$cur" sfx=" " mode="refs"
 
 	while test $# != 0; do
 		case "$1" in
@@ -1152,7 +1152,7 @@
 	while [ $c -lt $cword ]; do
 		for word in $wordlist; do
 			if [ "$word" = "${words[c]}" ]; then
-				if [ -n "$show_idx" ]; then
+				if [ -n "${show_idx-}" ]; then
 					echo "$c $word"
 				else
 					echo "$word"
@@ -1468,7 +1468,7 @@
 {
 	local last_option dwim_opt="--dwim"
 
-	if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ]; then
+	if [ "${GIT_COMPLETION_CHECKOUT_NO_GUESS-}" = "1" ]; then
 		dwim_opt=""
 	fi
 
@@ -3350,7 +3350,7 @@
 		((c++))
 	done
 
-	if [ -z "$command" ]; then
+	if [ -z "${command-}" ]; then
 		case "$prev" in
 		--git-dir|-C|--work-tree)
 			# these need a path argument, let's fall back to
@@ -3385,7 +3385,7 @@
 			"
 			;;
 		*)
-			if test -n "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
+			if test -n "${GIT_TESTING_PORCELAIN_COMMAND_LIST-}"
 			then
 				__gitcomp "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
 			else
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 014cd7c..16260ba 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -70,6 +70,15 @@
 # state symbols by setting GIT_PS1_STATESEPARATOR. The default separator
 # is SP.
 #
+# When there is an in-progress operation such as a merge, rebase,
+# revert, cherry-pick, or bisect, the prompt will include information
+# related to the operation, often in the form "|<OPERATION-NAME>".
+#
+# When the repository has a sparse-checkout, a notification of the form
+# "|SPARSE" will be included in the prompt.  This can be shortened to a
+# single '?' character by setting GIT_PS1_COMPRESSSPARSESTATE, or omitted
+# by setting GIT_PS1_OMITSPARSESTATE.
+#
 # By default, __git_ps1 will compare HEAD to your SVN upstream if it can
 # find one, or @{upstream} otherwise.  Once you have set
 # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
@@ -421,6 +430,13 @@
 		return $exit
 	fi
 
+	local sparse=""
+	if [ -z "${GIT_PS1_COMPRESSSPARSESTATE}" ] &&
+	   [ -z "${GIT_PS1_OMITSPARSESTATE}" ] &&
+	   [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
+		sparse="|SPARSE"
+	fi
+
 	local r=""
 	local b=""
 	local step=""
@@ -492,6 +508,7 @@
 	local i=""
 	local s=""
 	local u=""
+	local h=""
 	local c=""
 	local p=""
 
@@ -524,6 +541,11 @@
 			u="%${ZSH_VERSION+%}"
 		fi
 
+		if [ -n "${GIT_PS1_COMPRESSSPARSESTATE}" ] &&
+		   [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
+			h="?"
+		fi
+
 		if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
 			__git_ps1_show_upstream
 		fi
@@ -542,8 +564,8 @@
 		b="\${__git_ps1_branch_name}"
 	fi
 
-	local f="$w$i$s$u"
-	local gitstring="$c$b${f:+$z$f}$r$p"
+	local f="$h$w$i$s$u"
+	local gitstring="$c$b${f:+$z$f}${sparse}$r$p"
 
 	if [ $pcmode = yes ]; then
 		if [ "${__git_printf_supports_v-}" != yes ]; then
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 57ff4b2..53d7acc 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -196,7 +196,8 @@
 		cd "$subtree_test_count" &&
 		git fetch ./"sub proj" master &&
 		git subtree merge --prefix="sub dir" FETCH_HEAD &&
-		check_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+		check_equal "$(last_commit_message)" \
+			"Merge commit '\''$(git rev-parse FETCH_HEAD)'\'' into master"
 	)
 '
 
@@ -273,7 +274,8 @@
 		cd "$test_count" &&
 		git fetch ./subproj master &&
 		git subtree merge --prefix=subdir/ FETCH_HEAD &&
-		check_equal "$(last_commit_message)" "Merge commit '\''$(git rev-parse FETCH_HEAD)'\''"
+		check_equal "$(last_commit_message)" \
+			"Merge commit '\''$(git rev-parse FETCH_HEAD)'\'' into master"
 	)
 '
 
diff --git a/diff-lib.c b/diff-lib.c
index 61812f4..25fd2de 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -220,8 +220,7 @@
 			} else if (revs->diffopt.ita_invisible_in_index &&
 				   ce_intent_to_add(ce)) {
 				diff_addremove(&revs->diffopt, '+', ce->ce_mode,
-					       the_hash_algo->empty_tree, 0,
-					       ce->name, 0);
+					       &null_oid, 0, ce->name, 0);
 				continue;
 			}
 
diff --git a/diff.h b/diff.h
index 9443dc1..e0c0af6 100644
--- a/diff.h
+++ b/diff.h
@@ -431,11 +431,11 @@
 	struct combine_diff_path *p, const struct object_id *oid,
 	const struct object_id **parents_oid, int nparent,
 	struct strbuf *base, struct diff_options *opt);
-int diff_tree_oid(const struct object_id *old_oid,
-		  const struct object_id *new_oid,
-		  const char *base, struct diff_options *opt);
-int diff_root_tree_oid(const struct object_id *new_oid, const char *base,
-		       struct diff_options *opt);
+void diff_tree_oid(const struct object_id *old_oid,
+		   const struct object_id *new_oid,
+		   const char *base, struct diff_options *opt);
+void diff_root_tree_oid(const struct object_id *new_oid, const char *base,
+			struct diff_options *opt);
 
 struct combine_diff_path {
 	struct combine_diff_path *next;
diff --git a/dir.c b/dir.c
index 1045cc9..fe64be3 100644
--- a/dir.c
+++ b/dir.c
@@ -2209,13 +2209,13 @@
 				       baselen, excluded, pathspec);
 	case DT_REG:
 	case DT_LNK:
-		if (excluded)
-			return path_excluded;
 		if (pathspec &&
 		    !match_pathspec(istate, pathspec, path->buf, path->len,
 				    0 /* prefix */, NULL /* seen */,
 				    0 /* is_dir */))
 			return path_none;
+		if (excluded)
+			return path_excluded;
 		return path_untracked;
 	}
 }
diff --git a/entry.c b/entry.c
index 00b4903..449bd32 100644
--- a/entry.c
+++ b/entry.c
@@ -113,8 +113,7 @@
 	/* use fstat() only when path == ce->name */
 	if (fstat_is_reliable() &&
 	    state->refresh_cache && !state->base_dir_len) {
-		fstat(fd, st);
-		return 1;
+		return !fstat(fd, st);
 	}
 	return 0;
 }
diff --git a/fetch-pack.c b/fetch-pack.c
index acd55ba..80fb3bd 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -1050,6 +1050,8 @@
 		print_verbose(args, _("Server supports %s"), "deepen-relative");
 	else if (args->deepen_relative)
 		die(_("Server does not support --deepen"));
+	if (!server_supports_hash(the_hash_algo->name, NULL))
+		die(_("Server does not support this repository's object format"));
 
 	if (!args->no_dependents) {
 		mark_complete_and_common_ref(negotiator, args, &ref);
@@ -1188,6 +1190,7 @@
 			      int sideband_all, int seen_ack)
 {
 	int ret = 0;
+	const char *hash_name;
 	struct strbuf req_buf = STRBUF_INIT;
 
 	if (server_supports_v2("fetch", 1))
@@ -1202,6 +1205,17 @@
 					 args->server_options->items[i].string);
 	}
 
+	if (server_feature_v2("object-format", &hash_name)) {
+		int hash_algo = hash_algo_by_name(hash_name);
+		if (hash_algo_by_ptr(the_hash_algo) != hash_algo)
+			die(_("mismatched algorithms: client %s; server %s"),
+			    the_hash_algo->name, hash_name);
+		packet_write_fmt(fd_out, "object-format=%s", the_hash_algo->name);
+	} else if (hash_algo_by_ptr(the_hash_algo) != GIT_HASH_SHA1) {
+		die(_("the server does not support algorithm '%s'"),
+		    the_hash_algo->name);
+	}
+
 	packet_buf_delim(&req_buf);
 	if (args->use_thin_pack)
 		packet_buf_write(&req_buf, "thin-pack");
diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c
index 72d32bd..bd22e1e 100644
--- a/fmt-merge-msg.c
+++ b/fmt-merge-msg.c
@@ -10,6 +10,8 @@
 #include "commit-reach.h"
 
 static int use_branch_desc;
+static int suppress_dest_pattern_seen;
+static struct string_list suppress_dest_patterns = STRING_LIST_INIT_DUP;
 
 int fmt_merge_msg_config(const char *key, const char *value, void *cb)
 {
@@ -22,6 +24,14 @@
 			merge_log_config = DEFAULT_MERGE_LOG_LEN;
 	} else if (!strcmp(key, "merge.branchdesc")) {
 		use_branch_desc = git_config_bool(key, value);
+	} else if (!strcmp(key, "merge.suppressdest")) {
+		if (!value)
+			return config_error_nonbool(key);
+		if (!*value)
+			string_list_clear(&suppress_dest_patterns, 0);
+		else
+			string_list_append(&suppress_dest_patterns, value);
+		suppress_dest_pattern_seen = 1;
 	} else {
 		return git_default_config(key, value, cb);
 	}
@@ -403,6 +413,24 @@
 	string_list_clear(&subjects, 0);
 }
 
+/*
+ * See if dest_branch matches with any glob pattern on the
+ * suppress_dest_patterns list.
+ *
+ * We may want to also allow negative matches e.g. ":!glob" like we do
+ * for pathspec, but for now, let's keep it simple and stupid.
+ */
+static int dest_suppressed(const char *dest_branch)
+{
+	struct string_list_item *item;
+
+	for_each_string_list_item(item, &suppress_dest_patterns) {
+		if (!wildmatch(item->string, dest_branch, WM_PATHNAME))
+			return 1;
+	}
+	return 0;
+}
+
 static void fmt_merge_msg_title(struct strbuf *out,
 				const char *current_branch)
 {
@@ -451,10 +479,9 @@
 			strbuf_addf(out, " of %s", srcs.items[i].string);
 	}
 
-	if (!strcmp("master", current_branch))
-		strbuf_addch(out, '\n');
-	else
-		strbuf_addf(out, " into %s\n", current_branch);
+	if (!dest_suppressed(current_branch))
+		strbuf_addf(out, " into %s", current_branch);
+	strbuf_addch(out, '\n');
 }
 
 static void fmt_tag_signature(struct strbuf *tagbuf,
@@ -599,6 +626,9 @@
 	void *current_branch_to_free;
 	struct merge_parents merge_parents;
 
+	if (!suppress_dest_pattern_seen)
+		string_list_append(&suppress_dest_patterns, "master");
+
 	memset(&merge_parents, 0, sizeof(merge_parents));
 
 	/* get current branch */
diff --git a/fsmonitor.c b/fsmonitor.c
index 932bd90..ed796e3 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -217,7 +217,7 @@
 				 * Need to use a char * variable because static
 				 * analysis was suggesting to use strbuf_addbuf
 				 * but we don't want to copy the entire strbuf
-				 * only the the chars up to the first NUL
+				 * only the chars up to the first NUL
 				 */
 				buf = query_result.buf;
 				strbuf_addstr(&last_update_token, buf);
diff --git a/git-compat-util.h b/git-compat-util.h
index a73632e..5637114 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -869,6 +869,12 @@
 FILE *fopen_or_warn(const char *path, const char *mode);
 
 /*
+ * Like strncmp, but only return zero if s is NUL-terminated and exactly len
+ * characters long.  If it is not, consider it greater than t.
+ */
+int xstrncmpz(const char *s, const char *t, size_t len);
+
+/*
  * FREE_AND_NULL(ptr) is like free(ptr) followed by ptr = NULL. Note
  * that ptr is used twice, so don't pass e.g. ptr++.
  */
diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index fc00d59..6483d79 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -22,6 +22,10 @@
 my $repo = Git->repository();
 $opt_w = $repo->config('cvsexportcommit.cvsdir') unless defined $opt_w;
 
+my $tmpdir = File::Temp->newdir;
+my $hash_algo = $repo->config('extensions.objectformat') || 'sha1';
+my $hexsz = $hash_algo eq 'sha256' ? 64 : 40;
+
 if ($opt_w || $opt_W) {
 	# Remember where GIT_DIR is before changing to CVS checkout
 	unless ($ENV{GIT_DIR}) {
@@ -96,7 +100,7 @@
     }
 
     if ($stage eq 'headers') {
-	if ($line =~ m/^parent (\w{40})$/) { # found a parent
+	if ($line =~ m/^parent ([0-9a-f]{$hexsz})$/) { # found a parent
 	    push @parents, $1;
 	} elsif ($line =~ m/^author (.+) \d+ [-+]\d+$/) {
 	    $author = $1;
@@ -111,7 +115,7 @@
     }
 }
 
-my $noparent = "0000000000000000000000000000000000000000";
+my $noparent = "0" x $hexsz;
 if ($parent) {
     my $found;
     # double check that it's a valid parent
@@ -174,7 +178,7 @@
 print "Checking if patch will apply\n";
 
 my @stat;
-open APPLY, "GIT_DIR= git-apply $context --summary --numstat<.cvsexportcommit.diff|" || die "cannot patch";
+open APPLY, "GIT_INDEX_FILE=$tmpdir/index git-apply $context --summary --numstat<.cvsexportcommit.diff|" || die "cannot patch";
 @stat=<APPLY>;
 close APPLY || die "Cannot patch";
 my (@bfiles,@files,@afiles,@dfiles);
@@ -329,7 +333,7 @@
 if ($opt_W) {
     system("git checkout -q $commit^0") && die "cannot patch";
 } else {
-    `GIT_DIR= git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch";
+    `GIT_INDEX_FILE=$tmpdir/index git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch";
 }
 
 print "Patch applied successfully. Adding new files and directories to CVS\n";
@@ -407,7 +411,7 @@
 
 if ($opt_W) {
     system("git checkout $go_back_to") && die "cannot move back to $go_back_to";
-    if (!($go_back_to =~ /^[0-9a-fA-F]{40}$/)) {
+    if (!($go_back_to =~ /^[0-9a-fA-F]{$hexsz}$/)) {
 	system("git symbolic-ref HEAD $go_back_to") &&
 	    die "cannot move back to $go_back_to";
     }
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 1057f38..7bf3c12 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -637,9 +637,9 @@
 	return $pwd;
 }
 
-sub is_sha1 {
+sub is_oid {
 	my $s = shift;
-	return $s =~ /^[a-f0-9]{40}$/;
+	return $s =~ /^[a-f0-9]{40}(?:[a-f0-9]{24})?$/;
 }
 
 sub get_headref ($) {
@@ -810,7 +810,7 @@
 	open(my $fh, '-|', qw(git write-tree))
 		or die "unable to open git write-tree: $!";
 	chomp(my $tree = <$fh>);
-	is_sha1($tree)
+	is_oid($tree)
 		or die "Cannot get tree id ($tree): $!";
 	close($fh)
 		or die "Error running git write-tree: $?\n";
@@ -896,7 +896,7 @@
 
 	print "Committed patch $patchset ($branch $commit_date)\n" if $opt_v;
 	chomp(my $cid = <$commit_read>);
-	is_sha1($cid) or die "Cannot get commit id ($cid): $!\n";
+	is_oid($cid) or die "Cannot get commit id ($cid): $!\n";
 	print "Commit ID $cid\n" if $opt_v;
 	close($commit_read);
 
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index ae10442..f6f3fc1 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -365,7 +365,7 @@
     }
     foreach my $line ( @gitvars )
     {
-        next unless ( $line =~ /^(gitcvs)\.(?:(ext|pserver)\.)?([\w-]+)=(.*)$/ );
+        next unless ( $line =~ /^(gitcvs|extensions)\.(?:(ext|pserver)\.)?([\w-]+)=(.*)$/ );
         unless ($2) {
             $cfg->{$1}{$3} = $4;
         } else {
@@ -392,6 +392,9 @@
         $log->nofile();
     }
 
+    $state->{rawsz} = ($cfg->{'extensions'}{'objectformat'} || 'sha1') eq 'sha256' ? 32 : 20;
+    $state->{hexsz} = $state->{rawsz} * 2;
+
     return 1;
 }
 
@@ -1581,7 +1584,7 @@
 
             $parenthash = safe_pipe_capture('git', 'show-ref', '-s', $branchRef);
             chomp $parenthash;
-            if ($parenthash !~ /^[0-9a-f]{40}$/)
+            if ($parenthash !~ /^[0-9a-f]{$state->{hexsz}}$/)
             {
                 if ( defined($stickyInfo) && defined($stickyInfo->{tag}) )
                 {
@@ -1708,7 +1711,7 @@
     chomp($commithash);
     $log->info("Commit hash : $commithash");
 
-    unless ( $commithash =~ /[a-zA-Z0-9]{40}/ )
+    unless ( $commithash =~ /[a-zA-Z0-9]{$state->{hexsz}}/ )
     {
         $log->warn("Commit failed (Invalid commit hash)");
         print "error 1 Commit failed (unknown reason)\n";
@@ -2375,7 +2378,7 @@
         print "E ***************\n";
         while ( <ANNOTATE> )
         {
-            if (m/^([a-zA-Z0-9]{40})\t\([^\)]*\)(.*)$/i)
+            if (m/^([a-zA-Z0-9]{$state->{hexsz}})\t\([^\)]*\)(.*)$/i)
             {
                 my $commithash = $1;
                 my $data = $2;
@@ -2852,7 +2855,7 @@
         return;
     }
 
-    die "Need filehash" unless ( defined ( $filehash ) and $filehash =~ /^[a-zA-Z0-9]{40}$/ );
+    die "Need filehash" unless ( defined ( $filehash ) and $filehash =~ /^[a-zA-Z0-9]{$state->{hexsz}}$/ );
 
     my $type = safe_pipe_capture('git', 'cat-file', '-t', $filehash);
     chomp $type;
@@ -3042,7 +3045,7 @@
 
     my $ver = safe_pipe_capture('git', 'show-ref', '-s', "refs/heads/$state->{module}");
     chomp $ver;
-    if ($ver !~ /^[0-9a-f]{40}$/)
+    if ($ver !~ /^[0-9a-f]{$state->{hexsz}}$/)
     {
         $log->warn("Error from git show-ref -s refs/head$state->{module}");
         print "error 1 cannot find the current HEAD of module";
@@ -3281,7 +3284,7 @@
     }
     elsif( $srcType eq "sha1" )
     {
-        unless ( defined ( $name ) and $name =~ /^[a-zA-Z0-9]{40}$/ )
+        unless ( defined ( $name ) and $name =~ /^[a-zA-Z0-9]{$state->{hexsz}}$/ )
         {
             $log->warn("Need filehash");
             die "Need filehash\n";
@@ -3817,7 +3820,7 @@
     chomp $commitsha1;
 
     my $commitinfo = ::safe_pipe_capture('git', 'cat-file', 'commit', $self->{module});
-    unless ( $commitinfo =~ /tree\s+[a-zA-Z0-9]{40}/ )
+    unless ( $commitinfo =~ /tree\s+[a-zA-Z0-9]{$state->{hexsz}}/ )
     {
         die("Invalid module '$self->{module}'");
     }
@@ -3957,7 +3960,7 @@
             while ( <FILELIST> )
             {
 		chomp;
-                unless ( /^:\d{6}\s+([0-7]{6})\s+[a-f0-9]{40}\s+([a-f0-9]{40})\s+(\w)$/o )
+                unless ( /^:\d{6}\s+([0-7]{6})\s+[a-f0-9]{$state->{hexsz}}\s+([a-f0-9]{$state->{hexsz}})\s+(\w)$/o )
                 {
                     die("Couldn't process git-diff-tree line : $_");
                 }
@@ -4625,11 +4628,11 @@
             $db_query->execute($filename, $intRev);
             $meta = $db_query->fetchrow_hashref;
         }
-        elsif ( $revision =~ /^2\.1\.1\.2000(\.[1-3][0-9][0-9]){20}$/ )
+        elsif ( $revision =~ /^2\.1\.1\.2000(\.[1-3][0-9][0-9]){$state->{rawsz}}$/ )
         {
             my ($commitHash)=($revision=~/^2\.1\.1\.2000(.*)$/);
             $commitHash=~s/\.([0-9]+)/sprintf("%02x",$1-100)/eg;
-            if($commitHash=~/^[0-9a-f]{40}$/)
+            if($commitHash=~/^[0-9a-f]{$state->{hexsz}}$/)
             {
                 return $self->getMetaFromCommithash($filename,$commitHash);
             }
@@ -4639,7 +4642,7 @@
             $log->warning("failed get $revision with commithash=$commitHash");
             undef $revision;
         }
-        elsif ( $revision =~ /^[0-9a-f]{40}$/ )
+        elsif ( $revision =~ /^[0-9a-f]{$state->{hexsz}}$/ )
         {
             # Try DB first.  This is mostly only useful for req_annotate(),
             # which only calls this for stuff that should already be in
@@ -4658,7 +4661,7 @@
             if(! $meta)
             {
                 my($revCommit)=$self->lookupCommitRef($revision);
-                if($revCommit=~/^[0-9a-f]{40}$/)
+                if($revCommit=~/^[0-9a-f]{$state->{hexsz}}$/)
                 {
                     return $self->getMetaFromCommithash($filename,$revCommit);
                 }
@@ -4672,7 +4675,7 @@
         else
         {
             my($revCommit)=$self->lookupCommitRef($revision);
-            if($revCommit=~/^[0-9a-f]{40}$/)
+            if($revCommit=~/^[0-9a-f]{$state->{hexsz}}$/)
             {
                 return $self->getMetaFromCommithash($filename,$revCommit);
             }
@@ -4767,7 +4770,7 @@
 
     my($fileHash) = ::safe_pipe_capture("git","rev-parse","$revCommit:$filename");
     chomp $fileHash;
-    if(!($fileHash=~/^[0-9a-f]{40}$/))
+    if(!($fileHash=~/^[0-9a-f]{$state->{hexsz}}$/))
     {
         die "Invalid fileHash '$fileHash' looking up"
                     ." '$revCommit:$filename'\n";
@@ -4863,7 +4866,7 @@
     $commitHash = ::safe_pipe_capture("git","rev-parse","--verify","--quiet",
 				      $self->unescapeRefName($ref));
     $commitHash=~s/\s*$//;
-    if(!($commitHash=~/^[0-9a-f]{40}$/))
+    if(!($commitHash=~/^[0-9a-f]{$state->{hexsz}}$/))
     {
         $commitHash=undef;
     }
@@ -4909,7 +4912,7 @@
     my $commithash = shift;
     my $tablename = $self->tablename("commitmsgs");
 
-    die("Need commithash") unless ( defined($commithash) and $commithash =~ /^[a-zA-Z0-9]{40}$/ );
+    die("Need commithash") unless ( defined($commithash) and $commithash =~ /^[a-zA-Z0-9]{$state->{hexsz}}$/ );
 
     my $db_query;
     $db_query = $self->{dbh}->prepare_cached("SELECT value FROM $tablename WHERE key=?",{},1);
diff --git a/git-gui/lib/choose_repository.tcl b/git-gui/lib/choose_repository.tcl
index e54f3e6..af1fee7 100644
--- a/git-gui/lib/choose_repository.tcl
+++ b/git-gui/lib/choose_repository.tcl
@@ -357,31 +357,10 @@
 	if {$outdir_var ne ""} {
 		upvar 1 $outdir_var outdir
 	}
-	if {[file isfile $path]} {
-		set fp [open $path r]
-		gets $fp line
-		close $fp
-		if {[regexp "^gitdir: (.+)$" $line line link_target]} {
-			set path [file join [file dirname $path] $link_target]
-			set path [file normalize $path]
-		}
+	if {[catch {set outdir [git rev-parse --resolve-git-dir $path]}]} {
+		return 0
 	}
-
-	if {[file exists [file join $path HEAD]]
-	 && [file exists [file join $path objects]]
-	 && [file exists [file join $path config]]} {
-		set outdir $path
-		return 1
-	}
-	if {[is_Cygwin]} {
-		if {[file exists [file join $path HEAD]]
-		 && [file exists [file join $path objects.lnk]]
-		 && [file exists [file join $path config.lnk]]} {
-			set outdir $path
-			return 1
-		}
-	}
-	return 0
+	return 1
 }
 
 proc _objdir {path} {
diff --git a/git-send-email.perl b/git-send-email.perl
index dc95656..36c47ba 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1699,10 +1699,14 @@
 				$xfer_encoding = $1 if not defined $xfer_encoding;
 			}
 			elsif (/^In-Reply-To: (.*)/i) {
-				$in_reply_to = $1;
+				if (!$initial_in_reply_to || $thread) {
+					$in_reply_to = $1;
+				}
 			}
 			elsif (/^References: (.*)/i) {
-				$references = $1;
+				if (!$initial_in_reply_to || $thread) {
+					$references = $1;
+				}
 			}
 			elsif (!/^Date:\s/i && /^[-A-Za-z]+:\s+\S/) {
 				push @xh, $_;
diff --git a/git-svn.perl b/git-svn.perl
index 4aa208f..58f5a7a 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -5,7 +5,8 @@
 use warnings;
 use strict;
 use vars qw/	$AUTHOR $VERSION
-		$sha1 $sha1_short $_revision $_repository
+		$oid $oid_short $oid_length
+		$_revision $_repository
 		$_q $_authors $_authors_prog %users/;
 $AUTHOR = 'Eric Wong <normalperson@yhbt.net>';
 $VERSION = '@@GIT_VERSION@@';
@@ -103,8 +104,9 @@
 	}
 }
 
-$sha1 = qr/[a-f\d]{40}/;
-$sha1_short = qr/[a-f\d]{4,40}/;
+$oid = qr/(?:[a-f\d]{40}(?:[a-f\d]{24})?)/;
+$oid_short = qr/[a-f\d]{4,64}/;
+$oid_length = 40;
 my ($_stdin, $_help, $_edit,
 	$_message, $_file, $_branch_dest,
 	$_template, $_shared,
@@ -498,6 +500,7 @@
 		command_noisy('config', "$pfx.preserve-empty-dirs", 'true');
 		command_noisy('config', "$pfx.placeholder-filename", $$fname);
 	}
+	load_object_format();
 }
 
 sub init_subdir {
@@ -582,7 +585,7 @@
 		print "Reading from stdin...\n";
 		@commits = ();
 		while (<STDIN>) {
-			if (/\b($sha1_short)\b/o) {
+			if (/\b($oid_short)\b/o) {
 				unshift @commits, $1;
 			}
 		}
@@ -1831,7 +1834,7 @@
 	if ($type eq 'commit') {
 		$expected = (grep /^tree /, command(qw/cat-file commit/,
 		                                    $treeish))[0];
-		($expected) = ($expected =~ /^tree ($sha1)$/o);
+		($expected) = ($expected =~ /^tree ($oid)$/o);
 		die "Unable to get tree from $treeish\n" unless $expected;
 	} elsif ($type eq 'tree') {
 		$expected = $treeish;
@@ -1975,9 +1978,15 @@
 			}
 		}
 	}
+	load_object_format();
 	delete @$opts{@config_only} if @config_only;
 }
 
+sub load_object_format {
+	chomp(my $hash = `git config --get extensions.objectformat`);
+	$::oid_length = 64 if $hash eq 'sha256';
+}
+
 sub extract_metadata {
 	my $id = shift or return (undef, undef, undef);
 	my ($url, $rev, $uuid) = ($id =~ /^\s*git-svn-id:\s+(.*)\@(\d+)
@@ -2006,10 +2015,10 @@
 		print $out $sha, "\n";
 
 		while (my $line = <$in>) {
-			if ($first && $line =~ /^[[:xdigit:]]{40}\smissing$/) {
+			if ($first && $line =~ /^$::oid\smissing$/) {
 				last;
 			} elsif ($first &&
-			       $line =~ /^[[:xdigit:]]{40}\scommit\s(\d+)$/) {
+			       $line =~ /^$::oid\scommit\s(\d+)$/) {
 				$first = 0;
 				$size = $1;
 				next;
@@ -2036,7 +2045,7 @@
 	my $hash;
 	my %max;
 	while (<$fh>) {
-		if ( m{^commit ($::sha1)$} ) {
+		if ( m{^commit ($::oid)$} ) {
 			unshift @$refs, $hash if $hash and $refs;
 			$hash = $1;
 			next;
diff --git a/git.c b/git.c
index a2d337e..6cd887b 100644
--- a/git.c
+++ b/git.c
@@ -346,6 +346,8 @@
 			commit_pager_choice();
 
 			child.use_shell = 1;
+			child.clean_on_exit = 1;
+			child.wait_after_clean = 1;
 			child.trace2_child_class = "shell_alias";
 			argv_array_push(&child.args, alias_string + 1);
 			argv_array_pushv(&child.args, (*argv) + 1);
@@ -574,7 +576,7 @@
 	{ "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
 	{ "show", cmd_show, RUN_SETUP },
 	{ "show-branch", cmd_show_branch, RUN_SETUP },
-	{ "show-index", cmd_show_index },
+	{ "show-index", cmd_show_index, RUN_SETUP_GENTLY },
 	{ "show-ref", cmd_show_ref, RUN_SETUP },
 	{ "sparse-checkout", cmd_sparse_checkout, RUN_SETUP | NEED_WORK_TREE },
 	{ "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
@@ -767,7 +769,7 @@
 			 * OK to return. Otherwise, we just pass along the status code.
 			 */
 			i = run_command_v_opt_tr2(args.argv, RUN_SILENT_EXEC_FAILURE |
-						  RUN_CLEAN_ON_EXIT, "git_alias");
+						  RUN_CLEAN_ON_EXIT | RUN_WAIT_AFTER_CLEAN, "git_alias");
 			if (i >= 0 || errno != ENOENT)
 				exit(i);
 			die("could not execute builtin %s", **argv);
diff --git a/grep.c b/grep.c
index 13232a9..54af9f8 100644
--- a/grep.c
+++ b/grep.c
@@ -1817,7 +1817,7 @@
 		 * We might set up the shared textconv cache data here, which
 		 * is not thread-safe. Also, get_oid_with_context() and
 		 * parse_object() might be internally called. As they are not
-		 * currenty thread-safe and might be racy with object reading,
+		 * currently thread-safe and might be racy with object reading,
 		 * obj_read_lock() must be called.
 		 */
 		grep_attr_lock();
diff --git a/hashmap.h b/hashmap.h
index 79ae9f8..ef220de 100644
--- a/hashmap.h
+++ b/hashmap.h
@@ -168,7 +168,7 @@
  * argument `keydata`, respectively. Otherwise, `keydata` is NULL.
  *
  * When it is too expensive to allocate a user entry (either because it is
- * large or varialbe sized, such that it is not on the stack), then the
+ * large or variable sized, such that it is not on the stack), then the
  * relevant data to check for equality should be passed via `keydata`.
  * In this case `key` can be a stripped down version of the user key data
  * or even just a hashmap_entry having the correct hash.
diff --git a/http-push.c b/http-push.c
index ac7868f..1ff1883 100644
--- a/http-push.c
+++ b/http-push.c
@@ -70,10 +70,10 @@
 #define LOCK_REFRESH 30
 
 /* Remember to update object flag allocation in object.h */
-#define LOCAL    (1u<<16)
-#define REMOTE   (1u<<17)
-#define FETCHING (1u<<18)
-#define PUSHING  (1u<<19)
+#define LOCAL    (1u<<11)
+#define REMOTE   (1u<<12)
+#define FETCHING (1u<<13)
+#define PUSHING  (1u<<14)
 
 /* We allow "recursive" symbolic refs. Only within reason, though */
 #define MAXDEPTH 5
diff --git a/object-store.h b/object-store.h
index d1e490f..f439d47 100644
--- a/object-store.h
+++ b/object-store.h
@@ -70,6 +70,7 @@
 	size_t index_size;
 	uint32_t num_objects;
 	uint32_t num_bad_objects;
+	uint32_t crc_offset;
 	unsigned char *bad_object_sha1;
 	int index_version;
 	time_t mtime;
diff --git a/object.c b/object.c
index 794c866..3257518 100644
--- a/object.c
+++ b/object.c
@@ -157,13 +157,13 @@
 	return obj;
 }
 
-void *object_as_type(struct repository *r, struct object *obj, enum object_type type, int quiet)
+void *object_as_type(struct object *obj, enum object_type type, int quiet)
 {
 	if (obj->type == type)
 		return obj;
 	else if (obj->type == OBJ_NONE) {
 		if (type == OBJ_COMMIT)
-			init_commit_node(r, (struct commit *) obj);
+			init_commit_node((struct commit *) obj);
 		else
 			obj->type = type;
 		return obj;
diff --git a/object.h b/object.h
index b22328b..96a2105 100644
--- a/object.h
+++ b/object.h
@@ -15,7 +15,6 @@
 	struct alloc_state *commit_state;
 	struct alloc_state *tag_state;
 	struct alloc_state *object_state;
-	unsigned commit_count;
 
 	/* parent substitutions from .git/info/grafts and .git/shallow */
 	struct commit_graft **grafts;
@@ -26,6 +25,7 @@
 	char *alternate_shallow_file;
 
 	int commit_graft_prepared;
+	int substituted_parent;
 
 	struct buffer_slab *buffer_slab;
 };
@@ -59,7 +59,7 @@
 
 /*
  * object flag allocation:
- * revision.h:               0---------10         15                   25----28
+ * revision.h:               0---------10         15             23------26
  * fetch-pack.c:             01
  * negotiator/default.c:       2--5
  * walker.c:                 0-2
@@ -67,7 +67,7 @@
  * builtin/blame.c:                        12-13
  * bisect.c:                                        16
  * bundle.c:                                        16
- * http-push.c:                                     16-----19
+ * http-push.c:                          11-----14
  * commit-graph.c:                                15
  * commit-reach.c:                                  16-----19
  * sha1-name.c:                                              20
@@ -79,7 +79,7 @@
  * builtin/show-branch.c:    0-------------------------------------------26
  * builtin/unpack-objects.c:                                 2021
  */
-#define FLAG_BITS  29
+#define FLAG_BITS  28
 
 /*
  * The object type is stored in 3 bits.
@@ -121,7 +121,7 @@
 
 void *create_object(struct repository *r, const struct object_id *oid, void *obj);
 
-void *object_as_type(struct repository *r, struct object *obj, enum object_type type, int quiet);
+void *object_as_type(struct object *obj, enum object_type type, int quiet);
 
 /*
  * Returns the object, having parsed it to find out what it is.
diff --git a/pack-write.c b/pack-write.c
index f0017be..685d327 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -38,9 +38,8 @@
 }
 
 /*
- * On entry *sha1 contains the pack content SHA1 hash, on exit it is
- * the SHA1 hash of sorted object names. The objects array passed in
- * will be sorted by SHA1 on exit.
+ * The *sha1 contains the pack content SHA1 hash.
+ * The objects array passed in will be sorted by SHA1 on exit.
  */
 const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects,
 			   int nr_objects, const struct pack_idx_option *opts,
diff --git a/packfile.c b/packfile.c
index f4e7529..6ab5233 100644
--- a/packfile.c
+++ b/packfile.c
@@ -178,6 +178,7 @@
 		     */
 		    (sizeof(off_t) <= 4))
 			return error("pack too large for current definition of off_t in %s", path);
+		p->crc_offset = 8 + 4 * 256 + nr * hashsz;
 	}
 
 	p->index_version = version;
diff --git a/perl/Git/IndexInfo.pm b/perl/Git/IndexInfo.pm
index a43108c..2a7b490 100644
--- a/perl/Git/IndexInfo.pm
+++ b/perl/Git/IndexInfo.pm
@@ -5,13 +5,15 @@
 
 sub new {
 	my ($class) = @_;
+	my $hash_algo = Git::config('extensions.objectformat') || 'sha1';
 	my ($gui, $ctx) = command_input_pipe(qw/update-index -z --index-info/);
-	bless { gui => $gui, ctx => $ctx, nr => 0}, $class;
+	bless { gui => $gui, ctx => $ctx, nr => 0, hash_algo => $hash_algo}, $class;
 }
 
 sub remove {
 	my ($self, $path) = @_;
-	if (print { $self->{gui} } '0 ', 0 x 40, "\t", $path, "\0") {
+	my $length = $self->{hash_algo} eq 'sha256' ? 64 : 40;
+	if (print { $self->{gui} } '0 ', 0 x $length, "\t", $path, "\0") {
 		return ++$self->{nr};
 	}
 	undef;
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 4b28b87..d1c352f 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -2,7 +2,7 @@
 use strict;
 use warnings;
 use Fcntl qw/:DEFAULT :seek/;
-use constant rev_map_fmt => 'NH40';
+use constant rev_map_fmt => 'NH*';
 use vars qw/$_no_metadata
             $_repack $_repack_flags $_use_svm_props $_head
             $_use_svnsync_props $no_reuse_existing
@@ -874,7 +874,7 @@
 		command_noisy('read-tree', $treeish) unless -e $self->{index};
 		my $x = command_oneline('write-tree');
 		my ($y) = (command(qw/cat-file commit/, $treeish) =~
-		           /^tree ($::sha1)/mo);
+		           /^tree ($::oid)/mo);
 		return if $y eq $x;
 
 		warn "Index mismatch: $y != $x\nrereading $treeish\n";
@@ -1020,7 +1020,7 @@
 		$tree = $self->tmp_index_do(sub {
 		                            command_oneline('write-tree') });
 	}
-	die "Tree is not a valid sha1: $tree\n" if $tree !~ /^$::sha1$/o;
+	die "Tree is not a valid oid $tree\n" if $tree !~ /^$::oid$/o;
 
 	my @exec = ('git', 'commit-tree', $tree);
 	foreach ($self->get_commit_parents($log_entry)) {
@@ -1048,8 +1048,8 @@
 	close $out_fh or croak $!;
 	waitpid $pid, 0;
 	croak $? if $?;
-	if ($commit !~ /^$::sha1$/o) {
-		die "Failed to commit, invalid sha1: $commit\n";
+	if ($commit !~ /^$::oid$/o) {
+		die "Failed to commit, invalid oid: $commit\n";
 	}
 
 	$self->rev_map_set($log_entry->{revision}, $commit, 1);
@@ -2087,10 +2087,10 @@
 	open my $fh, '<', $path or croak "open: $!";
 	binmode $fh or croak "binmode: $!";
 	while (<$fh>) {
-		length($_) == 41 or croak "inconsistent size in ($_) != 41";
+		length($_) == $::oid_length + 1 or croak "inconsistent size in ($_)";
 		chomp($_);
 		++$r;
-		next if $_ eq ('0' x 40);
+		next if $_ eq ('0' x $::oid_length);
 		$self->rev_map_set($r, $_);
 		print "r$r = $_\n";
 	}
@@ -2150,7 +2150,7 @@
 	my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid;
 	my $c;
 	while (<$log>) {
-		if ( m{^commit ($::sha1)$} ) {
+		if ( m{^commit ($::oid)$} ) {
 			$c = $1;
 			next;
 		}
@@ -2196,9 +2196,9 @@
 # (mainly tags)
 #
 # The format is this:
-#   - 24 bytes for every record,
+#   - 24 or 36 bytes for every record,
 #     * 4 bytes for the integer representing an SVN revision number
-#     * 20 bytes representing the sha1 of a git commit
+#     * 20 or 32 bytes representing the oid of a git commit
 #   - No empty padding records like the old format
 #     (except the last record, which can be overwritten)
 #   - new records are written append-only since SVN revision numbers
@@ -2207,7 +2207,7 @@
 #   - Piping the file to xxd -c24 is a good way of dumping it for
 #     viewing or editing (piped back through xxd -r), should the need
 #     ever arise.
-#   - The last record can be padding revision with an all-zero sha1
+#   - The last record can be padding revision with an all-zero oid
 #     This is used to optimize fetch performance when using multiple
 #     "fetch" directives in .git/config
 #
@@ -2215,38 +2215,39 @@
 
 sub _rev_map_set {
 	my ($fh, $rev, $commit) = @_;
+	my $record_size = ($::oid_length / 2) + 4;
 
 	binmode $fh or croak "binmode: $!";
 	my $size = (stat($fh))[7];
-	($size % 24) == 0 or croak "inconsistent size: $size";
+	($size % $record_size) == 0 or croak "inconsistent size: $size";
 
 	my $wr_offset = 0;
 	if ($size > 0) {
-		sysseek($fh, -24, SEEK_END) or croak "seek: $!";
-		my $read = sysread($fh, my $buf, 24) or croak "read: $!";
-		$read == 24 or croak "read only $read bytes (!= 24)";
+		sysseek($fh, -$record_size, SEEK_END) or croak "seek: $!";
+		my $read = sysread($fh, my $buf, $record_size) or croak "read: $!";
+		$read == $record_size or croak "read only $read bytes (!= $record_size)";
 		my ($last_rev, $last_commit) = unpack(rev_map_fmt, $buf);
-		if ($last_commit eq ('0' x40)) {
-			if ($size >= 48) {
-				sysseek($fh, -48, SEEK_END) or croak "seek: $!";
-				$read = sysread($fh, $buf, 24) or
+		if ($last_commit eq ('0' x $::oid_length)) {
+			if ($size >= ($record_size * 2)) {
+				sysseek($fh, -($record_size * 2), SEEK_END) or croak "seek: $!";
+				$read = sysread($fh, $buf, $record_size) or
 				    croak "read: $!";
-				$read == 24 or
-				    croak "read only $read bytes (!= 24)";
+				$read == $record_size or
+				    croak "read only $read bytes (!= $record_size)";
 				($last_rev, $last_commit) =
 				    unpack(rev_map_fmt, $buf);
-				if ($last_commit eq ('0' x40)) {
+				if ($last_commit eq ('0' x $::oid_length)) {
 					croak "inconsistent .rev_map\n";
 				}
 			}
 			if ($last_rev >= $rev) {
 				croak "last_rev is higher!: $last_rev >= $rev";
 			}
-			$wr_offset = -24;
+			$wr_offset = -$record_size;
 		}
 	}
 	sysseek($fh, $wr_offset, SEEK_END) or croak "seek: $!";
-	syswrite($fh, pack(rev_map_fmt, $rev, $commit), 24) == 24 or
+	syswrite($fh, pack(rev_map_fmt, $rev, $commit), $record_size) == $record_size or
 	  croak "write: $!";
 }
 
@@ -2271,7 +2272,7 @@
 sub rev_map_set {
 	my ($self, $rev, $commit, $update_ref, $uuid) = @_;
 	defined $commit or die "missing arg3\n";
-	length $commit == 40 or die "arg3 must be a full SHA1 hexsum\n";
+	$commit =~ /^$::oid$/ or die "arg3 must be a full hex object ID\n";
 	my $db = $self->map_path($uuid);
 	my $db_lock = "$db.lock";
 	my $sigmask;
@@ -2344,29 +2345,30 @@
 
 sub rev_map_max_norebuild {
 	my ($self, $want_commit) = @_;
+	my $record_size = ($::oid_length / 2) + 4;
 	my $map_path = $self->map_path;
 	stat $map_path or return $want_commit ? (0, undef) : 0;
 	sysopen(my $fh, $map_path, O_RDONLY) or croak "open: $!";
 	binmode $fh or croak "binmode: $!";
 	my $size = (stat($fh))[7];
-	($size % 24) == 0 or croak "inconsistent size: $size";
+	($size % $record_size) == 0 or croak "inconsistent size: $size";
 
 	if ($size == 0) {
 		close $fh or croak "close: $!";
 		return $want_commit ? (0, undef) : 0;
 	}
 
-	sysseek($fh, -24, SEEK_END) or croak "seek: $!";
-	sysread($fh, my $buf, 24) == 24 or croak "read: $!";
+	sysseek($fh, -$record_size, SEEK_END) or croak "seek: $!";
+	sysread($fh, my $buf, $record_size) == $record_size or croak "read: $!";
 	my ($r, $c) = unpack(rev_map_fmt, $buf);
-	if ($want_commit && $c eq ('0' x40)) {
-		if ($size < 48) {
+	if ($want_commit && $c eq ('0' x $::oid_length)) {
+		if ($size < $record_size * 2) {
 			return $want_commit ? (0, undef) : 0;
 		}
-		sysseek($fh, -48, SEEK_END) or croak "seek: $!";
-		sysread($fh, $buf, 24) == 24 or croak "read: $!";
+		sysseek($fh, -($record_size * 2), SEEK_END) or croak "seek: $!";
+		sysread($fh, $buf, $record_size) == $record_size or croak "read: $!";
 		($r, $c) = unpack(rev_map_fmt, $buf);
-		if ($c eq ('0'x40)) {
+		if ($c eq ('0' x $::oid_length)) {
 			croak "Penultimate record is all-zeroes in $map_path";
 		}
 	}
@@ -2387,30 +2389,31 @@
 
 sub _rev_map_get {
 	my ($fh, $rev) = @_;
+	my $record_size = ($::oid_length / 2) + 4;
 
 	binmode $fh or croak "binmode: $!";
 	my $size = (stat($fh))[7];
-	($size % 24) == 0 or croak "inconsistent size: $size";
+	($size % $record_size) == 0 or croak "inconsistent size: $size";
 
 	if ($size == 0) {
 		return undef;
 	}
 
-	my ($l, $u) = (0, $size - 24);
+	my ($l, $u) = (0, $size - $record_size);
 	my ($r, $c, $buf);
 
 	while ($l <= $u) {
-		my $i = int(($l/24 + $u/24) / 2) * 24;
+		my $i = int(($l/$record_size + $u/$record_size) / 2) * $record_size;
 		sysseek($fh, $i, SEEK_SET) or croak "seek: $!";
-		sysread($fh, my $buf, 24) == 24 or croak "read: $!";
+		sysread($fh, my $buf, $record_size) == $record_size or croak "read: $!";
 		my ($r, $c) = unpack(rev_map_fmt, $buf);
 
 		if ($r < $rev) {
-			$l = $i + 24;
+			$l = $i + $record_size;
 		} elsif ($r > $rev) {
-			$u = $i - 24;
+			$u = $i - $record_size;
 		} else { # $r == $rev
-			return $c eq ('0' x 40) ? undef : $c;
+			return $c eq ('0' x $::oid_length) ? undef : $c;
 		}
 	}
 	undef;
diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm
index 0df16ed..c961444 100644
--- a/perl/Git/SVN/Editor.pm
+++ b/perl/Git/SVN/Editor.pm
@@ -63,7 +63,7 @@
 	my @mods;
 	while (defined($_ = get_record($diff_fh, "\0"))) {
 		if ($state eq 'meta' && /^:(\d{6})\s(\d{6})\s
-					($::sha1)\s($::sha1)\s
+					($::oid)\s($::oid)\s
 					([MTCRAD])\d*$/xo) {
 			push @mods, {	mode_a => $1, mode_b => $2,
 					sha1_a => $3, sha1_b => $4,
@@ -400,12 +400,12 @@
 	    ($m->{mode_b} !~ /^120/ && $m->{mode_a} =~ /^120/)) {
 		$self->D({
 			mode_a => $m->{mode_a}, mode_b => '000000',
-			sha1_a => $m->{sha1_a}, sha1_b => '0' x 40,
+			sha1_a => $m->{sha1_a}, sha1_b => '0' x $::oid_length,
 			chg => 'D', file_b => $m->{file_b}
 		}, $deletions);
 		$self->A({
 			mode_a => '000000', mode_b => $m->{mode_b},
-			sha1_a => '0' x 40, sha1_b => $m->{sha1_b},
+			sha1_a => '0' x $::oid_length, sha1_b => $m->{sha1_b},
 			chg => 'A', file_b => $m->{file_b}
 		}, $deletions);
 		return;
@@ -434,7 +434,7 @@
 		$self->change_file_prop($fbat,'svn:special',undef);
 	}
 	my $blob = $m->{"sha1_$which"};
-	return ($fh,) if ($blob =~ /^0{40}$/);
+	return ($fh,) if ($blob =~ /^0+$/);
 	my $size = $::_repository->cat_blob($blob, $fh);
 	croak "Failed to read object $blob" if ($size < 0);
 	$fh->flush == 0 or croak $!;
diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
index 64e900a..729e533 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/perl/Git/SVN/Fetcher.pm
@@ -173,7 +173,7 @@
 
 	# remove entire directories.
 	my ($tree) = (command('ls-tree', '-z', $self->{c}, "./$gpath")
-	                 =~ /\A040000 tree ([a-f\d]{40})\t\Q$gpath\E\0/);
+	                 =~ /\A040000 tree ($::oid)\t\Q$gpath\E\0/);
 	if ($tree) {
 		my ($ls, $ctx) = command_output_pipe(qw/ls-tree
 		                                     -r --name-only -z/,
@@ -203,7 +203,7 @@
 
 	my $gpath = $self->git_path($path);
 	($mode, $blob) = (command('ls-tree', '-z', $self->{c}, "./$gpath")
-	                     =~ /\A(\d{6}) blob ([a-f\d]{40})\t\Q$gpath\E\0/);
+	                     =~ /\A(\d{6}) blob ($::oid)\t\Q$gpath\E\0/);
 	unless (defined $mode && defined $blob) {
 		die "$path was not found in commit $self->{c} (r$rev)\n";
 	}
@@ -413,7 +413,7 @@
 
 		$hash = $::_repository->hash_and_insert_object(
 				Git::temp_path($fh));
-		$hash =~ /^[a-f\d]{40}$/ or die "not a sha1: $hash\n";
+		$hash =~ /^$::oid$/ or die "not an object ID: $hash\n";
 
 		Git::temp_release($fb->{base}, 1);
 		Git::temp_release($fh, 1);
diff --git a/perl/Git/SVN/Log.pm b/perl/Git/SVN/Log.pm
index 6641053..3858fcf 100644
--- a/perl/Git/SVN/Log.pm
+++ b/perl/Git/SVN/Log.pm
@@ -285,7 +285,7 @@
 	my (@k, $c, $d, $stat);
 	my $esc_color = qr/(?:\033\[(?:(?:\d+;)*\d*)?m)*/;
 	while (<$log>) {
-		if (/^${esc_color}commit (?:- )?($::sha1_short)/o) {
+		if (/^${esc_color}commit (?:- )?($::oid_short)/o) {
 			my $cmt = $1;
 			if ($c && cmt_showable($c) && $c->{r} != $r_last) {
 				$r_last = $c->{r};
diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
index 56ad987..2cfe055 100644
--- a/perl/Git/SVN/Ra.pm
+++ b/perl/Git/SVN/Ra.pm
@@ -486,11 +486,11 @@
 			$reload_ra->() if $ra_invalid;
 		}
 		# pre-fill the .rev_db since it'll eventually get filled in
-		# with '0' x40 if something new gets committed
+		# with '0' x $oid_length if something new gets committed
 		foreach my $gs (@$gsv) {
 			next if $gs->rev_map_max >= $max;
 			next if defined $gs->rev_map_get($max);
-			$gs->rev_map_set($max, 0 x40);
+			$gs->rev_map_set($max, 0 x $::oid_length);
 		}
 		foreach my $g (@$globs) {
 			my $k = "svn-remote.$g->{remote}.$g->{t}-maxRev";
diff --git a/pkt-line.c b/pkt-line.c
index 8f9bc68..844c253 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -490,6 +490,7 @@
 	reader->buffer_size = sizeof(packet_buffer);
 	reader->options = options;
 	reader->me = "git";
+	reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
 }
 
 enum packet_read_status packet_reader_read(struct packet_reader *reader)
diff --git a/pkt-line.h b/pkt-line.h
index 5b373fe..8c90daa 100644
--- a/pkt-line.h
+++ b/pkt-line.h
@@ -177,6 +177,9 @@
 
 	unsigned use_sideband : 1;
 	const char *me;
+
+	/* hash algorithm in use */
+	const struct git_hash_algo *hash_algo;
 };
 
 /*
diff --git a/po/ca.po b/po/ca.po
index 3a0246e..c43c21b 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -51,7 +51,7 @@
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
 "POT-Creation-Date: 2020-05-27 07:23+0800\n"
-"PO-Revision-Date: 2020-05-22 07:51+0200\n"
+"PO-Revision-Date: 2020-05-28 18:14+0200\n"
 "Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
 "Language-Team: Catalan\n"
 "Language: ca\n"
@@ -59,7 +59,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
+"X-Generator: Poedit 2.3.1\n"
 
 #: add-interactive.c:368
 #, c-format
@@ -222,7 +222,7 @@
 
 #: add-interactive.c:1032
 msgid "choose all items"
-msgstr "escolliu tots els ítems"
+msgstr "trieu tots els ítems"
 
 #: add-interactive.c:1034
 msgid "(empty) finish selecting"
@@ -304,9 +304,9 @@
 msgstr ""
 "y - fes «stage» d'aquest tros\n"
 "n - no facis «stage» d'aquest tros\n"
-"q - surt; no facis «stage» d'aquest tros o de cap altre restant\n"
-"a - fes «stage» d'aquest tros i tota la resta de trossos del fitxer\n"
-"d - no facis «stage» d'aquest tros o de cap altre restant del fitxer\n"
+"q - surt; no facis «stage» d'aquest tros ni de cap altre restant\n"
+"a - fes «stage» d'aquest tros i de tota la resta de trossos del fitxer\n"
+"d - no facis «stage» d'aquest tros ni de cap altre restant del fitxer\n"
 
 #: add-patch.c:55 git-add--interactive.perl:1433
 #, c-format, perl-format
@@ -341,9 +341,9 @@
 msgstr ""
 "y - fes «stash» d'aquest tros\n"
 "n - no facis «stash» d'aquest tros\n"
-"q - surt; no facis «stash» d'aquest tros o de cap altre restant\n"
-"a - fes «stash» d'aquest tros i tota la resta de trossos del fitxer\n"
-"d - no facis «stash» d'aquest tros o de cap altre restant del fitxer\n"
+"q - surt; no facis «stash» d'aquest tros ni de cap altre restant\n"
+"a - fes «stash» d'aquest tros i de tota la resta de trossos del fitxer\n"
+"d - no facis «stash» d'aquest tros ni de cap altre restant del fitxer\n"
 
 #: add-patch.c:78 git-add--interactive.perl:1438
 #, c-format, perl-format
@@ -378,9 +378,9 @@
 msgstr ""
 "y - fes «unstage» d'aquest tros\n"
 "n - no facis «unstage» d'aquest tros\n"
-"q - surt; no facis «unstage» d'aquest tros o de cap altre restant\n"
-"a - fes «unstage» d'aquest tros i tota la resta de trossos del fitxer\n"
-"d - no facis «unstage» d'aquest tros o de cap altre restant del fitxer\n"
+"q - surt; no facis «unstage» d'aquest tros ni de cap altre restant\n"
+"a - fes «unstage» d'aquest tros i de tota la resta de trossos del fitxer\n"
+"d - no facis «unstage» d'aquest tros ni de cap altre restant del fitxer\n"
 
 #: add-patch.c:100 git-add--interactive.perl:1443
 #, c-format, perl-format
@@ -390,7 +390,7 @@
 #: add-patch.c:101 git-add--interactive.perl:1444
 #, c-format, perl-format
 msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr "Aplica l'esborrat a l'índex [y,n,q,a,d%s,?]? "
+msgstr "Aplica la supressió a l'índex [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:102 git-add--interactive.perl:1445
 #, c-format, perl-format
@@ -423,19 +423,19 @@
 #: git-add--interactive.perl:1463
 #, c-format, perl-format
 msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr "Descarta el canvi de mode des de l'arbre de treball [y,n,q,a,d%s,?]? "
+msgstr "Descarta el canvi de mode de l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:123 git-add--interactive.perl:1449
 #: git-add--interactive.perl:1464
 #, c-format, perl-format
 msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr "Descarta l'esborrat des de l'arbre de treball [y,n,q,a,d%s,?]? "
+msgstr "Descarta suprimir de l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:124 git-add--interactive.perl:1450
 #: git-add--interactive.perl:1465
 #, c-format, perl-format
 msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr "Descarta aquest tros des de l'arbre de treball  [y,n,q,a,d%s,?]? "
+msgstr "Descarta aquest tros de l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:126 add-patch.c:148 add-patch.c:191
 msgid ""
@@ -454,7 +454,7 @@
 "d - do not discard this hunk or any of the later hunks in the file\n"
 msgstr ""
 "y - descarta aquest tros de l'arbre de treball\n"
-"n - no descartis aquest tros des de l'arbre de treball\n"
+"n - no descartis aquest tros de l'arbre de treball\n"
 "q - surt; no apliquis aquest tros ni cap dels pendents\n"
 "a - descarta aquest tros i tots els trossos posteriors en el fitxer\n"
 "d - no descartis aquest tros ni cap dels trossos posteriors en el fitxer\n"
@@ -463,20 +463,19 @@
 #, c-format, perl-format
 msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
-"Descarta el canvi de mode des de l'índex i l'arbre de treball [y,n,q,a,d"
+"Descarta el canvi de mode de l'índex i de l'arbre de treball [y,n,q,a,d"
 "%s,?]? "
 
 #: add-patch.c:145 add-patch.c:188 git-add--interactive.perl:1454
 #, c-format, perl-format
 msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-"Descarta la supressió des de l'índex i l'arbre de treball [y,n,q,a,d%s,?]? "
+msgstr "Descarta suprimir de l'índex i de l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:146 add-patch.c:189 git-add--interactive.perl:1455
 #, c-format, perl-format
 msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
-"Descarta aquest tros des de l'índex i l'arbre de treball [y,n,q,a,d%s,?]? "
+"Descarta aquest tros de l'índex i de l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:151
 msgid ""
@@ -486,8 +485,8 @@
 "a - discard this hunk and all later hunks in the file\n"
 "d - do not discard this hunk or any of the later hunks in the file\n"
 msgstr ""
-"y - descarta aquest tros de l'arbre de treball\n"
-"n - no descartis aquest tros des de l'arbre de treball\n"
+"y - descarta aquest tros de l'índex i de l'arbre de treball\n"
+"n - no descartis aquest tros de l'índex ni de l'arbre de treball\n"
 "q - surt; no apliquis aquest tros ni cap dels pendents\n"
 "a - descarta aquest tros i tots els trossos posteriors en el fitxer\n"
 "d - no descartis aquest tros ni cap dels trossos posteriors en el fitxer\n"
@@ -496,17 +495,17 @@
 #, c-format, perl-format
 msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
-"Aplica el canvi de mode a l'índex i l'arbre de treball [y,n,q,a,d%s,?]? "
+"Aplica el canvi de mode a l'índex i a l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:166 add-patch.c:209 git-add--interactive.perl:1459
 #, c-format, perl-format
 msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr "Aplica la supressió a l'índex i l'arbre de treball [y,n,q,a,d%s,?]? "
+msgstr "Aplica la supressió a l'índex i a l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:167 add-patch.c:210 git-add--interactive.perl:1460
 #, c-format, perl-format
 msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr "Aplica aquest tros a l'índex i l'arbre de treball [y,n,q,a,d%s,?]? "
+msgstr "Aplica aquest tros a l'índex i a l'arbre de treball [y,n,q,a,d%s,?]? "
 
 #: add-patch.c:172
 msgid ""
@@ -516,8 +515,8 @@
 "a - apply this hunk and all later hunks in the file\n"
 "d - do not apply this hunk or any of the later hunks in the file\n"
 msgstr ""
-"y - aplica aquest tros a l'índex i l'arbre de treball\n"
-"n - no apliquis aquest tros des de l'índex i de l'arbre de treball\n"
+"y - aplica aquest tros a l'índex i a l'arbre de treball\n"
+"n - no apliquis aquest tros a l'índex ni a l'arbre de treball\n"
 "q - surt; no apliquis aquest tros ni cap dels pendents\n"
 "a - aplica aquest tros i tots els trossos posteriors en el fitxer\n"
 "d - no apliquis aquest tros ni cap dels trossos posteriors en el fitxer\n"
@@ -607,9 +606,9 @@
 "Lines starting with %c will be removed.\n"
 msgstr ""
 "---\n"
-"Per suprimir «%c» línies, convertiu-les a ' ' (context).\n"
-"Per suprimir «%c» línies, suprimiu-les.\n"
-"Les línies que comencin per %c seran suprimides.\n"
+"Per a eliminar les línies «%c», convertiu-les en línies ' ' (context).\n"
+"Per a eliminar les línies «%c», suprimiu-les.\n"
+"Les línies que comencin per %c s'eliminaran.\n"
 
 #. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
 #: add-patch.c:1071 git-add--interactive.perl:1126
@@ -619,8 +618,7 @@
 "aborted and the hunk is left unchanged.\n"
 msgstr ""
 "Si no s'aplica correctament, tindreu una oportunitat per editar-lo\n"
-"de nou. Si totes les línies del tros se suprimeixen, llavors l'edició "
-"s'avorta\n"
+"de nou. Si s'eliminen totes les línies del tros, llavors l'edició s'avorta\n"
 "i el tros es deixa sense cap canvi.\n"
 
 #: add-patch.c:1104
@@ -629,7 +627,7 @@
 
 #: add-patch.c:1149
 msgid "'git apply --cached' failed"
-msgstr "'git apply --cached' ha fallat"
+msgstr "«git apply --cached» ha fallat"
 
 #. TRANSLATORS: do not translate [y/n]
 #. The program will only accept that input at this point.
@@ -698,7 +696,7 @@
 
 #: add-patch.c:1479 git-add--interactive.perl:1577
 msgid "go to which hunk (<ret> to see more)? "
-msgstr "vés a quin tros (<ret> per veure'n més)? "
+msgstr "vés a quin tros (<ret> per a veure'n més)? "
 
 #: add-patch.c:1480 git-add--interactive.perl:1579
 msgid "go to which hunk? "
@@ -793,7 +791,7 @@
 "as appropriate to mark resolution and make a commit."
 msgstr ""
 "Arregleu-los en l'arbre de treball, i després useu\n"
-"'git add/rm <fitxer>' segons sigui apropiat per a marcar la\n"
+"«git add/rm <fitxer>» segons sigui apropiat per a marcar la\n"
 "resolució i feu una comissió."
 
 #: advice.c:273
@@ -843,7 +841,7 @@
 "Si voleu crear una branca nova per a conservar les comissions que creeu,\n"
 "poder fer-ho (ara o més tard) usant -c amb l'ordre switch. Exemple:\n"
 "\n"
-"  git switch -b <nom-de-branca-nova>\n"
+"  git switch -c <nom-de-branca-nova>\n"
 "\n"
 "O desfer aquesta operació amb:\n"
 "\n"
@@ -1411,7 +1409,7 @@
 
 #: apply.c:4991
 msgid "mark new files with `git add --intent-to-add`"
-msgstr "marca els fitxers nous amb «git add --inten-to-add»"
+msgstr "marca els fitxers nous amb «git add --intent-to-add»"
 
 #: apply.c:4993
 msgid "apply a patch without touching the working tree"
@@ -1584,7 +1582,7 @@
 
 #: archive.c:432
 msgid "current working directory is untracked"
-msgstr "no es segueix el directori de treball actual"
+msgstr "no se segueix el directori de treball actual"
 
 #: archive.c:464
 msgid "fmt"
@@ -1677,7 +1675,7 @@
 #: archive.c:529
 #, c-format
 msgid "Argument not supported for format '%s': -%d"
-msgstr "Paràmetre no admès per al format «%s»: -%d"
+msgstr "Argument no admès per al format «%s»: -%d"
 
 #: attr.c:212
 #, c-format
@@ -1695,7 +1693,7 @@
 "Use '\\!' for literal leading exclamation."
 msgstr ""
 "Els patrons negatius s'ignoren en els atributs de git\n"
-"Useu '\\!' per exclamació capdavantera literal."
+"Useu «\\!» per exclamació capdavantera literal."
 
 #: bisect.c:468
 #, c-format
@@ -1867,7 +1865,7 @@
 "\n"
 "Després de corregir la causa de l'error, podeu\n"
 "intentar corregir la informació de seguiment remot\n"
-"invocant \"git branch --set-upstream-to=%s%s%s\"."
+"invocant «git branch --set-upstream-to=%s%s%s»."
 
 #: branch.c:67
 #, c-format
@@ -2053,7 +2051,7 @@
 
 #: bundle.c:280
 msgid "Could not spawn pack-objects"
-msgstr "No s'ha pogut executar el pack-objects"
+msgstr "No s'ha pogut generar el pack-objects"
 
 #: bundle.c:291
 msgid "pack-objects died"
@@ -2071,7 +2069,7 @@
 #: bundle.c:461 builtin/log.c:208 builtin/log.c:1834 builtin/shortlog.c:306
 #, c-format
 msgid "unrecognized argument: %s"
-msgstr "paràmetre no reconegut: %s"
+msgstr "argument no reconegut: %s"
 
 #: bundle.c:469
 msgid "Refusing to create empty bundle."
@@ -2124,9 +2122,9 @@
 msgstr "desplaçament %08x%08x del gràfic de comissions incorrecte"
 
 #: commit-graph.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "commit-graph chunk id %08x appears multiple times"
-msgstr "id%08x del graf de comissions múltiples vegades"
+msgstr "id %08x del graf de comissions apareix múltiples vegades"
 
 #: commit-graph.c:436
 msgid "commit-graph has no base graphs chunk"
@@ -2140,7 +2138,7 @@
 #, c-format
 msgid "invalid commit-graph chain: line '%s' not a hash"
 msgstr ""
-"la cadena del graf de comissions no és vàlida: la línea «%s» no és un hash"
+"la cadena del graf de comissions no és vàlida: la línia «%s» no és un hash"
 
 #: commit-graph.c:518
 msgid "unable to find all commit-graph files"
@@ -2185,7 +2183,7 @@
 
 #: commit-graph.c:1233
 msgid "Clearing commit marks in commit graph"
-msgstr "S'estan netejant les marques de comissions al graf de comissions"
+msgstr "S'estan esborrant les marques de comissions al graf de comissions"
 
 #: commit-graph.c:1252
 msgid "Computing commit graph generation numbers"
@@ -2374,7 +2372,7 @@
 "commit-graph has non-zero generation number for commit %s, but zero elsewhere"
 msgstr ""
 "El graf de comissions té un nombre de generació diferent de zero per a "
-"commisió %s però té zero en altres llocs"
+"comissió %s però té zero en altres llocs"
 
 #: commit-graph.c:2322
 #, c-format
@@ -2493,7 +2491,7 @@
 #: config.c:414
 #, c-format
 msgid "invalid key (newline): %s"
-msgstr "clau no vàlida (línea nova): %s"
+msgstr "clau no vàlida (línia nova): %s"
 
 #: config.c:450 config.c:462
 #, c-format
@@ -2568,7 +2566,7 @@
 #, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
 msgstr ""
-"valor de configuració numèric «%s» erroni' per «%s» en el blob de submòdul "
+"valor de configuració numèric «%s» erroni per «%s» en el blob de submòdul "
 "%s: %s"
 
 #: config.c:1025
@@ -2924,7 +2922,7 @@
 
 #: connected.c:119
 msgid "Could not run 'git rev-list'"
-msgstr "No s'ha pogut executar 'git rev-list'"
+msgstr "No s'ha pogut executar «git rev-list»"
 
 #: connected.c:139
 msgid "failed write to rev-list"
@@ -2937,7 +2935,7 @@
 #: convert.c:194
 #, c-format
 msgid "illegal crlf_action %d"
-msgstr "crlf_action %d  il·legal"
+msgstr "crlf_action %d il·legal"
 
 #: convert.c:207
 #, c-format
@@ -2957,7 +2955,7 @@
 #: convert.c:217
 #, c-format
 msgid "LF would be replaced by CRLF in %s"
-msgstr "LF es reemplaçà per LF en %s"
+msgstr "LF es reemplaçà per CRLF en %s"
 
 #: convert.c:219
 #, c-format
@@ -2994,7 +2992,7 @@
 "The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
 "%sLE (depending on the byte order) as working-tree-encoding."
 msgstr ""
-"Falta una marca d'ordre de byte (BOM) al fitxer «%s» . Useu UTF-%sBE o UTF-"
+"Falta una marca d'ordre de byte (BOM) al fitxer «%s». Useu UTF-%sBE o UTF-"
 "%sLE (depenent de l'ordre de byte) com a codificacions d'arbre de treball."
 
 #: convert.c:419 convert.c:490
@@ -3038,7 +3036,7 @@
 
 #: convert.c:851
 msgid "path name too long for external filter"
-msgstr "el nom del camí és massa llarg per al filtre extern"
+msgstr "el nom del camí és massa gran per al filtre extern"
 
 #: convert.c:943
 #, c-format
@@ -3240,7 +3238,7 @@
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr ""
-"Valor desconegut de la variable de configuració de 'diff.submodule': «%s»"
+"Valor desconegut de la variable de configuració de «diff.submodule»: «%s»"
 
 #: diff.c:465
 #, c-format
@@ -3248,7 +3246,7 @@
 "Found errors in 'diff.dirstat' config variable:\n"
 "%s"
 msgstr ""
-"S'han trobat errors en la variable de configuració 'diff.dirstat':\n"
+"S'han trobat errors en la variable de configuració «diff.dirstat»:\n"
 "%s"
 
 #: diff.c:4238
@@ -3316,12 +3314,12 @@
 #: diff.c:4961
 #, c-format
 msgid "bad --color-moved argument: %s"
-msgstr "paràmetre --color-moved incorrecte: %s"
+msgstr "argument --color-moved incorrecte: %s"
 
 #: diff.c:4980
 #, c-format
 msgid "invalid mode '%s' in --color-moved-ws"
-msgstr "mode «%s» no vàlid en -color-moved-ws"
+msgstr "mode «%s» no vàlid en --color-moved-ws"
 
 #: diff.c:5020
 msgid ""
@@ -3344,7 +3342,7 @@
 #: diff.c:5270
 #, c-format
 msgid "bad --word-diff argument: %s"
-msgstr "paràmetre --word-diff incorrecte: %s"
+msgstr "argument --word-diff incorrecte: %s"
 
 #: diff.c:5293
 msgid "Diff output format options"
@@ -3372,11 +3370,11 @@
 
 #: diff.c:5312
 msgid "synonym for '-p --raw'"
-msgstr "sinònim de per a «-p --raw»"
+msgstr "sinònim de «-p --raw»"
 
 #: diff.c:5316
 msgid "synonym for '-p --stat'"
-msgstr "sinònim de per a «-p --stat»"
+msgstr "sinònim de «-p --stat»"
 
 #: diff.c:5320
 msgid "machine friendly --stat"
@@ -3399,11 +3397,11 @@
 
 #: diff.c:5330
 msgid "synonym for --dirstat=cumulative"
-msgstr "sinònim per -dirstat=cumulative"
+msgstr "sinònim de --dirstat=cumulative"
 
 #: diff.c:5334
 msgid "synonym for --dirstat=files,param1,param2..."
-msgstr "sinònim per --dirstat=files,param1,param2..."
+msgstr "sinònim de --dirstat=files,param1,param2..."
 
 #: diff.c:5338
 msgid "warn if changes introduce conflict markers or whitespace errors"
@@ -3425,7 +3423,7 @@
 
 #: diff.c:5349
 msgid "<width>[,<name-width>[,<count>]]"
-msgstr "<width>[<name-width>[<count>]]"
+msgstr "<amplada>[<amplada-nom>[,<recompte>]]"
 
 #: diff.c:5350
 msgid "generate diffstat"
@@ -3461,7 +3459,7 @@
 
 #: diff.c:5368
 msgid "output a binary diff that can be applied"
-msgstr "diff amb sortida binaria que pot ser aplicada"
+msgstr "diff amb sortida binària que pot ser aplicada"
 
 #: diff.c:5371
 #, fuzzy
@@ -3474,17 +3472,15 @@
 msgstr "mostra un diff amb colors"
 
 #: diff.c:5374
-#, fuzzy
 msgid "<kind>"
 msgstr "<kind>"
 
 #: diff.c:5375
-#, fuzzy
 msgid ""
 "highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
 "diff"
 msgstr ""
-"ressalta els errors d'espai en blanc a les línies «context» «old» o «new» al "
+"ressalta els errors d'espai en blanc a les línies «context», «old» o «new» al "
 "diff"
 
 #: diff.c:5378
@@ -3501,12 +3497,10 @@
 msgstr "<prefix>"
 
 #: diff.c:5382
-#, fuzzy
 msgid "show the given source prefix instead of \"a/\""
 msgstr "mostra el prefix d'origen donat en lloc de «a/»"
 
 #: diff.c:5385
-#, fuzzy
 msgid "show the given destination prefix instead of \"b/\""
 msgstr "mostra el prefix de destinació indicat en lloc de «b/»"
 
@@ -3519,7 +3513,6 @@
 msgstr "no mostris cap prefix d'origen o destí"
 
 #: diff.c:5394
-#, fuzzy
 msgid "show context between diff hunks up to the specified number of lines"
 msgstr ""
 "mostra el context entre trossos de diferència fins al nombre especificat de "
@@ -3585,17 +3578,16 @@
 msgstr "continua llistant l'històric d'un fitxer més enllà dels canvis de nom"
 
 #: diff.c:5439
-#, fuzzy
 msgid ""
 "prevent rename/copy detection if the number of rename/copy targets exceeds "
 "given limit"
 msgstr ""
-"Evita la detecció de canvi de nom/còpia si el nombre d'objectius de canvi de "
-"nom supera el límit indicat"
+"Evita la detecció de canvi de nom/còpia si el nombre d'objectius de canvi de nom/còpia "
+"supera el límit indicat"
 
 #: diff.c:5441
 msgid "Diff algorithm options"
-msgstr "Opcions d'algorisme Diff"
+msgstr "Opcions de l'algorisme Diff"
 
 #: diff.c:5443
 msgid "produce the smallest possible diff"
@@ -3603,7 +3595,7 @@
 
 #: diff.c:5446
 msgid "ignore whitespace when comparing lines"
-msgstr "ignora els espai en blanc en comparar línies"
+msgstr "ignora els espais en blanc en comparar línies"
 
 #: diff.c:5449
 msgid "ignore changes in amount of whitespace"
@@ -3622,10 +3614,9 @@
 msgstr "ignora els canvis en línies que estan en blanc"
 
 #: diff.c:5461
-#, fuzzy
 msgid "heuristic to shift diff hunk boundaries for easy reading"
 msgstr ""
-"heurística per canviar els límits del tros de diferència per a lectura fàcil"
+"heurística per a desplaçar els límits del tros de diferència per a una lectura fàcil"
 
 #: diff.c:5464
 msgid "generate diff using the \"patience diff\" algorithm"
@@ -3641,7 +3632,7 @@
 
 #: diff.c:5471
 msgid "choose a diff algorithm"
-msgstr "escolliu un algorisme pel diff"
+msgstr "trieu un algorisme per al diff"
 
 #: diff.c:5473
 msgid "<text>"
@@ -4070,7 +4061,7 @@
 
 #: fetch-pack.c:1211
 msgid "Server does not support shallow requests"
-msgstr "El servidor no permet peticions superficials"
+msgstr "El servidor no permet sol·licituds superficials"
 
 #: fetch-pack.c:1218
 msgid "Server supports filter"
@@ -4078,7 +4069,7 @@
 
 #: fetch-pack.c:1242
 msgid "unable to write request to remote"
-msgstr "no s'ha pogut escriure la petició al remot"
+msgstr "no s'ha pogut escriure la sol·licitud al remot"
 
 #: fetch-pack.c:1260
 #, c-format
@@ -4102,11 +4093,11 @@
 
 #: fetch-pack.c:1342
 msgid "expected packfile to be sent after 'ready'"
-msgstr "s'espera l'enviament del fitxer de paquet després de «ready»"
+msgstr "s'esperava l'enviament del fitxer de paquet després de «ready»"
 
 #: fetch-pack.c:1344
 msgid "expected no other sections to be sent after no 'ready'"
-msgstr "s'espera que cap altra seccions s'enviï després de no «ready»"
+msgstr "s'esperava que no s'enviés cap altra secció després de no «ready»"
 
 #: fetch-pack.c:1386
 #, c-format
@@ -4209,17 +4200,14 @@
 msgstr "col·laborar (vegeu també: git help workflow)"
 
 #: help.c:31
-#, fuzzy
 msgid "Main Porcelain Commands"
 msgstr "Ordres principals de porcellana"
 
 #: help.c:32
-#, fuzzy
 msgid "Ancillary Commands / Manipulators"
-msgstr "Ordres Auxiliars / Manipuladors"
+msgstr "Ordres auxiliars / manipuladors"
 
 #: help.c:33
-#, fuzzy
 msgid "Ancillary Commands / Interrogators"
 msgstr "Ordres auxiliars / interrogadors"
 
@@ -4477,7 +4465,7 @@
 "may have crashed in this repository earlier:\n"
 "remove the file manually to continue."
 msgstr ""
-"No s'ha pogut crear '%s.lock': %s.\n"
+"No s'ha pogut crear «%s.lock»: %s.\n"
 "\n"
 "Sembla que un altre procés de git s'està executant en aquest\n"
 "dipòsit, per exemple, un editor obert per «git commit». \n"
@@ -4586,8 +4574,7 @@
 #, c-format
 msgid "Failed to merge submodule %s (merge following commits not found)"
 msgstr ""
-"Ha fallat en fusionar el submòdul  %s (no s'ha trobat les comissions "
-"següents)"
+"Ha fallat en fusionar el submòdul %s (no s'ha trobat les comissions següents)"
 
 #: merge-recursive.c:1255
 #, c-format
@@ -4611,7 +4598,7 @@
 msgstr ""
 "Si això és correcte simplement afegiu-ho a l'índex per exemple utilitzant "
 "git update-index --cacheinfo 160000 per cents \"%s\" que acceptaran aquest "
-"suggeriment."
+"suggeriment.\n"
 
 #: merge-recursive.c:1268
 #, c-format
@@ -5050,9 +5037,8 @@
 msgstr "no s'han vist caure els paquets del fitxer"
 
 #: midx.c:925
-#, fuzzy
 msgid "no pack files to index."
-msgstr "Afegint fitxers de paquets a multi-index"
+msgstr "no hi ha fitxers empaquetats a indexar."
 
 #: midx.c:977
 #, fuzzy
@@ -5066,7 +5052,7 @@
 
 #: midx.c:1112
 msgid "Looking for referenced packfiles"
-msgstr "S'estan cercant fitxers de paquets referenciats"
+msgstr "S'estan cercant fitxers empaquetats referenciats"
 
 #: midx.c:1127
 #, fuzzy, c-format
@@ -5124,7 +5110,7 @@
 
 #: midx.c:1433
 msgid "could not start pack-objects"
-msgstr "no s'ha pogut executar el pack-objects"
+msgstr "no s'ha pogut iniciar el pack-objects"
 
 #: midx.c:1452
 msgid "could not finish pack-objects"
@@ -5205,14 +5191,14 @@
 msgstr "no s'ha pogut analitzar l'objecte: %s"
 
 #: object.c:266 object.c:278
-#, fuzzy, c-format
+#, c-format
 msgid "hash mismatch %s"
-msgstr "els resums no coincideixen"
+msgstr "el resum no coincideix %s"
 
 #: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2135
-#, fuzzy, c-format
+#, c-format
 msgid "unable to get size of %s"
-msgstr "no s'ha pogut obtenir la mida dels percentatges"
+msgstr "no s'ha pogut obtenir la mida de %s"
 
 #: packfile.c:629
 msgid "offset before end of packfile (broken .idx?)"
@@ -5325,7 +5311,7 @@
 #: parse-options.c:907
 #, c-format
 msgid "   or: %s"
-msgstr " o: %s"
+msgstr "   o: %s"
 
 #: parse-options.c:910
 #, c-format
@@ -5381,7 +5367,7 @@
 #: pathspec.c:327
 #, c-format
 msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr "Màgia d'especificació de camí no vàlida '%.*s' en «%s»"
+msgstr "Màgia d'especificació de camí no vàlida «%.*s» en «%s»"
 
 #: pathspec.c:332
 #, c-format
@@ -5728,7 +5714,7 @@
 msgstr "no s'ha pogut desenllaçar: %s"
 
 #: read-cache.c:3179
-#, fuzzy, c-format
+#, c-format
 msgid "cannot fix permission bits on '%s'"
 msgstr "no s'han pogut corregir els bits de permisos en «%s»"
 
@@ -5743,8 +5729,9 @@
 "continue'.\n"
 "Or you can abort the rebase with 'git rebase --abort'.\n"
 msgstr ""
-"Podeu arreglar això amb 'git rebase --edit-todo' i després 'git rebase --"
-"continue'.\n"
+"Podeu arreglar-ho amb «git rebase --edit-todo» i després «git rebase --"
+"continue».\n"
+"O bé, podeu avortar el «rebase» amb «git rebase --abort».\n"
 
 #: rebase-interactive.c:33
 #, c-format
@@ -5776,9 +5763,26 @@
 "\n"
 "These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
-"Les ordres p select <commit> = fa servir «commit» (commit) «commit» (commit) "
-"«commit» (commit) «commit» (commit) «commit» (commit)"
-
+"\n"
+"Ordres:\n"
+" p, pick <comissió> = usa la comissió\n"
+" r, reword <comissió> = usa la comissió, però edita el missatge de comissió\n"
+" e, edit <comissió> = usa la comissió, però atura't per a esmenar\n"
+" s, squash <comissió> = usa la comissió, però fusiona-la a la comissió prèvia\n"
+" f, fixup <comissió> = com a «squash», però descarta el missatge de registre d'aquesta "
+"comissió\n"
+"x, exec <comissió> = executa l'ordre (la resta de la línia) usant l'intèrpret "
+"d'ordres\n"
+"b, break = atura't aquí (continua fent «rebase» després amb «git rebase --continue»)\n"
+"d, drop <comissió> = elimina la comissió\n"
+"l, label <etiqueta> = etiqueta la HEAD actual amb un nom\n"
+"t, reset <etiqueta> = reinicia HEAD a una etiqueta    \n"
+"m, merge [-C <comissió> | -c <comissió>] <etiqueta> [# <oneline>]\n"
+".       crea una comissió de fusió usant el missatge de la comissió\n"
+".       de fusió original (o línia única, si no hi ha cap comissió de fusió original\n"
+".       especificada). Useu -c <comissió> per a reescriure el missatge de publicació.\n"
+"\n"
+"Es pot canviar l'ordre d'aquestes línies; s'executen de dalt a baix.\n"
 #: rebase-interactive.c:63
 #, c-format
 msgid "Rebase %s onto %s (%d command)"
@@ -5915,37 +5919,37 @@
 #: ref-filter.c:195
 #, c-format
 msgid "unrecognized %%(%s) argument: %s"
-msgstr "paràmetre %%(%s) desconegut: %s"
+msgstr "argument %%(%s) desconegut: %s"
 
 #: ref-filter.c:250
 #, c-format
 msgid "%%(objecttype) does not take arguments"
-msgstr "%%(subject) no accepta paràmetres"
+msgstr "%%(objecttype) no accepta arguments"
 
 #: ref-filter.c:272
 #, c-format
 msgid "unrecognized %%(objectsize) argument: %s"
-msgstr "paràmetre %%(objectsize) no reconegut: %s"
+msgstr "argument %%(objectsize) no reconegut: %s"
 
 #: ref-filter.c:280
 #, c-format
 msgid "%%(deltabase) does not take arguments"
-msgstr "%%(deltabase) no accepta paràmetres"
+msgstr "%%(deltabase) no accepta arguments"
 
 #: ref-filter.c:292
 #, c-format
 msgid "%%(body) does not take arguments"
-msgstr "%%(body) no accepta paràmetres"
+msgstr "%%(body) no accepta arguments"
 
 #: ref-filter.c:301
 #, c-format
 msgid "%%(subject) does not take arguments"
-msgstr "%%(subject) no accepta paràmetres"
+msgstr "%%(subject) no accepta arguments"
 
 #: ref-filter.c:323
 #, c-format
 msgid "unknown %%(trailers) argument: %s"
-msgstr "paràmetre %%(trailers) desconegut: %s"
+msgstr "argument %%(trailers) desconegut: %s"
 
 #: ref-filter.c:352
 #, c-format
@@ -5955,7 +5959,7 @@
 #: ref-filter.c:354
 #, c-format
 msgid "unrecognized %%(contents) argument: %s"
-msgstr "paràmetre %%(contents) no reconegut: %s"
+msgstr "argument %%(contents) no reconegut: %s"
 
 #: ref-filter.c:369
 #, c-format
@@ -5965,7 +5969,7 @@
 #: ref-filter.c:373
 #, c-format
 msgid "unrecognized %%(objectname) argument: %s"
-msgstr "paràmetre %%(objectname) no reconegut: %s"
+msgstr "argument %%(objectname) no reconegut: %s"
 
 #: ref-filter.c:403
 #, c-format
@@ -5985,7 +5989,7 @@
 #: ref-filter.c:431
 #, c-format
 msgid "unrecognized %%(align) argument: %s"
-msgstr "paràmetre %%(align) no reconegut: %s"
+msgstr "argument %%(align) no reconegut: %s"
 
 #: ref-filter.c:439
 #, c-format
@@ -5995,7 +5999,7 @@
 #: ref-filter.c:457
 #, c-format
 msgid "unrecognized %%(if) argument: %s"
-msgstr "paràmetre %%(if) no reconegut: %s"
+msgstr "argument %%(if) no reconegut: %s"
 
 #: ref-filter.c:559
 #, c-format
@@ -6450,7 +6454,7 @@
 #: remote.c:2016
 #, c-format
 msgid "  (use \"%s\" for details)\n"
-msgstr "  (useu  «%s» per detalls)\n"
+msgstr "  (useu «%s» per a detalls)\n"
 
 #: remote.c:2020
 #, c-format
@@ -6461,7 +6465,7 @@
 
 #: remote.c:2026
 msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr "  (useu \"git push\" per a publicar les vostres comissions locals)\n"
+msgstr "  (useu «git push» per a publicar les vostres comissions locals)\n"
 
 #: remote.c:2029
 #, c-format
@@ -6713,7 +6717,7 @@
 #: sequencer.c:316 builtin/rebase.c:743 builtin/rebase.c:1582 builtin/rm.c:385
 #, c-format
 msgid "could not remove '%s'"
-msgstr "no s'ha pogut suprimir «%s»"
+msgstr "no s'ha pogut eliminar «%s»"
 
 #: sequencer.c:326
 msgid "revert"
@@ -6739,7 +6743,7 @@
 "with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
 "després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'"
+"corregits amb «git add <camins>» o «git rm <camins>»"
 
 #: sequencer.c:393
 msgid ""
@@ -6748,8 +6752,8 @@
 "and commit the result with 'git commit'"
 msgstr ""
 "després de resoldre els conflictes, marqueu els camins\n"
-"corregits amb 'git add <camins>' o 'git rm <camins>'\n"
-"i cometeu el resultat amb 'git commit'"
+"corregits amb «git add <camins>» o «git rm <camins>»\n"
+"i cometeu el resultat amb «git commit»"
 
 #: sequencer.c:406 sequencer.c:2921
 #, c-format
@@ -6839,7 +6843,7 @@
 #: sequencer.c:809
 #, c-format
 msgid "unknown variable '%s'"
-msgstr "variable  «%s» desconeguda"
+msgstr "variable «%s» desconeguda"
 
 #: sequencer.c:814
 msgid "missing 'GIT_AUTHOR_NAME'"
@@ -6932,8 +6936,8 @@
 "Comproveu que siguin correctes. Podeu suprimir aquest\n"
 "missatge establint-los explícitament:\n"
 "\n"
-"    git config --global user.name \"El Vostre Nom\"\n"
-"    git config --global user.email tu@example.com\n"
+"    git config --global user.name \"El vostre nom\"\n"
+"    git config --global user.email usuari@example.com\n"
 "\n"
 "Després de fer això, podeu arreglar la identitat usada per a aquesta\n"
 "comissió amb:\n"
@@ -7116,12 +7120,12 @@
 #: sequencer.c:2114
 #, c-format
 msgid "%s does not accept arguments: '%s'"
-msgstr "%s no accepta paràmetres: «%s»"
+msgstr "%s no accepta arguments: «%s»"
 
 #: sequencer.c:2123
 #, c-format
 msgid "missing arguments for %s"
-msgstr "falten els arguments per %s"
+msgstr "falten els arguments per a %s"
 
 #: sequencer.c:2154
 #, c-format
@@ -7515,7 +7519,7 @@
 
 #: sequencer.c:4111
 msgid "could not read 'onto'"
-msgstr "no s'ha pogut llegir 'onto'"
+msgstr "no s'ha pogut llegir «onto»"
 
 #: sequencer.c:4125
 #, c-format
@@ -7624,15 +7628,15 @@
 "Use '--' to separate paths from revisions, like this:\n"
 "'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"paràmetre ambigu «%s»: revisió no coneguda o el camí no és en l'arbre de "
+"argument ambigu «%s»: revisió no coneguda o el camí no és en l'arbre de "
 "treball.\n"
 "Useu «--» per a separar els camins de les revisions:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+"«git <ordre> [<revisió>...] -- [<fitxer>...]»"
 
 #: setup.c:264
 #, c-format
 msgid "option '%s' must come before non-option arguments"
-msgstr "l'opció «%s» ha de venir abans dels arguments opcionals"
+msgstr "l'opció «%s» ha d'aparèixer abans que els arguments opcionals"
 
 #: setup.c:283
 #, c-format
@@ -7641,9 +7645,9 @@
 "Use '--' to separate paths from revisions, like this:\n"
 "'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
-"paràmetre ambigu «%s»: ambdós una revisió i un nom de fitxer\n"
-"Useu '--' per a separar els camins de les revisions:\n"
-"'git <ordre> [<revisió>...] -- [<fitxer>...]'"
+"argument ambigu «%s»: ambdós una revisió i un nom de fitxer\n"
+"Useu «--» per a separar els camins de les revisions:\n"
+"«git <ordre> [<revisió>...] -- [<fitxer>...]»"
 
 #: setup.c:419
 msgid "unable to set up work tree using invalid config"
@@ -7672,7 +7676,7 @@
 #: setup.c:598
 #, c-format
 msgid "too large to be a .git file: '%s'"
-msgstr "massa larg per a ser un fitxer .git: «%s»"
+msgstr "massa llarg per a ser un fitxer .git: «%s»"
 
 #: setup.c:600
 #, c-format
@@ -7763,7 +7767,7 @@
 
 #: setup.c:1324
 msgid "setsid failed"
-msgstr "l'«stash» ha fallat"
+msgstr "«setsid» ha fallat"
 
 #: sha1-file.c:470
 #, c-format
@@ -7810,7 +7814,7 @@
 #, c-format
 msgid "reference repository '%s' as a linked checkout is not supported yet."
 msgstr ""
-"Encara no se suporta el dipòsit de referència «%s» com a agafament enllaçat."
+"encara no s'admet el dipòsit de referència «%s» com a agafament enllaçat."
 
 #: sha1-file.c:730
 #, c-format
@@ -8259,13 +8263,13 @@
 msgstr "l'entrada del submòdul «%s» (%s) és a %s, no és una comissió"
 
 #: submodule.c:995
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
 "submodule %s"
 msgstr ""
 "No s'ha pogut executar l'ordre «git rev-list <commits> --not --remotes -n 1» "
-"en els submòdul %s"
+"en el submòdul %s"
 
 #: submodule.c:1118
 #, fuzzy, c-format
@@ -8287,9 +8291,9 @@
 msgstr "No s'ha pogut prémer el submòdul «%s»"
 
 #: submodule.c:1453
-#, fuzzy, c-format
+#, c-format
 msgid "Fetching submodule %s%s\n"
-msgstr "Obtenint submòdul %s%s\n"
+msgstr "S'està obtenint el submòdul %s%s\n"
 
 #: submodule.c:1483
 #, c-format
@@ -8313,12 +8317,12 @@
 #: submodule.c:1679
 #, c-format
 msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr "No s'ha pogut executar «git status --porcelain=2» en els submòdul %s"
+msgstr "No s'ha pogut executar «git status --porcelain=2» en el submòdul %s"
 
 #: submodule.c:1720
 #, c-format
 msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr "«git status --porcelain=2» ha fallat en els submòdul %s"
+msgstr "«git status --porcelain=2» ha fallat en el submòdul %s"
 
 #: submodule.c:1800
 #, c-format
@@ -8328,7 +8332,7 @@
 #: submodule.c:1813
 #, c-format
 msgid "could not run 'git status' in submodule '%s'"
-msgstr "no s'ha pogut executar 'git status' al submòdul «%s»"
+msgstr "no s'ha pogut executar «git status» al submòdul «%s»"
 
 #: submodule.c:1828
 #, fuzzy, c-format
@@ -8358,7 +8362,7 @@
 #: submodule.c:2038
 #, c-format
 msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr "submodule git dir «%s» està dins git dir '%.*s'"
+msgstr "submodule git dir «%s» està dins git dir «%.*s»"
 
 #: submodule.c:2059
 #, c-format
@@ -8417,7 +8421,7 @@
 #: trailer.c:730
 #, c-format
 msgid "empty trailer token in trailer '%.*s'"
-msgstr "testimoni de remolc buit en el remolc '%.*s'"
+msgstr "testimoni de remolc buit en el remolc «%.*s»"
 
 #: trailer.c:750
 #, c-format
@@ -9014,7 +9018,7 @@
 
 #: urlmatch.c:163
 msgid "invalid URL scheme name or missing '://' suffix"
-msgstr "l'esquema d'URL no és vàlid o li manca el sufix '://'"
+msgstr "l'esquema d'URL no és vàlid o li manca el sufix «://»"
 
 #: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
 #, c-format
@@ -9023,11 +9027,11 @@
 
 #: urlmatch.c:215
 msgid "missing host and scheme is not 'file:'"
-msgstr "manca la màquina i l'esquema no és 'file:'"
+msgstr "manca la màquina i l'esquema no és «file:»"
 
 #: urlmatch.c:232
 msgid "a 'file:' URL may not have a port number"
-msgstr "un URL 'file:' no pot tenir número de port"
+msgstr "un URL «file:» no pot tenir número de port"
 
 #: urlmatch.c:247
 msgid "invalid characters in host name"
@@ -9039,7 +9043,7 @@
 
 #: urlmatch.c:371
 msgid "invalid '..' path segment"
-msgstr "segment de camí '..' no vàlid"
+msgstr "segment de camí «..» no vàlid"
 
 #: walker.c:170
 #, fuzzy
@@ -9107,21 +9111,21 @@
 
 #: wt-status.c:193 wt-status.c:225
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (useu \"git rm --cached <fitxer>...\" per a fer «unstage»)"
+msgstr "  (useu «git rm --cached <fitxer>...» per a fer «unstage»)"
 
 #: wt-status.c:197
 msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (useu \"git add <fitxer>...\" per a senyalar resolució)"
+msgstr "  (useu «git add <fitxer>...» per a senyalar resolució)"
 
 #: wt-status.c:199 wt-status.c:203
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
 msgstr ""
-"  (useu \"git add/rm <fitxer>...\" segons sigui apropiat per a senyalar "
+"  (useu «git add/rm <fitxer>...» segons sigui apropiat per a senyalar "
 "resolució)"
 
 #: wt-status.c:201
 msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (useu \"git rm <fitxer>...\" per a senyalar resolució)"
+msgstr "  (useu «git rm <fitxer>...» per a senyalar resolució)"
 
 #: wt-status.c:211 wt-status.c:1072
 msgid "Changes to be committed:"
@@ -9133,11 +9137,11 @@
 
 #: wt-status.c:238
 msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add <fitxer>...\" per a actualitzar què es cometrà)"
+msgstr "  (useu «git add <fitxer>...» per a actualitzar què es cometrà)"
 
 #: wt-status.c:240
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (useu \"git add/rm <fitxer>...\" per a actualitzar què es cometrà)"
+msgstr "  (useu «git add/rm <fitxer>...» per a actualitzar què es cometrà)"
 
 #: wt-status.c:241
 #, fuzzy
@@ -9155,7 +9159,7 @@
 #: wt-status.c:254
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (useu «git %s <fitxer>...» per a incloure-ho en el que es cometrà)"
+msgstr "  (useu «git %s <fitxer>...» per a incloure-ho en la comissió)"
 
 #: wt-status.c:268
 msgid "both deleted:"
@@ -9249,7 +9253,7 @@
 "Do not modify or remove the line above.\n"
 "Everything below it will be ignored."
 msgstr ""
-"No modifiqueu o suprimiu la línia de dalt.\n"
+"No modifiqueu ni elimineu la línia de dalt.\n"
 "Tot el que hi ha a sota s'ignorarà."
 
 #: wt-status.c:1112
@@ -9268,11 +9272,11 @@
 
 #: wt-status.c:1145
 msgid "  (fix conflicts and run \"git commit\")"
-msgstr "  (arregleu els conflictes i executeu \"git commit\")"
+msgstr "  (arregleu els conflictes i executeu «git commit»)"
 
 #: wt-status.c:1147
 msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr "  (useu \"git merge --abort\" per a avortar la fusió)"
+msgstr "  (useu «git merge --abort» per a avortar la fusió)"
 
 #: wt-status.c:1151
 msgid "All conflicts fixed but you are still merging."
@@ -9280,7 +9284,7 @@
 
 #: wt-status.c:1154
 msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (useu \"git commit\" per a concloure la fusió)"
+msgstr "  (useu «git commit» per a concloure la fusió)"
 
 #: wt-status.c:1163
 msgid "You are in the middle of an am session."
@@ -9292,15 +9296,15 @@
 
 #: wt-status.c:1170
 msgid "  (fix conflicts and then run \"git am --continue\")"
-msgstr "  (arregleu els conflictes i després executeu \"git am --continue\")"
+msgstr "  (arregleu els conflictes i després executeu «git am --continue»)"
 
 #: wt-status.c:1172
 msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (useu \"git am --skip\" per a ometre aquest pedaç)"
+msgstr "  (useu «git am --skip» per a ometre aquest pedaç)"
 
 #: wt-status.c:1174
 msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (useu \"git am --abort\" per a restaurar la branca original)"
+msgstr "  (useu «git am --abort» per a restaurar la branca original)"
 
 #: wt-status.c:1307
 msgid "git-rebase-todo is missing."
@@ -9335,7 +9339,7 @@
 
 #: wt-status.c:1339
 msgid "  (use \"git rebase --edit-todo\" to view and edit)"
-msgstr "  (useu \"git rebase --edit-todo\" per a veure i editar)"
+msgstr "  (useu «git rebase --edit-todo» per a veure i editar)"
 
 #: wt-status.c:1351
 #, c-format
@@ -9378,8 +9382,8 @@
 #: wt-status.c:1392
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
 msgstr ""
-"  (Una vegada que el vostre directori de treball sigui net, executeu \"git "
-"rebase --continue\")"
+"  (Una vegada que el vostre directori de treball sigui net, executeu «git "
+"rebase --continue»)"
 
 #: wt-status.c:1396
 #, c-format
@@ -9394,13 +9398,13 @@
 
 #: wt-status.c:1404
 msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (useu \"git commit --amend\" per a esmenar la comissió actual)"
+msgstr "  (useu «git commit --amend» per a esmenar la comissió actual)"
 
 #: wt-status.c:1406
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
 msgstr ""
-"  (useu \"git rebase --continue\" una vegada que estigueu satisfet amb els "
+"  (useu «git rebase --continue» una vegada que estigueu satisfet amb els "
 "vostres canvis)"
 
 #: wt-status.c:1417
@@ -9417,9 +9421,8 @@
 msgstr "  (arregleu els conflictes i executeu «git cherry-pick --continue»)"
 
 #: wt-status.c:1430
-#, fuzzy
 msgid "  (run \"git cherry-pick --continue\" to continue)"
-msgstr "(executa \"git cherry-pick --continue\" per continuar)"
+msgstr "  (executeu «git cherry-pick --continue» per a continuar)"
 
 #: wt-status.c:1433
 msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
@@ -9434,7 +9437,7 @@
 #: wt-status.c:1437
 msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
 msgstr ""
-"  (useu \"git cherry-pick --abort\" per a cancel·lar l'operació de «cherry "
+"  (useu «git cherry-pick --abort» per a cancel·lar l'operació de «cherry "
 "pick»)"
 
 #: wt-status.c:1447
@@ -9448,27 +9451,24 @@
 
 #: wt-status.c:1456
 msgid "  (fix conflicts and run \"git revert --continue\")"
-msgstr "  (arregleu els conflictes i executeu \"git revert --continue\")"
+msgstr "  (arregleu els conflictes i executeu «git revert --continue»)"
 
 #: wt-status.c:1459
-#, fuzzy
 msgid "  (run \"git revert --continue\" to continue)"
-msgstr "(executa \"git revert --continue\" per continuar)"
+msgstr "  (executeu «git revert --continue» per a continuar)"
 
 #: wt-status.c:1462
 msgid "  (all conflicts fixed: run \"git revert --continue\")"
 msgstr ""
-"  (tots els conflictes estan arreglats: executeu \"git revert --continue\")"
+"  (tots els conflictes estan arreglats: executeu «git revert --continue»)"
 
 #: wt-status.c:1464
-#, fuzzy
 msgid "  (use \"git revert --skip\" to skip this patch)"
-msgstr "(useu \"git revert --skip\" per ometre aquest pedaç)"
+msgstr "  (useu «git revert --skip» per a ometre aquest pedaç)"
 
 #: wt-status.c:1466
 msgid "  (use \"git revert --abort\" to cancel the revert operation)"
-msgstr ""
-"  (useu \"git revert --abort\" per a cancel·lar l'operació de reversió)"
+msgstr "  (useu «git revert --abort» per a cancel·lar l'operació de reversió)"
 
 #: wt-status.c:1476
 #, c-format
@@ -9481,7 +9481,7 @@
 
 #: wt-status.c:1483
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (useu \"git bisect reset\" per a tornar a la branca original)"
+msgstr "  (useu «git bisect reset» per a tornar a la branca original)"
 
 #: wt-status.c:1692
 msgid "On branch "
@@ -9523,9 +9523,9 @@
 "new files yourself (see 'git help status')."
 msgstr ""
 "Ha trigat %.2f segons enumerar els fitxers no seguits.\n"
-"'status -uno' pot accelerar-ho, però heu d'anar amb compte de no\n"
+"«status -uno» pot accelerar-ho, però heu d'anar amb compte de no\n"
 "oblidar-vos d'afegir fitxers nous vosaltres mateixos (vegeu\n"
-"'git help status')."
+"«git help status»)."
 
 #: wt-status.c:1755
 #, c-format
@@ -9543,8 +9543,7 @@
 #: wt-status.c:1768
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
-msgstr ""
-"no hi ha canvis afegits a cometre (useu \"git add\" o \"git commit -a\")\n"
+msgstr "no hi ha canvis afegits a cometre (useu «git add» o «git commit -a»)\n"
 
 #: wt-status.c:1771
 #, c-format
@@ -9780,12 +9779,12 @@
 "\n"
 "\tgit submodule add <url> %s\n"
 "\n"
-"Si heu afegit aquest camí per error, podeu suprimir-lo de\n"
+"Si heu afegit aquest camí per error, podeu eliminar-lo de\n"
 "l'índex amb:\n"
 "\n"
 "\tgit rm --cached %s\n"
 "\n"
-"Vegeu \"git help submodule\" per a més informació."
+"Vegeu «git help submodule» per a més informació."
 
 #: builtin/add.c:391
 #, c-format
@@ -9916,20 +9915,19 @@
 #: builtin/am.c:1089
 #, c-format
 msgid "When you have resolved this problem, run \"%s --continue\"."
-msgstr "Quan hàgiu resolt aquest problema, executeu \"%s --continue\"."
+msgstr "Quan hàgiu resolt aquest problema, executeu «%s --continue»."
 
 #: builtin/am.c:1090
 #, c-format
 msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
-msgstr ""
-"Si preferiu ometre aquest pedaç, executeu \"%s --skip\" en lloc d'això."
+msgstr "Si preferiu ometre aquest pedaç, executeu «%s --skip» en lloc d'això."
 
 #: builtin/am.c:1091
 #, c-format
 msgid "To restore the original branch and stop patching, run \"%s --abort\"."
 msgstr ""
-"Per a restaurar la branca original i deixar d'apedaçar, executeu \"%s --abort"
-"\"."
+"Per a restaurar la branca original i deixar d'apedaçar, executeu «%s --"
+"abort»."
 
 #: builtin/am.c:1174
 #, fuzzy
@@ -10035,7 +10033,7 @@
 "If there is nothing left to stage, chances are that something else\n"
 "already introduced the same changes; you might want to skip this patch."
 msgstr ""
-"Cap canvi - heu oblidat d'usar 'git add'?\n"
+"Cap canvi - heu oblidat d'usar «git add»?\n"
 "Si no hi ha res per fer «stage», probablement alguna altra cosa ja ha\n"
 "introduït els mateixos canvis; potser voleu ometre aquest pedaç."
 
@@ -10047,9 +10045,9 @@
 "You might run `git rm` on a file to accept \"deleted by them\" for it."
 msgstr ""
 "Encara teniu camins sense fusionar a l'índex.\n"
-"Heu de fer 'git add' a cada fitxer amb conflictes resolts per marcar-los com "
-"a tal.\n"
-"Podeu executar `git rm` en un fitxer per acceptar \"suprimit per ells\" pel "
+"Heu de fer «git add» a cada fitxer amb conflictes resolts per a marcar-los "
+"com a tal.\n"
+"Podeu executar «git rm» en un fitxer per a acceptar «suprimit per ells» pel "
 "fitxer."
 
 #: builtin/am.c:1928 builtin/am.c:1932 builtin/am.c:1944 builtin/reset.c:347
@@ -10067,7 +10065,7 @@
 "You seem to have moved HEAD since the last 'am' failure.\n"
 "Not rewinding to ORIG_HEAD"
 msgstr ""
-"Sembla que heu mogut HEAD després de l'última fallada de 'am'.\n"
+"Sembla que heu mogut HEAD després de l'última fallada de «am».\n"
 "No s'està rebobinant a ORIG_HEAD"
 
 #: builtin/am.c:2131
@@ -10247,7 +10245,7 @@
 "Use \"git am --abort\" to remove it."
 msgstr ""
 "S'ha trobat un directori %s extraviat.\n"
-"Useu \"git am --abort\" per a eliminar-lo."
+"Useu «git am --abort» per a eliminar-lo."
 
 #: builtin/am.c:2370
 msgid "Resolve operation not in progress, we are not resuming."
@@ -10396,9 +10394,9 @@
 msgstr "Arguments de bisectriu incorrectes"
 
 #: builtin/bisect--helper.c:221
-#, fuzzy, c-format
+#, c-format
 msgid "couldn't get the oid of the rev '%s'"
-msgstr "no s'ha pogut obtenir l'oide de la revista '%s'"
+msgstr "no s'ha pogut obtenir l'oid de la revisió «%s»"
 
 #: builtin/bisect--helper.c:233
 #, fuzzy, c-format
@@ -10426,9 +10424,9 @@
 "You then need to give me at least one %s and %s revision.\n"
 "You can use \"git bisect %s\" and \"git bisect %s\" for that."
 msgstr ""
-"Heu de començar per \"git bisect start\". Després heu de donar-me com a "
-"mínim un per cents i per cents revisió. Podeu utilitzar \"git bisectrius\" i "
-"\"git bisectrius\" per a això."
+"Heu de començar per «git bisect start». \n"
+"Després heu de donar-me com a mínim un per cents i per cents revisió. Podeu "
+"utilitzar «git bisect %s» i «git bisect %s» per a això."
 
 #: builtin/bisect--helper.c:310
 #, c-format
@@ -10462,7 +10460,7 @@
 "invalid argument %s for 'git bisect terms'.\n"
 "Supported options are: --term-good|--term-old and --term-bad|--term-new."
 msgstr ""
-"paràmetre no vàlid %s per a 'git bisect terms'.\n"
+"argument no vàlid %s per a «git bisect terms».\n"
 "Les opcions admeses són: --term-good|--term-old i --term-bad|--term-new."
 
 #: builtin/bisect--helper.c:478
@@ -10483,7 +10481,7 @@
 #, c-format
 msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
 msgstr ""
-"l'agafament de «%s» ha fallat. Proveu «git  bisect start <branca-vàlida>»."
+"l'agafament de «%s» ha fallat. Proveu «git bisect start <branca-vàlida>»."
 
 #: builtin/bisect--helper.c:550
 msgid "won't bisect on cg-seek'ed tree"
@@ -10501,7 +10499,7 @@
 
 #: builtin/bisect--helper.c:633
 msgid "perform 'git bisect next'"
-msgstr "realitza 'git bisect next'"
+msgstr "realitza «git bisect next»"
 
 #: builtin/bisect--helper.c:635
 msgid "write the terms to .git/BISECT_TERMS"
@@ -10556,11 +10554,11 @@
 
 #: builtin/bisect--helper.c:673
 msgid "--write-terms requires two arguments"
-msgstr "--write-terms requereix dos paràmetres"
+msgstr "--write-terms requereix dos arguments"
 
 #: builtin/bisect--helper.c:677
 msgid "--bisect-clean-state requires no arguments"
-msgstr "--bisect-clean-state no accepta paràmetres"
+msgstr "--bisect-clean-state no requereix cap argument"
 
 #: builtin/bisect--helper.c:684
 #, fuzzy
@@ -10834,7 +10832,7 @@
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
 "La branca «%s» no està totalment fusionada.\n"
-"Si esteu segur que la voleu suprimir, executeu 'git branch -D %s'."
+"Si esteu segur que la voleu suprimir, executeu «git branch -D %s»."
 
 #: builtin/branch.c:189
 msgid "Update of config-file failed"
@@ -11135,7 +11133,7 @@
 
 #: builtin/branch.c:790
 msgid "too many arguments for a rename operation"
-msgstr "hi ha massa arguments per a una operació remota"
+msgstr "hi ha massa arguments per a una operació de canvi de nom"
 
 #: builtin/branch.c:795
 msgid "too many arguments to set new upstream"
@@ -11186,8 +11184,8 @@
 "the '--set-upstream' option is no longer supported. Please use '--track' or "
 "'--set-upstream-to' instead."
 msgstr ""
-"L'opció --set-upstream ja no està suportada. Useu en comptes --track o --set-"
-"upstream-to."
+"L'opció --set-upstream ja no s'admet. En lloc seu, useu «--track» o «--set-"
+"upstream-to»."
 
 #: builtin/bundle.c:15 builtin/bundle.c:23
 #, fuzzy
@@ -11944,7 +11942,7 @@
 #: builtin/checkout.c:1697
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr "git checkout: --detach no accepta un paràmetre de camí «%s»"
+msgstr "git checkout: --detach no accepta un argument de camí «%s»"
 
 #: builtin/checkout.c:1706
 #, fuzzy
@@ -11990,7 +11988,7 @@
 #: builtin/checkout.c:1757
 #, fuzzy
 msgid "second guess 'git checkout <no-such-branch>' (default)"
-msgstr "segon conjectura 'git checkout <no-such-branch>' (per defecte)"
+msgstr "segon conjectura «git checkout <no-such-branch>» (per defecte)"
 
 #: builtin/checkout.c:1758
 #, fuzzy
@@ -12010,7 +12008,7 @@
 #: builtin/checkout.c:1807
 #, fuzzy
 msgid "second guess 'git switch <no-such-branch>'"
-msgstr "segon conjectura 'git switch <no-such-branch>'"
+msgstr "segon conjectura «git switch <no-such-branch>»"
 
 #: builtin/checkout.c:1809
 #, fuzzy
@@ -12149,9 +12147,9 @@
 "?                   - help for prompt selection"
 msgstr ""
 "clean               - comença a netejar\n"
-"filter by pattern   - exclou ítems de supressió\n"
+"filter by pattern   - exclou ítems de la supressió\n"
 "select by numbers   - selecciona ítems a suprimir per números\n"
-"ask each            - confirma cada supressió (com \"rm -i\")\n"
+"ask each            - confirma cada supressió (com «rm -i»)\n"
 "quit                - deixa de netejar\n"
 "help                - aquesta pantalla\n"
 "?                   - ajuda de selecció de l'avís"
@@ -12478,7 +12476,7 @@
 
 #: builtin/clone.c:971 builtin/receive-pack.c:1972
 msgid "Too many arguments."
-msgstr "Hi ha massa paràmetres."
+msgstr "Hi ha massa arguments."
 
 #: builtin/clone.c:975
 msgid "You must specify a repository to clone."
@@ -12607,7 +12605,7 @@
 
 #: builtin/column.c:51
 msgid "--command must be the first argument"
-msgstr "--command ha de ser el primer paràmetre"
+msgstr "--command ha de ser el primer argument"
 
 #: builtin/commit-graph.c:11 builtin/commit-graph.c:19
 #, fuzzy
@@ -12657,9 +12655,9 @@
 msgstr "No s'ha pogut obrir el graf de comissions «%s»"
 
 #: builtin/commit-graph.c:136
-#, fuzzy, c-format
+#, c-format
 msgid "unrecognized --split argument, %s"
-msgstr "paràmetre --type no reconegut, %s"
+msgstr "argument --split no reconegut, %s"
 
 #: builtin/commit-graph.c:155
 #, fuzzy
@@ -12807,7 +12805,7 @@
 msgstr ""
 "Heu demanat esmenar la comissió més recent, però fer això la\n"
 "deixaria buida. Podeu repetir la vostra ordre amb --allow-empty, o\n"
-"podeu eliminar la comissió per complet amb \"git reset HEAD^\".\n"
+"podeu eliminar la comissió per complet amb «git reset HEAD^».\n"
 
 #: builtin/commit.c:56
 msgid ""
@@ -12817,22 +12815,20 @@
 "    git commit --allow-empty\n"
 "\n"
 msgstr ""
-"El «cherry pick» previ ja està buit, possiblement a causa de resolució de "
-"conflicte.\n"
+"El «cherry pick» previ està ara buit, possiblement a causa de resolució de "
+"conflictes.\n"
 "Si el voleu cometre de totes maneres, useu:\n"
 "\n"
 "    git commit --allow-empty\n"
 "\n"
 
 #: builtin/commit.c:63
-#, fuzzy
 msgid "Otherwise, please use 'git rebase --skip'\n"
-msgstr "Altrament si us plau useu 'git cherry-pick --skip'"
+msgstr "Altrament si us plau useu «git rebase --skip»\n"
 
 #: builtin/commit.c:66
-#, fuzzy
 msgid "Otherwise, please use 'git cherry-pick --skip'\n"
-msgstr "Altrament si us plau useu 'git cherry-pick --skip'"
+msgstr "Altrament si us plau useu «git cherry-pick --skip»\n"
 
 #: builtin/commit.c:69
 #, fuzzy
@@ -12929,7 +12925,7 @@
 #: builtin/commit.c:717 builtin/commit.c:750 builtin/commit.c:1099
 #, c-format
 msgid "could not lookup commit %s"
-msgstr "no s'ha pogut trobar la comissió %s"
+msgstr "no s'ha pogut cercar la comissió %s"
 
 #: builtin/commit.c:729 builtin/shortlog.c:319
 #, c-format
@@ -13047,7 +13043,7 @@
 #: builtin/commit.c:1071
 #, c-format
 msgid "Invalid ignored mode '%s'"
-msgstr "mode ignorat no vàlid «%s»"
+msgstr "Mode ignorat no vàlid «%s»"
 
 #: builtin/commit.c:1089 builtin/commit.c:1333
 #, c-format
@@ -13354,7 +13350,7 @@
 #: builtin/config.c:104 builtin/env--helper.c:23
 #, c-format
 msgid "unrecognized --type argument, %s"
-msgstr "paràmetre --type no reconegut, %s"
+msgstr "argument --type no reconegut, %s"
 
 #: builtin/config.c:116
 msgid "only one type at a time"
@@ -13634,7 +13630,7 @@
 
 #: builtin/config.c:760
 msgid "error processing config file(s)"
-msgstr "s'ha produït un error processant els fitxers de configuració"
+msgstr "s'ha produït un error en processar els fitxers de configuració"
 
 #: builtin/config.c:770
 msgid "editing stdin is not supported"
@@ -13815,11 +13811,11 @@
 
 #: builtin/describe.c:572
 msgid "append <mark> on dirty working tree (default: \"-dirty\")"
-msgstr "annexa <marca> en l'arbre de treball brut (per defecte: \"-dirty\")"
+msgstr "annexa <marca> en l'arbre de treball brut (per defecte: «-dirty»)"
 
 #: builtin/describe.c:575
 msgid "append <mark> on broken working tree (default: \"-broken\")"
-msgstr "annexa <marca> en l'arbre de treball brut (per defecte: \"-broken\")"
+msgstr "annexa <marca> en l'arbre de treball brut (per defecte: «-broken»)"
 
 #: builtin/describe.c:593
 msgid "--long is incompatible with --abbrev=0"
@@ -13888,15 +13884,15 @@
 #: builtin/difftool.c:312
 #, c-format
 msgid "could not read object %s for symlink %s"
-msgstr "No es pot llegir l'objecte %s per l'enllaç simbòlic %s"
+msgstr "no es pot llegir l'objecte %s per l'enllaç simbòlic %s"
 
 #: builtin/difftool.c:413
 msgid ""
 "combined diff formats('-c' and '--cc') are not supported in\n"
 "directory diff mode('-d' and '--dir-diff')."
 msgstr ""
-"els formats de diff combinats ('-c' and '--cc') no són admesos \n"
-"en el mode diff per directoris ('-d' and '--dir-diff')."
+"els formats de diff combinats («-c» i «--cc») no s'admeten\n"
+"en el mode diff per directoris («-d» i «--dir-diff»)."
 
 #: builtin/difftool.c:634
 #, c-format
@@ -13918,7 +13914,7 @@
 
 #: builtin/difftool.c:697
 msgid "use `diff.guitool` instead of `diff.tool`"
-msgstr "utilitza `diff.guitool` en comptes de `diff.tool`"
+msgstr "usa «diff.guitool» en lloc de «diff.tool»"
 
 #: builtin/difftool.c:699
 msgid "perform a full-directory diff"
@@ -13943,14 +13939,14 @@
 #: builtin/difftool.c:710
 msgid "print a list of diff tools that may be used with `--tool`"
 msgstr ""
-"imprimeix una llista de totes les eines diff que podeu usar amb `--tool`"
+"imprimeix una llista de totes les eines diff que podeu usar amb «--tool»"
 
 #: builtin/difftool.c:713
 msgid ""
 "make 'git-difftool' exit when an invoked diff tool returns a non - zero exit "
 "code"
 msgstr ""
-"fes que 'git-difftool' surti quan l'eina de diff invocada torna un codi de "
+"fes que «git-difftool» surti quan l'eina de diff invocada torna un codi de "
 "sortida diferent de zero"
 
 #: builtin/difftool.c:716
@@ -13975,11 +13971,11 @@
 
 #: builtin/difftool.c:750
 msgid "no <tool> given for --tool=<tool>"
-msgstr "no s'ha proporcionat <tool> per --tool=<tool>"
+msgstr "no s'ha proporcionat l'<eina> per a --tool=<eina>"
 
 #: builtin/difftool.c:757
 msgid "no <cmd> given for --extcmd=<cmd>"
-msgstr "no s'ha proporcionat <cmd> per --extcmd=<cmd>"
+msgstr "no s'ha proporcionat l'<ordre> per a --extcmd=<ordre>"
 
 #: builtin/env--helper.c:6
 msgid "git env--helper --type=[bool|ulong] <options> <env-var>"
@@ -14352,7 +14348,7 @@
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
 "algunes referències locals no s'han pogut actualitzar;\n"
-" intenteu executar 'git remote prune %s' per a eliminar\n"
+" intenteu executar «git remote prune %s» per a eliminar\n"
 " qualsevol branca antiga o conflictiva"
 
 #: builtin/fetch.c:1128
@@ -14462,7 +14458,7 @@
 
 #: builtin/fetch.c:1798
 msgid "fetch --all does not take a repository argument"
-msgstr "fetch --all no accepta un paràmetre de dipòsit"
+msgstr "fetch --all no accepta un argument de dipòsit"
 
 #: builtin/fetch.c:1800
 msgid "fetch --all does not make sense with refspecs"
@@ -14667,7 +14663,7 @@
 #: builtin/fsck.c:501
 #, c-format
 msgid "%s: invalid reflog entry %s"
-msgstr " %s: entrada de referència no vàlida %s"
+msgstr "%s: entrada de referència no vàlida %s"
 
 #: builtin/fsck.c:515
 #, fuzzy, c-format
@@ -14915,7 +14911,7 @@
 msgid ""
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
-"Hi ha massa objectes solts inabastables; executeu 'git prune' per a eliminar-"
+"Hi ha massa objectes solts inabastables; executeu «git prune» per a eliminar-"
 "los."
 
 #: builtin/grep.c:30
@@ -14940,7 +14936,7 @@
 #: builtin/pack-objects.c:2855
 #, c-format
 msgid "no threads support, ignoring %s"
-msgstr "no hi ha suport de fils, s'està ignorant %s"
+msgstr "no s'admeten fils, s'ignorarà %s"
 
 #: builtin/grep.c:475 builtin/grep.c:600 builtin/grep.c:640
 #, c-format
@@ -14971,7 +14967,7 @@
 
 #: builtin/grep.c:829
 msgid "ignore files specified via '.gitignore'"
-msgstr "ignora els fitxers especificats mitjançant '.gitignore'"
+msgstr "ignora els fitxers especificats mitjançant «.gitignore»"
 
 #: builtin/grep.c:831
 msgid "recursively search in each submodule"
@@ -15003,7 +14999,7 @@
 
 #: builtin/grep.c:847
 msgid "search in subdirectories (default)"
-msgstr "cerca als subdirectories (per defecte)"
+msgstr "cerca als subdirectoris (per defecte)"
 
 #: builtin/grep.c:849
 msgid "descend at most <depth> levels"
@@ -15163,9 +15159,8 @@
 msgstr "no s'ha pogut resoldre la revisió: %s"
 
 #: builtin/grep.c:1077
-#, fuzzy
 msgid "--untracked not supported with --recurse-submodules"
-msgstr "--untracked no està suportat amb --recurse-submodules"
+msgstr "--untracked no s'admet amb --recurse-submodules"
 
 #: builtin/grep.c:1081
 msgid "invalid option combination, ignoring --threads"
@@ -15173,7 +15168,7 @@
 
 #: builtin/grep.c:1084 builtin/pack-objects.c:3548
 msgid "no threads support, ignoring --threads"
-msgstr "no hi ha suport de fils, s'està ignorant --threads"
+msgstr "no s'admeten fils, s'ignorarà --threads"
 
 #: builtin/grep.c:1087 builtin/index-pack.c:1534 builtin/pack-objects.c:2852
 #, c-format
@@ -15305,7 +15300,7 @@
 "Please consider using 'man.<tool>.cmd' instead."
 msgstr ""
 "«%s»: camí a un visualitzador de manuals no compatible.\n"
-"Considereu usar 'man.<eina>.cmd' en lloc d'això."
+"Considereu usar «man.<eina>.cmd» en lloc d'això."
 
 #: builtin/help.c:319
 #, c-format
@@ -15314,7 +15309,7 @@
 "Please consider using 'man.<tool>.path' instead."
 msgstr ""
 "«%s»: ordre per a un visualitzador de manuals compatible.\n"
-"Considereu usar 'man.<eina>.path' en lloc d'això."
+"Considereu usar «man.<eina>.path» en lloc d'això."
 
 #: builtin/help.c:436
 #, c-format
@@ -15560,7 +15555,7 @@
 #: builtin/index-pack.c:1405
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
-msgstr "el nom del fitxer de paquet «%s» no acaba amb '.pack'"
+msgstr "el nom del fitxer de paquet «%s» no acaba amb «.pack»"
 
 #: builtin/index-pack.c:1430
 #, c-format
@@ -16023,7 +16018,7 @@
 
 #: builtin/log.c:1663
 msgid "use <sfx> instead of '.patch'"
-msgstr "usa <sufix> en lloc de '.patch'"
+msgstr "usa <sufix> en lloc de «.patch»"
 
 #: builtin/log.c:1665
 msgid "start numbering patches at <n> instead of 1"
@@ -16281,11 +16276,11 @@
 
 #: builtin/ls-files.c:529
 msgid "use lowercase letters for 'assume unchanged' files"
-msgstr "usa lletres minúscules per als fitxers 'assume unchanged'"
+msgstr "usa lletres minúscules per als fitxers «assume unchanged»"
 
 #: builtin/ls-files.c:531
 msgid "use lowercase letters for 'fsmonitor clean' files"
-msgstr "usa lletres minúscules per als fitxers 'fsmonitor clean'"
+msgstr "usa lletres minúscules per als fitxers «fsmonitor clean»"
 
 #: builtin/ls-files.c:533
 msgid "show cached files in the output (default)"
@@ -16422,7 +16417,7 @@
 
 #: builtin/ls-remote.c:75
 msgid "show underlying ref in addition to the object pointed by it"
-msgstr "mostra la referència subjacent a més de l'objecte que senyali"
+msgstr "mostra la referència subjacent a més de l'objecte que assenyali"
 
 #: builtin/ls-tree.c:30
 msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
@@ -16763,7 +16758,7 @@
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
-"No s'està cometent la fusió; useu 'git commit' per a completar la fusió.\n"
+"No s'està cometent la fusió; useu «git commit» per a completar la fusió.\n"
 
 #: builtin/merge.c:812
 #, fuzzy
@@ -16839,20 +16834,19 @@
 
 #: builtin/merge.c:1295
 msgid "--abort expects no arguments"
-msgstr "--abort no accepta paràmetres"
+msgstr "--abort no espera cap argument"
 
 #: builtin/merge.c:1299
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "No hi ha fusió a avortar (manca MERGE_HEAD)."
 
 #: builtin/merge.c:1317
-#, fuzzy
 msgid "--quit expects no arguments"
 msgstr "--quit no espera cap argument"
 
 #: builtin/merge.c:1330
 msgid "--continue expects no arguments"
-msgstr "--continue no accepta paràmetres"
+msgstr "--continue no espera cap argument"
 
 #: builtin/merge.c:1334
 msgid "There is no merge in progress (MERGE_HEAD missing)."
@@ -17015,12 +17009,11 @@
 
 #: builtin/multi-pack-index.c:50 builtin/prune-packed.c:25
 msgid "too many arguments"
-msgstr "hi ha massa paràmetres"
+msgstr "hi ha massa arguments"
 
 #: builtin/multi-pack-index.c:60
-#, fuzzy
 msgid "--batch-size option is only for 'repack' subcommand"
-msgstr "--batch-size l'opció només és per la subordre 'repack'"
+msgstr "--batch-size l'opció només és per a la subordre «repack»"
 
 #: builtin/multi-pack-index.c:69
 #, fuzzy, c-format
@@ -17294,7 +17287,7 @@
 #: builtin/notes.c:162
 #, c-format
 msgid "failed to finish 'show' for object '%s'"
-msgstr "S'ha produït un error en finalitzar 'show' per a l'objecte «%s»"
+msgstr "S'ha produït un error en finalitzar «show» per a l'objecte «%s»"
 
 #: builtin/notes.c:197
 msgid "please supply the note contents using either -m or -F option"
@@ -17437,7 +17430,7 @@
 "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
-"Es desaconsellen les opcions -m/-F/-c/-C en favor de la subordre 'edit'.\n"
+"Es desaconsellen les opcions -m/-F/-c/-C en favor de la subordre «edit».\n"
 "Useu «git notes add -f -m/-F/-c/-C» en lloc d'això.\n"
 
 #: builtin/notes.c:698
@@ -17451,7 +17444,7 @@
 #: builtin/notes.c:702
 msgid "failed to remove 'git notes merge' worktree"
 msgstr ""
-"s'ha produït un error en eliminar l'arbre de treball de 'git notes merge'"
+"s'ha produït un error en eliminar l'arbre de treball de «git notes merge»"
 
 #: builtin/notes.c:722
 msgid "failed to read ref NOTES_MERGE_PARTIAL"
@@ -17543,8 +17536,8 @@
 "abort'.\n"
 msgstr ""
 "La fusió de notes automàtica ha fallat. Arregleu els conflictes en %s i "
-"cometeu el resultat amb 'git notes merge --commit', o avorteu la fusió amb "
-"'git notes merge --abort'.\n"
+"cometeu el resultat amb «git notes merge --commit», o avorteu la fusió amb "
+"«git notes merge --abort».\n"
 
 #: builtin/notes.c:897 builtin/tag.c:546
 #, c-format
@@ -17818,7 +17811,7 @@
 
 #: builtin/pack-objects.c:3410
 msgid "read revision arguments from standard input"
-msgstr "llegeix els paràmetres de revisió des de l'entrada estàndard"
+msgstr "llegeix els arguments de revisió des de l'entrada estàndard"
 
 #: builtin/pack-objects.c:3412
 msgid "limit the objects to those that are not yet packed"
@@ -18117,7 +18110,7 @@
 
 #: builtin/pull.c:475 builtin/pull.c:490
 msgid "See git-pull(1) for details."
-msgstr "Vegeu git-pull(1) per detalls."
+msgstr "Vegeu git-pull(1) per a més informació."
 
 #: builtin/pull.c:477 builtin/pull.c:483 builtin/pull.c:492
 #: builtin/rebase.c:1240 git-parse-remote.sh:64
@@ -18232,8 +18225,8 @@
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 "\n"
-"Per a triar qualsevol opció permanentment, vegeu push.default a 'git help "
-"config'."
+"Per a triar qualsevol opció permanentment, vegeu push.default a «git help "
+"config»."
 
 #: builtin/push.c:171
 #, c-format
@@ -18321,8 +18314,9 @@
 msgstr ""
 "S'han rebutjat les actualitzacions perquè el punt de la vostra branca\n"
 "actual està darrere de la seva branca remota corresponent. Integreu\n"
-"els canvis remots (per exemple, 'git pull ...') abans de pujar de nou.\n"
-"Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
+"els canvis remots (per exemple, «git pull ...») abans de pujar de nou.\n"
+"Vegeu la «Nota sobre avanços ràpids» a «git push --help» per a més "
+"informació."
 
 #: builtin/push.c:283
 msgid ""
@@ -18333,9 +18327,10 @@
 msgstr ""
 "S'han rebutjat les actualitzacions perquè un punt de branca pujada\n"
 "està darrere de la seva branca remota corresponent. Agafeu aquesta\n"
-"branca i integreu els canvis remots (per exemple, 'git pull ...')\n"
+"branca i integreu els canvis remots (per exemple, «git pull ...»)\n"
 "abans de pujar de nou.\n"
-"Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
+"Vegeu la «Nota sobre avanços ràpids» a «git push --help» per a més "
+"informació."
 
 #: builtin/push.c:289
 msgid ""
@@ -18348,9 +18343,10 @@
 "S'han rebutjat les actualitzacions perquè el remot conté canvis\n"
 "que no teniu localment. Això acostuma a ser causat per un altre dipòsit\n"
 "que ha pujat a la mateixa referència. Pot ser que primer vulgueu\n"
-"integrar els canvis remots (per exemple, 'git pull ...') abans de\n"
+"integrar els canvis remots (per exemple, «git pull ...») abans de\n"
 "pujar de nou.\n"
-"Vegeu la 'Nota sobre avanços ràpids' a 'git push --help' per detalls."
+"Vegeu la «Nota sobre avanços ràpids» a «git push --help» per a més "
+"informació."
 
 #: builtin/push.c:296
 msgid "Updates were rejected because the tag already exists in the remote."
@@ -18366,7 +18362,7 @@
 "No podeu actualitzar una referència remota que assenyala un\n"
 "objecte no de comissió, ni actualitzar una referència remota per\n"
 "fer que assenyali un objecte no de comissió, sense usar l'opció\n"
-"'--force'.\n"
+"«--force».\n"
 
 #: builtin/push.c:361
 #, c-format
@@ -18916,8 +18912,8 @@
 "\n"
 msgstr ""
 "%s\n"
-"Especifiqueu sobre què branca voleu fer «rebase».\n"
-"Vegeu git-rebase(1) per detalls.\n"
+"Especifiqueu sobre quina branca voleu fer «rebase».\n"
+"Vegeu git-rebase(1) per a més informació.\n"
 "\n"
 "    git rebase '<branca>'\n"
 "\n"
@@ -18933,7 +18929,7 @@
 "Si voleu establir informació de seguiment per a aquesta branca, podeu fer-ho "
 "amb:\n"
 "\n"
-"    git branch --set-upstream-to=%s/<branch> %s\n"
+"    git branch --set-upstream-to=%s/<branca> %s\n"
 "\n"
 
 #: builtin/rebase.c:1272
@@ -19208,7 +19204,7 @@
 
 #: builtin/rebase.c:1824
 msgid "Could not create new root commit"
-msgstr "no s'ha pogut crear una comissió arrel nova"
+msgstr "No s'ha pogut crear una comissió arrel nova"
 
 #: builtin/rebase.c:1850
 #, fuzzy, c-format
@@ -19275,7 +19271,7 @@
 #: builtin/rebase.c:2001
 #, c-format
 msgid "Changes to %s:\n"
-msgstr "Canvis a  %s:\n"
+msgstr "Canvis a %s:\n"
 
 #: builtin/rebase.c:2004
 #, c-format
@@ -19319,18 +19315,18 @@
 "'receive.denyCurrentBranch' configuration variable to 'refuse'."
 msgstr ""
 "Per defecte, es denega actualitzar la branca actual en un dipòsit no\n"
-"nu, perquè faria l'índex i l'arbre de treball inconsistents amb el\n"
-"que hàgiu pujat, i requeriria 'git reset --hard' per a fer que\n"
-"l'arbre de treball coincideixi amb HEAD.\n"
+"nu, perquè faria l'índex i l'arbre de treball inconsistents amb allò\n"
+"que hàgiu pujat, i requeriria «git reset --hard» per a fer que\n"
+"l'arbre de treball coincidís amb HEAD.\n"
 "\n"
 "Podeu establir la variable de configuració\n"
 "«receive.denyCurrentBranch» a «ignore» o «warn» en el dipòsit remot\n"
-"per a permetre pujar a la seva branca actual; no obstant, no es\n"
-"recomana això a menys que hàgiu decidit actualitzar el seu arbre en\n"
-"alguna altra manera per a coincidir amb el que hàgiu pujat.\n"
+"per a permetre pujar a la seva branca actual; això no obstant, no es\n"
+"recomana a menys que hàgiu decidit actualitzar el seu arbre de treball\n"
+"per a coincidir amb allò que hàgiu pujat d'alguna altra manera.\n"
 "\n"
 "Per a silenciar aquest missatge i mantenir el comportament\n"
-"predeterminat, establiu la variable de configuració\n"
+"per defecte, establiu la variable de configuració\n"
 "«receive.denyCurrentBranch» a «refuse»."
 
 #: builtin/receive-pack.c:863
@@ -19345,7 +19341,7 @@
 "To squelch this message, you can set it to 'refuse'."
 msgstr ""
 "Per defecte, es denega suprimir la branca actual, perquè el\n"
-"'git clone' següent no resultarà en cap fitxer agafat, causant\n"
+"«git clone» següent no resultarà en cap fitxer agafat, causant\n"
 "confusió.\n"
 "\n"
 "Podeu establir la variable de configuració\n"
@@ -19369,20 +19365,21 @@
 "rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] "
 "<refs>..."
 msgstr ""
-"git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--"
+"git reflog expire [--expire=<hora>] [--expire-unreachable=<hora>] [--"
 "rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] "
+"<referències>..."
 
 #: builtin/reflog.c:22
 msgid ""
 "git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] "
 "<refs>..."
 msgstr ""
-"git reflog remove [--rewrite] [--updateref] [---dry-run | -n] [--verbose] "
-"<refs>"
+"git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] "
+"<referències>..."
 
 #: builtin/reflog.c:25
 msgid "git reflog exists <ref>"
-msgstr "git reflog exists <ref>"
+msgstr "git reflog exists <referència>"
 
 #: builtin/reflog.c:568 builtin/reflog.c:573
 #, c-format
@@ -19420,9 +19417,8 @@
 msgstr "format de referència no vàlid: %s"
 
 #: builtin/reflog.c:765
-#, fuzzy
 msgid "git reflog [ show | expire | delete | exists ]"
-msgstr "git reflog [ mostra | expira | suprimeix | existeix ]"
+msgstr "git reflog [ show | expire | delete | exists ]"
 
 #: builtin/remote.c:17
 msgid "git remote [-v | --verbose]"
@@ -19523,7 +19519,7 @@
 #: builtin/remote.c:148
 #, c-format
 msgid "unknown mirror argument: %s"
-msgstr "paràmetre de reflexió desconegut: %s"
+msgstr "argument de «mirror» desconegut: %s"
 
 #: builtin/remote.c:164
 msgid "fetch the remote branches"
@@ -19665,7 +19661,7 @@
 
 #: builtin/remote.c:998
 msgid " stale (use 'git remote prune' to remove)"
-msgstr " estancat (useu 'git remote prune' per a eliminar)"
+msgstr " estancat (useu «git remote prune» per a eliminar)"
 
 #: builtin/remote.c:1000
 msgid " ???"
@@ -19823,11 +19819,11 @@
 
 #: builtin/remote.c:1318
 msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "estableix refs/remotes/<name>/HEAD segons el remot"
+msgstr "estableix refs/remotes/<nom>/HEAD segons el remot"
 
 #: builtin/remote.c:1320
 msgid "delete refs/remotes/<name>/HEAD"
-msgstr "suprimeix refs/remotes/<name>/HEAD"
+msgstr "suprimeix refs/remotes/<nom>/HEAD"
 
 #: builtin/remote.c:1335
 msgid "Cannot determine remote HEAD"
@@ -19951,8 +19947,8 @@
 "Incremental repacks are incompatible with bitmap indexes.  Use\n"
 "--no-write-bitmap-index or disable the pack.writebitmaps configuration."
 msgstr ""
-"Els reempaquetaments incrementals són incompatibles amb els índexs de "
-"bitmaps.  Useu\n"
+"Els reempaquetaments incrementals són incompatibles amb els índexs de mapes "
+"de bits.  Useu\n"
 "--no-write-bitmap-index o inhabiliteu el paràmetre de configuració pack."
 "writebitmaps."
 
@@ -20075,7 +20071,7 @@
 msgstr "Res nou per empaquetar."
 
 #: builtin/repack.c:488
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "WARNING: Some packs in use have been renamed by\n"
 "WARNING: prefixing old- to their name, in order to\n"
@@ -20085,11 +20081,13 @@
 "WARNING: original names also failed.\n"
 "WARNING: Please rename them in %s manually:\n"
 msgstr ""
-"AVÍS Alguns paquets en ús s'han reanomenat ALERTA prefixant «old-» al seu "
-"nom per tal d' AVÍS reemplaçar-los per la nova versió del fitxer ALERTA. "
-"Però l'operació ha fallat i l'intent ALERTA de tornar-los a canviar el nom "
-"també ha fallat en el seu ALERTA els noms originals. AVÍS Els reanomeneu "
-"manualment en percentatges"
+"AVÍS: Alguns paquets en ús han canviat de nom\n"
+"AVÍS: prefixant «old-» al seu nom per tal de\n"
+"AVÍS: reemplaçar-los per la nova versió del fitxer.\n"
+"AVÍS: Però l'operació ha fallat i l'intent de\n"
+"AVÍS: tornar-los a canviar als seus noms originals\n"
+"AVÍS: també ha fallat. Canvieu-los de nom en %s\n"
+"AVÍS: manualment:\n"
 
 #: builtin/repack.c:536
 #, c-format
@@ -20479,7 +20477,7 @@
 #: builtin/reset.c:371
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
 msgstr ""
-"--mixed amb camins està en desús; useu 'git reset -- <camins>' en lloc "
+"--mixed amb camins està en desús; useu «git reset -- <camins>» en lloc "
 "d'això."
 
 #: builtin/reset.c:373
@@ -20540,15 +20538,15 @@
 
 #: builtin/rev-parse.c:409
 msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
-msgstr "git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]"
+msgstr "git rev-parse --parseopt [<opcions>] -- [<arguments>...]"
 
 #: builtin/rev-parse.c:414
 msgid "keep the `--` passed as an arg"
-msgstr "retén el «--» passat com a paràmetre"
+msgstr "retén el «--» passat com a argument"
 
 #: builtin/rev-parse.c:416
 msgid "stop parsing after the first non-option argument"
-msgstr "deixa d'analitzar després del primer paràmetre no d'opció"
+msgstr "deixa d'analitzar després del primer argument que no sigui d'opció"
 
 #: builtin/rev-parse.c:419
 msgid "output in stuck long form"
@@ -20562,12 +20560,12 @@
 "\n"
 "Run \"git rev-parse --parseopt -h\" for more information on the first usage."
 msgstr ""
-"git rev-parse --parseopt [<opcions>] -- [<paràmetres>...]\n"
-"   or: git rev-parse --sq-quote [<paràmetre>...]\n"
-"   or: git rev-parse [<opcions>] [<paràmetre>...]\n"
+"git rev-parse --parseopt [<opcions>] -- [<arguments>...]\n"
+"   o bé: git rev-parse --sq-quote [<argument>...]\n"
+"   o bé: git rev-parse [<opcions>] [<argument>...]\n"
 "\n"
-"Executeu \"git rev-parse --parseopt -h\" per més informació sobre l'ús "
-"inicial."
+"Executeu «git rev-parse --parseopt -h» per a més informació sobre el primer "
+"ús."
 
 #: builtin/revert.c:24
 msgid "git revert [<options>] <commit-ish>..."
@@ -20736,7 +20734,7 @@
 #: builtin/rm.c:323
 #, c-format
 msgid "not removing '%s' recursively without -r"
-msgstr "no s'ha suprimit «%s» recursivament sense -r"
+msgstr "no s'eliminarà «%s» recursivament sense -r"
 
 #: builtin/rm.c:362
 #, c-format
@@ -20846,7 +20844,7 @@
 
 #: builtin/show-branch.c:649
 msgid "color '*!+-' corresponding to the branch"
-msgstr "colora '*!+-' corresponent a la branca"
+msgstr "colora «*!+-» corresponent a la branca"
 
 #: builtin/show-branch.c:651
 msgid "show <n> more commits after the common ancestor"
@@ -21212,7 +21210,7 @@
 
 #: builtin/stash.c:828
 msgid "\"git stash store\" requires one <commit> argument"
-msgstr "«git stash store» requereix un paràmetre <comissió>"
+msgstr "«git stash store» requereix un argument <comissió>"
 
 #: builtin/stash.c:1046
 msgid "No changes selected"
@@ -21495,7 +21493,7 @@
 "really want to remove it including all of its history)"
 msgstr ""
 "L'arbre de treball de submòdul «%s» conté un directori .git\n"
-"(useu 'rm -rf' si realment voleu eliminar-lo, incloent tota la seva història)"
+"(useu «rm -rf» si realment voleu eliminar-lo, incloent tota la seva història)"
 
 #: builtin/submodule--helper.c:1134
 #, c-format
@@ -21509,7 +21507,7 @@
 #: builtin/submodule--helper.c:1142
 #, c-format
 msgid "Cleared directory '%s'\n"
-msgstr "S'ha netejat el directori «%s»\n"
+msgstr "S'ha esborrat el directori «%s»\n"
 
 #: builtin/submodule--helper.c:1144
 #, c-format
@@ -21529,7 +21527,7 @@
 #: builtin/submodule--helper.c:1200
 msgid "Remove submodule working trees even if they contain local changes"
 msgstr ""
-"Suprimeix els arbres de treball dels submòduls fins i tot si contenen canvis "
+"Elimina els arbres de treball dels submòduls fins i tot si contenen canvis "
 "locals"
 
 #: builtin/submodule--helper.c:1201
@@ -21544,7 +21542,7 @@
 
 #: builtin/submodule--helper.c:1220
 msgid "Use '--all' if you really want to deinitialize all submodules"
-msgstr "Useu '--all' si realment voleu desinicialitzar tots els submòduls"
+msgstr "Useu «--all» si realment voleu desinicialitzar tots els submòduls"
 
 #: builtin/submodule--helper.c:1289
 #, fuzzy
@@ -21647,7 +21645,7 @@
 
 #: builtin/submodule--helper.c:1621
 msgid "Maybe you want to use 'update --init'?"
-msgstr "Potser voleu usar 'update --init'?"
+msgstr "Potser voleu usar «update --init»?"
 
 #: builtin/submodule--helper.c:1651
 #, c-format
@@ -22056,33 +22054,34 @@
 #: builtin/update-index.c:154
 msgid "directory stat info does not change after adding a new file"
 msgstr ""
-"la informació d'stat de directori no canvia després d'afegir un fitxer nou"
+"la informació de stat de directori no canvia després d'afegir un fitxer nou"
 
 #: builtin/update-index.c:167
 msgid "directory stat info does not change after adding a new directory"
 msgstr ""
-"la informació d'stat de directori no canvia després d'afegir un directori nou"
+"la informació de stat de directori no canvia després d'afegir un directori "
+"nou"
 
 #: builtin/update-index.c:180
 msgid "directory stat info changes after updating a file"
 msgstr ""
-"la informació d'stat de directori canvia després d'actualitzar un fitxer"
+"la informació de stat de directori canvia després d'actualitzar un fitxer"
 
 #: builtin/update-index.c:191
 msgid "directory stat info changes after adding a file inside subdirectory"
 msgstr ""
-"la informació d'stat de directori canvia després d'afegir un fitxer dins "
+"la informació de stat de directori canvia després d'afegir un fitxer dins "
 "d'un subdirectori"
 
 #: builtin/update-index.c:202
 msgid "directory stat info does not change after deleting a file"
 msgstr ""
-"la informació d'stat de directori no canvia després de suprimir un fitxer"
+"la informació de stat de directori no canvia després de suprimir un fitxer"
 
 #: builtin/update-index.c:215
 msgid "directory stat info does not change after deleting a directory"
 msgstr ""
-"la informació d'stat de directori no canvia després de suprimir un directori"
+"la informació de stat de directori no canvia després de suprimir un directori"
 
 #: builtin/update-index.c:222
 msgid " OK"
@@ -22135,19 +22134,19 @@
 
 #: builtin/update-index.c:1008
 msgid "mark files as \"not changing\""
-msgstr "marca els fitxers com a \"no canviant\""
+msgstr "marca els fitxers com a «no canviant»"
 
 #: builtin/update-index.c:1011
 msgid "clear assumed-unchanged bit"
-msgstr "neteja el bit assumed-unchanged"
+msgstr "esborra el bit assumed-unchanged"
 
 #: builtin/update-index.c:1014
 msgid "mark files as \"index-only\""
-msgstr "marca els fitxers com a \"només índex\""
+msgstr "marca els fitxers com a «només índex»"
 
 #: builtin/update-index.c:1017
 msgid "clear skip-worktree bit"
-msgstr "neteja el bit skip-worktree"
+msgstr "esborra el bit skip-worktree"
 
 #: builtin/update-index.c:1020
 #, fuzzy
@@ -22233,7 +22232,7 @@
 
 #: builtin/update-index.c:1070
 msgid "clear fsmonitor valid bit"
-msgstr "neteja el bit de validesa del fsmonitor"
+msgstr "esborra el bit de validesa del fsmonitor"
 
 #: builtin/update-index.c:1173
 msgid ""
@@ -22320,7 +22319,7 @@
 
 #: builtin/update-ref.c:490
 msgid "stdin has NUL-terminated arguments"
-msgstr "stdin té paràmetres acabats amb NUL"
+msgstr "stdin té arguments acabats amb NUL"
 
 #: builtin/update-ref.c:491
 msgid "read updates from stdin"
@@ -22389,7 +22388,7 @@
 
 #: builtin/worktree.c:17
 msgid "git worktree add [<options>] <path> [<commit-ish>]"
-msgstr "git worktree add [<opcions>] <camí> [<commit-ish>"
+msgstr "git worktree add [<opcions>] <camí> [<commit-ish>]"
 
 #: builtin/worktree.c:18
 msgid "git worktree list [<options>]"
@@ -22409,7 +22408,7 @@
 
 #: builtin/worktree.c:22
 msgid "git worktree remove [<options>] <worktree>"
-msgstr "git worktree lock [<opcions>] <arbre de treball>"
+msgstr "git worktree remove [<opcions>] <arbre de treball>"
 
 #: builtin/worktree.c:23
 msgid "git worktree unlock <path>"
@@ -22441,8 +22440,8 @@
 "Removing worktrees/%s: short read (expected %<PRIuMAX> bytes, read "
 "%<PRIuMAX>)"
 msgstr ""
-"S'estan suprimint els arbres de treball/%s: lectura curta (s'esperaven "
-"%<PRIuMAX> bytes, llegits %<PRIuMAX>)"
+"S'estan eliminant els arbres de treball/%s: lectura curta (s'esperaven "
+"%<PRIuMAX> bytes, se n'han llegit %<PRIuMAX>)"
 
 #: builtin/worktree.c:117
 #, c-format
@@ -22589,7 +22588,7 @@
 #: builtin/worktree.c:766
 msgid "working trees containing submodules cannot be moved or removed"
 msgstr ""
-"els arbres de treball que contenen submòduls no es poden moure o suprimir"
+"els arbres de treball que contenen submòduls no es poden moure ni eliminar"
 
 #: builtin/worktree.c:774
 msgid "force move even if worktree is dirty or locked"
@@ -22658,7 +22657,7 @@
 #: builtin/worktree.c:906
 msgid "force removal even if worktree is dirty or locked"
 msgstr ""
-"força la supressió encara que l'arbre de treball estigui brut o bloquejat"
+"força l'eliminació encara que l'arbre de treball estigui brut o bloquejat"
 
 #: builtin/worktree.c:929
 #, fuzzy, c-format
@@ -22834,7 +22833,7 @@
 
 #: t/helper/test-reach.c:162
 msgid "too many commits marked reachable"
-msgstr "masses comission marcades com abastable"
+msgstr "hi ha massa comissions marcades com abastables"
 
 #: t/helper/test-serve-v2.c:7
 msgid "test-tool serve-v2 [<options>]"
@@ -22911,12 +22910,12 @@
 msgstr "en expandir l'àlies '%s' '%s'"
 
 #: git.c:371
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "alias '%s' changes environment variables.\n"
 "You can use '!git' in the alias to do this"
 msgstr ""
-"àlies '%s' canvia variables d'entorn. Podeu utilitzar '!git' a l'àlies per "
+"àlies «%s» canvia variables d'entorn. Podeu utilitzar «!git» a l'àlies per a "
 "fer-ho"
 
 #: git.c:378
@@ -22981,7 +22980,7 @@
 
 #: http.c:429
 msgid "Public key pinning not supported with cURL < 7.44.0"
-msgstr "No s'admet l'enganx de clau pública amb cURL < 7.44.0"
+msgstr "No s'admet la fixació de clau pública amb cURL < 7.44.0"
 
 #: http.c:914
 #, fuzzy
@@ -23156,7 +23155,7 @@
 
 #: list-objects-filter-options.h:85
 msgid "args"
-msgstr "args"
+msgstr "arguments"
 
 #: list-objects-filter-options.h:86
 msgid "object filtering"
@@ -23210,7 +23209,7 @@
 #: rerere.h:44
 msgid "update the index with reused conflict resolution if possible"
 msgstr ""
-"actualitza l'índex amb la resolució de conflicte reusada si és possible"
+"actualitza l'índex amb la resolució de conflictes reusada si és possible"
 
 #: wt-status.h:80
 msgid "HEAD detached at "
@@ -23311,7 +23310,7 @@
 
 #: command-list.h:71
 msgid "Remove untracked files from the working tree"
-msgstr "Suprimeix els fitxers no seguits de l'arbre de treball"
+msgstr "Elimina els fitxers no seguits de l'arbre de treball"
 
 #: command-list.h:72
 msgid "Clone a repository into a new directory"
@@ -23561,7 +23560,7 @@
 #: command-list.h:127
 msgid "Run merge conflict resolution tools to resolve merge conflicts"
 msgstr ""
-"Executa eines de resolució de conflictes per a resoldre conflictes de fussió"
+"Executa eines de resolució de conflictes per a resoldre conflictes de fusió"
 
 #: command-list.h:128
 #, fuzzy
@@ -23620,16 +23619,15 @@
 
 #: command-list.h:140
 msgid "Compute unique ID for a patch"
-msgstr "Calcula un identificador única per a cada pedaç"
+msgstr "Calcula un identificador únic per a cada pedaç"
 
 #: command-list.h:141
 msgid "Prune all unreachable objects from the object database"
 msgstr "Poda tots els objectes no accessibles de la base de dades d'objectes"
 
 #: command-list.h:142
-#, fuzzy
 msgid "Remove extra objects that are already in pack files"
-msgstr "Elimina els objectes extres que ja estan en fitxers de paquet"
+msgstr "Elimina els objectes extres que ja estan en fitxers empaquetats"
 
 #: command-list.h:143
 msgid "Fetch from and integrate with another repository or a local branch"
@@ -23652,7 +23650,6 @@
 "Compara dos intervals de comissions (p. ex. dues versions d'una branca)"
 
 #: command-list.h:147
-#, fuzzy
 msgid "Reads tree information into the index"
 msgstr "Llegeix la informació de l'arbre a l'índex"
 
@@ -23666,19 +23663,16 @@
 msgstr "Rep el que s'envia al repositori"
 
 #: command-list.h:150
-#, fuzzy
 msgid "Manage reflog information"
 msgstr "Gestiona la informació del registre de referències"
 
 #: command-list.h:151
-#, fuzzy
 msgid "Manage set of tracked repositories"
-msgstr "Gestiona el conjunt de repositoris seguits"
+msgstr "Gestiona el conjunt de dipòsits seguits"
 
 #: command-list.h:152
-#, fuzzy
 msgid "Pack unpacked objects in a repository"
-msgstr "Empaqueta els objectes desempaquetats en un repositori"
+msgstr "Empaqueta els objectes desempaquetats en un dipòsit"
 
 #: command-list.h:153
 #, fuzzy
@@ -23686,14 +23680,12 @@
 msgstr "Crea una llista suprimeix les referències per substituir els objectes"
 
 #: command-list.h:154
-#, fuzzy
 msgid "Generates a summary of pending changes"
 msgstr "Genera un resum dels canvis pendents"
 
 #: command-list.h:155
-#, fuzzy
 msgid "Reuse recorded resolution of conflicted merges"
-msgstr "Reutilitza la resolució registrada dels fusionats en conflicte"
+msgstr "Reutilitza la resolució registrada dels conflictes de fusió"
 
 #: command-list.h:156
 msgid "Reset current HEAD to the specified state"
@@ -23713,7 +23705,7 @@
 
 #: command-list.h:160
 msgid "Pick out and massage parameters"
-msgstr "Escolliu i personalitzeu els paràmetres"
+msgstr "Trieu i personalitzeu els paràmetres"
 
 #: command-list.h:161
 msgid "Remove files from the working tree and from the index"
@@ -23728,9 +23720,8 @@
 msgstr "Puja objectes sobre el protocol Git a un altre dipòsit"
 
 #: command-list.h:164
-#, fuzzy
 msgid "Restricted login shell for Git-only SSH access"
-msgstr "Intèrpret d'ordres d'entrada restringit per a accés SSH només al Git"
+msgstr "Intèrpret d'ordres d'entrada restringit només per a accés SSH al Git"
 
 #: command-list.h:165
 msgid "Summarize 'git log' output"
@@ -23753,7 +23744,6 @@
 msgstr "Llista les referències en un dipòsit local"
 
 #: command-list.h:170
-#, fuzzy
 msgid "Git's i18n setup code for shell scripts"
 msgstr ""
 "Codi de configuració i18n del Git per als scripts de l'intèrpret d'ordres"
@@ -23773,9 +23763,8 @@
 msgstr "Desa els canvis en un directori de treball brut"
 
 #: command-list.h:174
-#, fuzzy
 msgid "Add file contents to the staging area"
-msgstr "Afegeix el contingut del fitxer a l'àrea de proves"
+msgstr "Afegeix el contingut del fitxer a l'àrea de «staging»"
 
 #: command-list.h:175
 msgid "Show the working tree status"
@@ -23783,7 +23772,7 @@
 
 #: command-list.h:176
 msgid "Remove unnecessary whitespace"
-msgstr "Suprimeix l'espai en blanc innecessari"
+msgstr "Elimina l'espai en blanc innecessari"
 
 #: command-list.h:177
 msgid "Initialize, update or inspect submodules"
@@ -23824,10 +23813,8 @@
 "Actualitza el nom de l'objecte emmagatzema en una referència de forma segura"
 
 #: command-list.h:186
-#, fuzzy
 msgid "Update auxiliary info file to help dumb servers"
-msgstr ""
-"Actualitza el fitxer d'informació auxiliar per ajudar als servidors ximples"
+msgstr "Actualitza el fitxer d'informació auxiliar per a ajudar als servidors ximples"
 
 #: command-list.h:187
 msgid "Send archive back to git-archive"
@@ -23886,7 +23873,6 @@
 msgstr "Git per a usuaris del CVS"
 
 #: command-list.h:201
-#, fuzzy
 msgid "Tweaking diff output"
 msgstr "Ajustament de la sortida de diferències"
 
@@ -23944,7 +23930,7 @@
 
 #: git-bisect.sh:54
 msgid "You need to start by \"git bisect start\""
-msgstr "Cal començar per \"git bisect start\""
+msgstr "Cal començar per «git bisect start»"
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
@@ -23971,7 +23957,7 @@
 #: git-bisect.sh:139
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
-msgstr "'git bisect $TERM_BAD' pot acceptar només un paràmetre."
+msgstr "«git bisect $TERM_BAD» pot acceptar només un argument."
 
 #: git-bisect.sh:209
 msgid "No logfile given"
@@ -24002,7 +23988,7 @@
 "exit code $res from '$command' is < 0 or >= 128"
 msgstr ""
 "el pas de bisecció ha fallat:\n"
-"el codi de sortida $res de '$command' és < 0 o >= 128"
+"el codi de sortida $res de «$command» és < 0 o bé >= 128"
 
 #: git-bisect.sh:281
 msgid "bisect run cannot continue any more"
@@ -24015,7 +24001,7 @@
 "'bisect_state $state' exited with error code $res"
 msgstr ""
 "el pas de bisecció ha fallat:\n"
-"'bisect_state $state' ha sortit amb el codi d'error $res"
+"«bisect_state $state» ha sortit amb el codi d'error $res"
 
 #: git-bisect.sh:294
 msgid "bisect run success"
@@ -24088,25 +24074,25 @@
 msgstr "«$sm_path» ja existeix en l'índex i no és submòdul"
 
 #: git-submodule.sh:244
-#, fuzzy, sh-format
+#, sh-format
 msgid "'$sm_path' does not have a commit checked out"
-msgstr "«sm_path» no té una comissió marcada"
+msgstr "«$sm_path» no té una comissió agafada"
 
 #: git-submodule.sh:275
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
-msgstr "S'està afegint el dipòsit existent a '$sm_path' a l'índex"
+msgstr "S'està afegint el dipòsit existent a «$sm_path» a l'índex"
 
 #: git-submodule.sh:277
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
-msgstr "'$sm_path' ja existeix i no és un dipòsit de git vàlid"
+msgstr "«$sm_path» ja existeix i no és un dipòsit de git vàlid"
 
 #: git-submodule.sh:285
 #, sh-format
 msgid "A git directory for '$sm_name' is found locally with remote(s):"
 msgstr ""
-"Es troba un directori de git per a '$sm_name' localment amb els remots:"
+"S'ha trobat un directori de git per a «$sm_name» localment amb els remots:"
 
 #: git-submodule.sh:287
 #, sh-format
@@ -24122,8 +24108,8 @@
 "  $realrepo\n"
 "useu l'opció «--force». Si el directori de git local no és el dipòsit "
 "correcte\n"
-"o no esteu segur de què vol dir això, trieu un altre nom amb l'opció '--"
-"name'."
+"o no esteu segur de què vol dir això, trieu un altre nom amb l'opció «--"
+"name»."
 
 #: git-submodule.sh:293
 #, sh-format
@@ -24164,7 +24150,7 @@
 "'$sm_path'"
 msgstr ""
 "No s'ha pogut trobar la revisió actual de ${remote_name}/${branch} en el "
-"camí de submòdul '$sm_path'"
+"camí de submòdul «$sm_path»"
 
 #: git-submodule.sh:625
 #, sh-format
@@ -24198,7 +24184,7 @@
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
 msgstr ""
-"No s'ha pogut fer «rebase» «$sha1»' en el camí de submòdul «$displaypath»"
+"No s'ha pogut fer «rebase» «$sha1» en el camí de submòdul «$displaypath»"
 
 #: git-submodule.sh:644
 #, sh-format
@@ -24261,7 +24247,7 @@
 #: git-parse-remote.sh:89
 #, sh-format
 msgid "See git-${cmd}(1) for details."
-msgstr "Vegeu git-${cmd}(1) per detalls."
+msgstr "Vegeu git-${cmd}(1) per a més informació."
 
 #: git-rebase--preserve-merges.sh:109
 msgid "Applied autostash."
@@ -24280,7 +24266,7 @@
 msgstr ""
 "L'aplicació del «stash» automàtic ha resultat en conflictes.\n"
 "Els vostres canvis estan segurs en el «stash».\n"
-"Podeu executar \"git stash pop\" o \"git stash drop\" en qualsevol moment.\n"
+"Podeu executar «git stash pop» o «git stash drop» en qualsevol moment.\n"
 
 #: git-rebase--preserve-merges.sh:191
 #, sh-format
@@ -24288,7 +24274,6 @@
 msgstr "S'està fent «rebase» ($new_count/$total)"
 
 #: git-rebase--preserve-merges.sh:207
-#, fuzzy
 msgid ""
 "\n"
 "Commands:\n"
@@ -24308,8 +24293,25 @@
 "\n"
 "These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
-"Les ordres p select <commit> = fa servir «commit» o «commit» o "
-"«commit» (commit) o «commit» (commit)"
+"\n"
+"Ordres:\n"
+" p, pick <comissió> = usa la comissió\n"
+" r, reword <comissió> = usa la comissió, però edita el missatge de comissió\n"
+" e, edit <comissió> = usa la comissió, però atura't per a esmenar\n"
+" s, squash <comissió> = usa la comissió, però fusiona-la a la comissió prèvia\n"
+" f, fixup <comissió> = com a «squash», però descarta el missatge de registre d'aquesta "
+"comissió\n"
+"x, exec <comissió> = executa l'ordre (la resta de la línia) usant l'intèrpret "
+"d'ordres\n"
+"d, drop <comissió> = elimina la comissió\n"
+"l, label <etiqueta> = etiqueta la HEAD actual amb un nom\n"
+"t, reset <etiqueta> = reinicia HEAD a una etiqueta    \n"
+"m, merge [-C <comissió> | -c <comissió>] <etiqueta> [# <oneline>]\n"
+".       crea una comissió de fusió usant el missatge de la comissió\n"
+".       de fusió original (o línia única, si no hi ha cap comissió de fusió original\n"
+".       especificada). Useu -c <comissió> per a reescriure el missatge de publicació.\n"
+"\n"
+"Es pot canviar l'ordre d'aquestes línies; s'executen de dalt a baix.\n"
 
 #: git-rebase--preserve-merges.sh:270
 #, sh-format
@@ -24333,7 +24335,7 @@
 #: git-rebase--preserve-merges.sh:295
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
-msgstr "$sha1: no és una comissió que es pugui escollir"
+msgstr "$sha1: no és una comissió que es pugui triar"
 
 #: git-rebase--preserve-merges.sh:334
 #, sh-format
@@ -24372,7 +24374,7 @@
 #: git-rebase--preserve-merges.sh:458
 #, sh-format
 msgid "Could not pick $sha1"
-msgstr "No s'ha pogut escollir $sha1"
+msgstr "No s'ha pogut triar $sha1"
 
 #: git-rebase--preserve-merges.sh:467
 #, sh-format
@@ -24388,7 +24390,7 @@
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
-msgstr[0] "Això és una combinació de $count comissió."
+msgstr[0] "Això és una combinació d'$count comissió."
 msgstr[1] "Això és una combinació de $count comissions."
 
 #: git-rebase--preserve-merges.sh:492
@@ -24415,7 +24417,7 @@
 "before\n"
 "you are able to reword the commit."
 msgstr ""
-"No s'ha pogut esmenar la comissió després d'escollir amb èxit $sha1... "
+"No s'ha pogut esmenar la comissió després de triar correctament $sha1... "
 "$rest\n"
 "Això és probablement a causa d'un missatge de comissió buit, o el lligam de\n"
 "precomissió ha fallat. Si el lligam de precomissió ha fallat, pot ser que\n"
@@ -24430,7 +24432,7 @@
 #: git-rebase--preserve-merges.sh:641
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
-msgstr "No es pot '$squash_style' sense una comissió prèvia"
+msgstr "No es pot fer «$squash_style» sense una comissió prèvia"
 
 #: git-rebase--preserve-merges.sh:683
 #, sh-format
@@ -24706,9 +24708,9 @@
 "Lines starting with %s will be removed.\n"
 msgstr ""
 "---\n"
-"Per suprimir «%s» línies, feu-les línies ' ' (context).\n"
-"Per suprimir «%s» línies, suprimiu-les.\n"
-"Les línies que comencin per %s seran suprimides.\n"
+"Per a eliminar les línies «%s», convertiu-les en línies ' ' (context).\n"
+"Per a eliminar les línies «%s», suprimiu-les.\n"
+"Les línies que comencin per %s s'eliminaran.\n"
 
 #: git-add--interactive.perl:1140
 #, perl-format
@@ -24984,7 +24986,7 @@
 #: git-send-email.perl:315
 #, perl-format
 msgid "'%s.final' contains the composed email.\n"
-msgstr "'%s.final' conté el correu redactat.\n"
+msgstr "«%s.final» conté el correu redactat.\n"
 
 #: git-send-email.perl:408
 msgid "--dump-aliases incompatible with other options\n"
@@ -25011,22 +25013,22 @@
 #: git-send-email.perl:528
 #, perl-format
 msgid "Unknown --confirm setting: '%s'\n"
-msgstr "--confirm setting desconegut: «%s»\n"
+msgstr "Paràmetre --confirm desconegut: «%s»\n"
 
 #: git-send-email.perl:556
 #, perl-format
 msgid "warning: sendmail alias with quotes is not supported: %s\n"
-msgstr "avís: el sobrenom de sendmail amb cometes no està suportat: %s\n"
+msgstr "avís: no s'admet l'àlies de sendmail amb cometes: %s\n"
 
 #: git-send-email.perl:558
 #, perl-format
 msgid "warning: `:include:` not supported: %s\n"
-msgstr "avís: `:include:` no està suportat: %s\n"
+msgstr "avís: «:include:» no s'admet: %s\n"
 
 #: git-send-email.perl:560
 #, perl-format
 msgid "warning: `/file` or `|pipe` redirection not supported: %s\n"
-msgstr "avís: les redireccions `/file` or `|pipe no són admeses: %s\n"
+msgstr "avís: les redireccions «/file» ni «|pipe» no s'admeten: %s\n"
 
 #: git-send-email.perl:565
 #, perl-format
@@ -25042,11 +25044,11 @@
 "    * Saying \"./%s\" if you mean a file; or\n"
 "    * Giving --format-patch option if you mean a range.\n"
 msgstr ""
-"El fitxer «%s» existeix però també pot ser un rang de comissions\n"
-"per produir pedaços. Desambigüeu...\n"
+"El fitxer «%s» existeix, però també pot ser un rang de comissions\n"
+"per produir pedaços. Desambigüeu-ho...\n"
 "\n"
-"    * Dient \"./%s\" si volíeu especificar aquest fitxer; o\n"
-"    * Proporcionant l'opció --format-patch si volíeu especificar un rang.\n"
+"    * Dient «./%s» si volíeu especificar un fitxer; o\n"
+"    * Proporcionant l'opció «--format-patch» si volíeu especificar un rang.\n"
 
 #: git-send-email.perl:670
 #, perl-format
@@ -25090,11 +25092,11 @@
 "\n"
 "Clear the body content if you don't wish to send a summary.\n"
 msgstr ""
-"Se suprimiran les línies que comencen amb \"GIT:\".\n"
+"S'eliminaran les línies que comencen amb «GIT:».\n"
 "Considereu incloure un diffstat global o una taula de continguts\n"
-"per cada pedaç que esteu escrivint.\n"
+"per al pedaç que esteu escrivint.\n"
 "\n"
-"Netegeu el contingut del cos si no voleu enviar un resum.\n"
+"Esborreu el contingut del cos si no voleu enviar cap resum.\n"
 
 #: git-send-email.perl:763
 #, perl-format
@@ -25138,8 +25140,8 @@
 msgstr ""
 "S'ha refusat a enviar perquè el pedaç\n"
 "\t%s\n"
-"perquè la plantilla té l'assumpte '*** SUBJECT HERE ***'. Passeu --force si "
-"realment voleu enviar-lo.\n"
+"perquè la plantilla té l'assumpte «*** SUBJECT HERE ***». Passeu --force si "
+"realment voleu enviar-ho.\n"
 
 #: git-send-email.perl:945
 msgid "To whom should the emails be sent (if anyone)?"
@@ -25193,9 +25195,9 @@
 "    Aquest comportament està controlat pel paràmetre de configuració\n"
 "    sendemail.confirm.\n"
 "\n"
-"    Per a informació addicional, executeu 'git send-email --help'.\n"
+"    Per a informació addicional, executeu «git send-email --help».\n"
 "    Per mantenir el comportament actual, però silenciar aquest\n"
-"    missatge, executeu 'git config --global sendemail.confirm auto'.\n"
+"    missatge, executeu «git config --global sendemail.confirm auto».\n"
 "\n"
 
 #. TRANSLATORS: Make sure to include [y] [n] [e] [q] [a] in your
@@ -25298,7 +25300,7 @@
 
 #: git-send-email.perl:1875
 #, perl-format
-msgid "(%s) failed to close pipe to '%s'" 
+msgid "(%s) failed to close pipe to '%s'"
 msgstr "(%s) s'ha produït un error en tancar el conducte «%s»"
 
 #: git-send-email.perl:1905
diff --git a/po/de.po b/po/de.po
index 6356276..656de24 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,8 +8,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2020-05-27 07:23+0800\n"
-"PO-Revision-Date: 2020-05-24 15:57+0100\n"
+"POT-Creation-Date: 2020-07-10 09:53+0800\n"
+"PO-Revision-Date: 2020-07-12 13:20+0100\n"
 "Last-Translator: Matthias Rüster <matthias.ruester@gmail.com>\n"
 "Language-Team: Matthias Rüster <matthias.ruester@gmail.com>\n"
 "Language: de\n"
@@ -111,21 +111,21 @@
 msgid "ignoring unmerged: %s"
 msgstr "Ignoriere nicht zusammengeführte Datei: %s"
 
-#: add-interactive.c:929 add-patch.c:1675 git-add--interactive.perl:1366
+#: add-interactive.c:929 add-patch.c:1691 git-add--interactive.perl:1368
 #, c-format
 msgid "Only binary files changed.\n"
 msgstr "Nur Binärdateien geändert.\n"
 
-#: add-interactive.c:931 add-patch.c:1673 git-add--interactive.perl:1368
+#: add-interactive.c:931 add-patch.c:1689 git-add--interactive.perl:1370
 #, c-format
 msgid "No changes.\n"
 msgstr "Keine Änderungen.\n"
 
-#: add-interactive.c:935 git-add--interactive.perl:1376
+#: add-interactive.c:935 git-add--interactive.perl:1378
 msgid "Patch update"
 msgstr "Patch Aktualisierung"
 
-#: add-interactive.c:974 git-add--interactive.perl:1754
+#: add-interactive.c:974 git-add--interactive.perl:1771
 msgid "Review diff"
 msgstr "Diff überprüfen"
 
@@ -193,11 +193,11 @@
 msgid "(empty) select nothing"
 msgstr "(leer) nichts auswählen"
 
-#: add-interactive.c:1083 builtin/clean.c:816 git-add--interactive.perl:1851
+#: add-interactive.c:1083 builtin/clean.c:816 git-add--interactive.perl:1868
 msgid "*** Commands ***"
 msgstr "*** Befehle ***"
 
-#: add-interactive.c:1084 builtin/clean.c:817 git-add--interactive.perl:1848
+#: add-interactive.c:1084 builtin/clean.c:817 git-add--interactive.perl:1865
 msgid "What now"
 msgstr "Was nun"
 
@@ -214,7 +214,7 @@
 #: builtin/merge.c:276 builtin/pull.c:190 builtin/submodule--helper.c:409
 #: builtin/submodule--helper.c:1394 builtin/submodule--helper.c:1397
 #: builtin/submodule--helper.c:1902 builtin/submodule--helper.c:1905
-#: builtin/submodule--helper.c:2148 bugreport.c:129
+#: builtin/submodule--helper.c:2148 bugreport.c:135
 #: git-add--interactive.perl:213
 msgid "path"
 msgstr "Pfad"
@@ -223,27 +223,32 @@
 msgid "could not refresh index"
 msgstr "Index konnte nicht aktualisiert werden"
 
-#: add-interactive.c:1157 builtin/clean.c:781 git-add--interactive.perl:1765
+#: add-interactive.c:1157 builtin/clean.c:781 git-add--interactive.perl:1782
 #, c-format
 msgid "Bye.\n"
 msgstr "Tschüss.\n"
 
-#: add-patch.c:34 git-add--interactive.perl:1428
+#: add-patch.c:34 git-add--interactive.perl:1430
 #, c-format, perl-format
 msgid "Stage mode change [y,n,q,a,d%s,?]? "
 msgstr "Modusänderung der Staging-Area hinzufügen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:35 git-add--interactive.perl:1429
+#: add-patch.c:35 git-add--interactive.perl:1431
 #, c-format, perl-format
 msgid "Stage deletion [y,n,q,a,d%s,?]? "
 msgstr "Löschung der Staging-Area hinzufügen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:36 git-add--interactive.perl:1430
+#: add-patch.c:36 git-add--interactive.perl:1432
+#, c-format, perl-format
+msgid "Stage addition [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung der Staging-Area hinzufügen [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:37 git-add--interactive.perl:1433
 #, c-format, perl-format
 msgid "Stage this hunk [y,n,q,a,d%s,?]? "
 msgstr "Diesen Patch-Block der Staging-Area hinzufügen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:38
+#: add-patch.c:39
 msgid ""
 "If the patch applies cleanly, the edited hunk will immediately be marked for "
 "staging."
@@ -251,7 +256,7 @@
 "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
 "Block direkt für die Staging-Area markiert."
 
-#: add-patch.c:41
+#: add-patch.c:42
 msgid ""
 "y - stage this hunk\n"
 "n - do not stage this hunk\n"
@@ -267,22 +272,27 @@
 "d - diesen oder alle weiteren Patch-Blöcke in dieser Datei nicht zum Commit "
 "vormerken\n"
 
-#: add-patch.c:55 git-add--interactive.perl:1433
+#: add-patch.c:56 git-add--interactive.perl:1436
 #, c-format, perl-format
 msgid "Stash mode change [y,n,q,a,d%s,?]? "
 msgstr "Modusänderung stashen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:56 git-add--interactive.perl:1434
+#: add-patch.c:57 git-add--interactive.perl:1437
 #, c-format, perl-format
 msgid "Stash deletion [y,n,q,a,d%s,?]? "
 msgstr "Löschung stashen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:57 git-add--interactive.perl:1435
+#: add-patch.c:58 git-add--interactive.perl:1438
+#, c-format, perl-format
+msgid "Stash addition [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung stashen [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:59 git-add--interactive.perl:1439
 #, c-format, perl-format
 msgid "Stash this hunk [y,n,q,a,d%s,?]? "
 msgstr "Diesen Patch-Block stashen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:59
+#: add-patch.c:61
 msgid ""
 "If the patch applies cleanly, the edited hunk will immediately be marked for "
 "stashing."
@@ -290,7 +300,7 @@
 "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
 "Block direkt zum Stashen markiert."
 
-#: add-patch.c:62
+#: add-patch.c:64
 msgid ""
 "y - stash this hunk\n"
 "n - do not stash this hunk\n"
@@ -304,22 +314,27 @@
 "a - diesen und alle weiteren Patch-Blöcke dieser Datei stashen\n"
 "d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht stashen\n"
 
-#: add-patch.c:78 git-add--interactive.perl:1438
+#: add-patch.c:80 git-add--interactive.perl:1442
 #, c-format, perl-format
 msgid "Unstage mode change [y,n,q,a,d%s,?]? "
 msgstr "Modusänderung aus der Staging-Area entfernen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:79 git-add--interactive.perl:1439
+#: add-patch.c:81 git-add--interactive.perl:1443
 #, c-format, perl-format
 msgid "Unstage deletion [y,n,q,a,d%s,?]? "
 msgstr "Löschung aus der Staging-Area entfernen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:80 git-add--interactive.perl:1440
+#: add-patch.c:82 git-add--interactive.perl:1444
+#, c-format, perl-format
+msgid "Unstage addition [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung aus der Staging-Area entfernen [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:83 git-add--interactive.perl:1445
 #, c-format, perl-format
 msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
 msgstr "Diesen Patch-Block aus der Staging-Area entfernen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:82
+#: add-patch.c:85
 msgid ""
 "If the patch applies cleanly, the edited hunk will immediately be marked for "
 "unstaging."
@@ -327,7 +342,7 @@
 "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
 "Block direkt zum Entfernen aus der Staging-Area markiert."
 
-#: add-patch.c:85
+#: add-patch.c:88
 msgid ""
 "y - unstage this hunk\n"
 "n - do not unstage this hunk\n"
@@ -344,22 +359,27 @@
 "d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht aus Staging-"
 "Area entfernen\n"
 
-#: add-patch.c:100 git-add--interactive.perl:1443
+#: add-patch.c:103 git-add--interactive.perl:1448
 #, c-format, perl-format
 msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
 msgstr "Modusänderung auf Index anwenden [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:101 git-add--interactive.perl:1444
+#: add-patch.c:104 git-add--interactive.perl:1449
 #, c-format, perl-format
 msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
 msgstr "Löschung auf Index anwenden [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:102 git-add--interactive.perl:1445
+#: add-patch.c:105 git-add--interactive.perl:1450
+#, c-format, perl-format
+msgid "Apply addition to index [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung auf Index anwenden [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:106 git-add--interactive.perl:1451
 #, c-format, perl-format
 msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
 msgstr "Diesen Patch-Block auf Index anwenden [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:104 add-patch.c:169 add-patch.c:212
+#: add-patch.c:108 add-patch.c:176 add-patch.c:221
 msgid ""
 "If the patch applies cleanly, the edited hunk will immediately be marked for "
 "applying."
@@ -367,7 +387,7 @@
 "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
 "Block direkt zum Anwenden markiert."
 
-#: add-patch.c:107
+#: add-patch.c:111
 msgid ""
 "y - apply this hunk to index\n"
 "n - do not apply this hunk to index\n"
@@ -384,25 +404,31 @@
 "d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht auf den Index "
 "anwenden\n"
 
-#: add-patch.c:122 git-add--interactive.perl:1448
-#: git-add--interactive.perl:1463
+#: add-patch.c:126 git-add--interactive.perl:1454
+#: git-add--interactive.perl:1472
 #, c-format, perl-format
 msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
 msgstr "Modusänderung im Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:123 git-add--interactive.perl:1449
-#: git-add--interactive.perl:1464
+#: add-patch.c:127 git-add--interactive.perl:1455
+#: git-add--interactive.perl:1473
 #, c-format, perl-format
 msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
 msgstr "Löschung im Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:124 git-add--interactive.perl:1450
-#: git-add--interactive.perl:1465
+#: add-patch.c:128 git-add--interactive.perl:1456
+#: git-add--interactive.perl:1474
+#, c-format, perl-format
+msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung im Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:129 git-add--interactive.perl:1457
+#: git-add--interactive.perl:1475
 #, c-format, perl-format
 msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
 msgstr "Diesen Patch-Block im Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:126 add-patch.c:148 add-patch.c:191
+#: add-patch.c:131 add-patch.c:154 add-patch.c:199
 msgid ""
 "If the patch applies cleanly, the edited hunk will immediately be marked for "
 "discarding."
@@ -410,7 +436,7 @@
 "Wenn der Patch sauber angewendet werden kann, wird der bearbeitete Patch-"
 "Block direkt zum Verwerfen markiert."
 
-#: add-patch.c:129 add-patch.c:194
+#: add-patch.c:134 add-patch.c:202
 msgid ""
 "y - discard this hunk from worktree\n"
 "n - do not discard this hunk from worktree\n"
@@ -427,25 +453,30 @@
 "d - diesen oder alle weiteren Patch-Blöcke dieser Datei nicht im "
 "Arbeitsverzeichnis verwerfen\n"
 
-#: add-patch.c:144 add-patch.c:187 git-add--interactive.perl:1453
+#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1460
 #, c-format, perl-format
 msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "Modusänderung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:145 add-patch.c:188 git-add--interactive.perl:1454
+#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1461
 #, c-format, perl-format
 msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
 msgstr "Löschung vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:146 add-patch.c:189 git-add--interactive.perl:1455
+#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1462
+#,  c-format, perl-format
+msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung im Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1463
 #, c-format, perl-format
 msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "Diesen Patch-Block vom Index und Arbeitsverzeichnis verwerfen [y,n,q,a,d"
 "%s,?]? "
 
-#: add-patch.c:151
+#: add-patch.c:157
 msgid ""
 "y - discard this hunk from index and worktree\n"
 "n - do not discard this hunk from index and worktree\n"
@@ -459,25 +490,30 @@
 "a - diesen und alle weiteren Patch-Blöcke in der Datei verwerfen\n"
 "d - diesen oder alle weiteren Patch-Blöcke in der Datei nicht verwerfen\n"
 
-#: add-patch.c:165 add-patch.c:208 git-add--interactive.perl:1458
+#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1466
 #, c-format, perl-format
 msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "Modusänderung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:166 add-patch.c:209 git-add--interactive.perl:1459
+#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1467
 #, c-format, perl-format
 msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
 msgstr "Löschung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d%s,?]? "
 
-#: add-patch.c:167 add-patch.c:210 git-add--interactive.perl:1460
+#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1468
+#, c-format, perl-format
+msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
+msgstr "Ergänzung auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d%s,?]? "
+
+#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1469
 #, c-format, perl-format
 msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
 msgstr ""
 "Diesen Patch-Block auf Index und Arbeitsverzeichnis anwenden [y,n,q,a,d"
 "%s,?]? "
 
-#: add-patch.c:172
+#: add-patch.c:179
 msgid ""
 "y - apply this hunk to index and worktree\n"
 "n - do not apply this hunk to index and worktree\n"
@@ -492,7 +528,7 @@
 "a - diesen und alle weiteren Patch-Blöcke in der Datei anwenden\n"
 "d - diesen oder alle weiteren Patch-Blöcke in der Datei nicht anwenden\n"
 
-#: add-patch.c:215
+#: add-patch.c:224
 msgid ""
 "y - apply this hunk to worktree\n"
 "n - do not apply this hunk to worktree\n"
@@ -506,34 +542,34 @@
 "a - diesen und alle weiteren Patch-Blöcke in der Datei anwenden\n"
 "d - diesen und alle weiteren Patch-Blöcke in der Datei nicht anwenden\n"
 
-#: add-patch.c:319
+#: add-patch.c:328
 #, c-format
 msgid "could not parse hunk header '%.*s'"
 msgstr "Konnte Block-Header '%.*s' nicht parsen."
 
-#: add-patch.c:338 add-patch.c:342
+#: add-patch.c:347 add-patch.c:351
 #, c-format
 msgid "could not parse colored hunk header '%.*s'"
 msgstr "Konnte farbigen Block-Header '%.*s' nicht parsen."
 
-#: add-patch.c:396
+#: add-patch.c:405
 msgid "could not parse diff"
 msgstr "Konnte Differenz nicht parsen."
 
-#: add-patch.c:415
+#: add-patch.c:424
 msgid "could not parse colored diff"
 msgstr "Konnte farbige Differenz nicht parsen."
 
-#: add-patch.c:429
+#: add-patch.c:438
 #, c-format
 msgid "failed to run '%s'"
 msgstr "'%s' konnte nicht ausgeführt werden"
 
-#: add-patch.c:588
+#: add-patch.c:602
 msgid "mismatched output from interactive.diffFilter"
 msgstr "nicht übereinstimmende Ausgabe von interactive.diffFilter"
 
-#: add-patch.c:589
+#: add-patch.c:603
 msgid ""
 "Your filter must maintain a one-to-one correspondence\n"
 "between its input and output lines."
@@ -541,7 +577,7 @@
 "Der Filter muss eine Eins-zu-Eins-Beziehung\n"
 "zwischen den Ein- und Ausgabe-Zeilen einhalten."
 
-#: add-patch.c:762
+#: add-patch.c:776
 #, c-format
 msgid ""
 "expected context line #%d in\n"
@@ -550,7 +586,7 @@
 "Erwartete Kontextzeile #%d in\n"
 "%.*s"
 
-#: add-patch.c:777
+#: add-patch.c:791
 #, c-format
 msgid ""
 "hunks do not overlap:\n"
@@ -563,13 +599,13 @@
 "\tendet nicht mit:\n"
 "%.*s"
 
-#: add-patch.c:1053 git-add--interactive.perl:1112
+#: add-patch.c:1067 git-add--interactive.perl:1114
 msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
 msgstr ""
 "Manueller Editiermodus für Patch-Blöcke -- siehe nach unten für eine\n"
 "Kurzanleitung.\n"
 
-#: add-patch.c:1057
+#: add-patch.c:1071
 #, c-format
 msgid ""
 "---\n"
@@ -583,7 +619,7 @@
 "Zeilen, die mit %c beginnen, werden entfernt.\n"
 
 #. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1071 git-add--interactive.perl:1126
+#: add-patch.c:1085 git-add--interactive.perl:1128
 msgid ""
 "If it does not apply cleanly, you will be given an opportunity to\n"
 "edit again.  If all lines of the hunk are removed, then the edit is\n"
@@ -594,11 +630,11 @@
 "werden,\n"
 "wird die Bearbeitung abgebrochen und der Patch-Block bleibt unverändert.\n"
 
-#: add-patch.c:1104
+#: add-patch.c:1118
 msgid "could not parse hunk header"
 msgstr "Konnte Block-Header nicht parsen."
 
-#: add-patch.c:1149
+#: add-patch.c:1163
 msgid "'git apply --cached' failed"
 msgstr "'git apply --cached' schlug fehl."
 
@@ -614,27 +650,27 @@
 #. Consider translating (saying "no" discards!) as
 #. (saying "n" for "no" discards!) if the translation
 #. of the word "no" does not start with n.
-#: add-patch.c:1218 git-add--interactive.perl:1239
+#: add-patch.c:1232 git-add--interactive.perl:1241
 msgid ""
 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
 msgstr ""
 "Ihr bearbeiteter Patch-Block kann nicht angewendet werden.\n"
 "Erneut bearbeiten? (\"n\" verwirft Bearbeitung!) [y/n]?"
 
-#: add-patch.c:1261
+#: add-patch.c:1275
 msgid "The selected hunks do not apply to the index!"
 msgstr ""
 "Die ausgewählten Patch-Blöcke können nicht auf den Index angewendet werden!"
 
-#: add-patch.c:1262 git-add--interactive.perl:1343
+#: add-patch.c:1276 git-add--interactive.perl:1345
 msgid "Apply them to the worktree anyway? "
 msgstr "Trotzdem auf Arbeitsverzeichnis anwenden? "
 
-#: add-patch.c:1269 git-add--interactive.perl:1346
+#: add-patch.c:1283 git-add--interactive.perl:1348
 msgid "Nothing was applied.\n"
 msgstr "Nichts angewendet.\n"
 
-#: add-patch.c:1326
+#: add-patch.c:1340
 msgid ""
 "j - leave this hunk undecided, see next undecided hunk\n"
 "J - leave this hunk undecided, see next hunk\n"
@@ -658,69 +694,69 @@
 "e - aktuellen Patch-Block manuell editieren\n"
 "? - Hilfe anzeigen\n"
 
-#: add-patch.c:1447 add-patch.c:1457
+#: add-patch.c:1463 add-patch.c:1473
 msgid "No previous hunk"
 msgstr "Kein vorheriger Patch-Block"
 
-#: add-patch.c:1452 add-patch.c:1462
+#: add-patch.c:1468 add-patch.c:1478
 msgid "No next hunk"
 msgstr "Kein folgender Patch-Block"
 
-#: add-patch.c:1468
+#: add-patch.c:1484
 msgid "No other hunks to goto"
 msgstr "Keine anderen Patch-Blöcke verbleibend"
 
-#: add-patch.c:1479 git-add--interactive.perl:1577
+#: add-patch.c:1495 git-add--interactive.perl:1594
 msgid "go to which hunk (<ret> to see more)? "
 msgstr "zu welchem Patch-Block springen (<Enter> für mehr Informationen)? "
 
-#: add-patch.c:1480 git-add--interactive.perl:1579
+#: add-patch.c:1496 git-add--interactive.perl:1596
 msgid "go to which hunk? "
 msgstr "zu welchem Patch-Block springen? "
 
-#: add-patch.c:1491
+#: add-patch.c:1507
 #, c-format
 msgid "Invalid number: '%s'"
 msgstr "Ungültige Nummer: '%s'"
 
-#: add-patch.c:1496
+#: add-patch.c:1512
 #, c-format
 msgid "Sorry, only %d hunk available."
 msgid_plural "Sorry, only %d hunks available."
 msgstr[0] "Entschuldigung, nur %d Patch-Block verfügbar."
 msgstr[1] "Entschuldigung, nur %d Patch-Blöcke verfügbar."
 
-#: add-patch.c:1505
+#: add-patch.c:1521
 msgid "No other hunks to search"
 msgstr "Keine anderen Patch-Blöcke zum Durchsuchen"
 
-#: add-patch.c:1511 git-add--interactive.perl:1623
+#: add-patch.c:1527 git-add--interactive.perl:1640
 msgid "search for regex? "
 msgstr "Suche nach regulärem Ausdruck? "
 
-#: add-patch.c:1526
+#: add-patch.c:1542
 #, c-format
 msgid "Malformed search regexp %s: %s"
 msgstr "Fehlerhafter regulärer Ausdruck für Suche %s: %s"
 
-#: add-patch.c:1543
+#: add-patch.c:1559
 msgid "No hunk matches the given pattern"
 msgstr "Kein Patch-Block entspricht dem angegebenen Muster"
 
-#: add-patch.c:1550
+#: add-patch.c:1566
 msgid "Sorry, cannot split this hunk"
 msgstr "Entschuldigung, kann diesen Patch-Block nicht aufteilen"
 
-#: add-patch.c:1554
+#: add-patch.c:1570
 #, c-format
 msgid "Split into %d hunks."
 msgstr "In %d Patch-Block aufgeteilt."
 
-#: add-patch.c:1558
+#: add-patch.c:1574
 msgid "Sorry, cannot edit this hunk"
 msgstr "Entschuldigung, kann diesen Patch-Block nicht bearbeiten"
 
-#: add-patch.c:1609
+#: add-patch.c:1625
 msgid "'git apply' failed"
 msgstr "'git apply' schlug fehl"
 
@@ -1438,7 +1474,7 @@
 
 #: apply.c:5008 builtin/am.c:2238 builtin/interpret-trailers.c:98
 #: builtin/interpret-trailers.c:100 builtin/interpret-trailers.c:102
-#: builtin/pack-objects.c:3458 builtin/rebase.c:1332
+#: builtin/pack-objects.c:3530 builtin/rebase.c:1332
 msgid "action"
 msgstr "Aktion"
 
@@ -1528,7 +1564,7 @@
 msgid "path too long (%d chars, SHA1: %s): %s"
 msgstr "Pfad zu lang (%d Zeichen, SHA1: %s): %s"
 
-#: archive-zip.c:480 builtin/pack-objects.c:232 builtin/pack-objects.c:235
+#: archive-zip.c:480 builtin/pack-objects.c:243 builtin/pack-objects.c:246
 #, c-format
 msgid "deflate error (%d)"
 msgstr "Fehler beim Komprimieren (%d)"
@@ -1598,8 +1634,8 @@
 msgstr "einen Präfix vor jeden Pfadnamen in dem Archiv stellen"
 
 #: archive.c:467 builtin/blame.c:861 builtin/blame.c:865 builtin/blame.c:866
-#: builtin/commit-tree.c:117 builtin/config.c:130 builtin/fast-export.c:1162
-#: builtin/fast-export.c:1164 builtin/fast-export.c:1168 builtin/grep.c:907
+#: builtin/commit-tree.c:117 builtin/config.c:130 builtin/fast-export.c:1208
+#: builtin/fast-export.c:1210 builtin/fast-export.c:1214 builtin/grep.c:907
 #: builtin/hash-object.c:105 builtin/ls-files.c:561 builtin/ls-files.c:564
 #: builtin/notes.c:412 builtin/notes.c:578 builtin/read-tree.c:123
 #: parse-options.h:190
@@ -1828,10 +1864,10 @@
 "endgültigen\n"
 "Commits"
 
-#: blame.c:2821 bundle.c:167 ref-filter.c:2200 remote.c:1924 sequencer.c:2018
+#: blame.c:2821 bundle.c:187 ref-filter.c:2200 remote.c:1924 sequencer.c:2018
 #: sequencer.c:4466 submodule.c:847 builtin/commit.c:1047 builtin/log.c:405
 #: builtin/log.c:1012 builtin/log.c:1541 builtin/log.c:1945 builtin/log.c:2235
-#: builtin/merge.c:415 builtin/pack-objects.c:3276 builtin/pack-objects.c:3291
+#: builtin/merge.c:415 builtin/pack-objects.c:3348 builtin/pack-objects.c:3363
 #: builtin/shortlog.c:192
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
@@ -1995,84 +2031,88 @@
 msgid "HEAD of working tree %s is not updated"
 msgstr "HEAD des Arbeitsverzeichnisses %s ist nicht aktualisiert."
 
-#: bundle.c:36
+#: bundle.c:47
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
 msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
 
-#: bundle.c:64
+#: bundle.c:69
+msgid "unknown hash algorithm length"
+msgstr "unbekannte Länge des Hash-Algorithmus"
+
+#: bundle.c:84
 #, c-format
 msgid "unrecognized header: %s%s (%d)"
 msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
 
-#: bundle.c:90 rerere.c:480 rerere.c:690 sequencer.c:2270 sequencer.c:3034
+#: bundle.c:110 rerere.c:480 rerere.c:690 sequencer.c:2270 sequencer.c:3034
 #: builtin/commit.c:814
 #, c-format
 msgid "could not open '%s'"
 msgstr "Konnte '%s' nicht öffnen"
 
-#: bundle.c:143
+#: bundle.c:163
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
 
-#: bundle.c:146
+#: bundle.c:166
 msgid "need a repository to verify a bundle"
 msgstr "Um ein Paket zu überprüfen wird ein Repository benötigt."
 
-#: bundle.c:197
+#: bundle.c:217
 #, c-format
 msgid "The bundle contains this ref:"
 msgid_plural "The bundle contains these %d refs:"
 msgstr[0] "Das Paket enthält diese Referenz:"
 msgstr[1] "Das Paket enthält diese %d Referenzen:"
 
-#: bundle.c:204
+#: bundle.c:224
 msgid "The bundle records a complete history."
 msgstr "Das Paket speichert eine komplette Historie."
 
-#: bundle.c:206
+#: bundle.c:226
 #, c-format
 msgid "The bundle requires this ref:"
 msgid_plural "The bundle requires these %d refs:"
 msgstr[0] "Das Paket benötigt diese Referenz:"
 msgstr[1] "Das Paket benötigt diese %d Referenzen:"
 
-#: bundle.c:273
+#: bundle.c:293
 msgid "unable to dup bundle descriptor"
 msgstr "Konnte dup für Descriptor des Pakets nicht ausführen."
 
-#: bundle.c:280
+#: bundle.c:300
 msgid "Could not spawn pack-objects"
 msgstr "Konnte Paketobjekte nicht erstellen"
 
-#: bundle.c:291
+#: bundle.c:311
 msgid "pack-objects died"
 msgstr "Erstellung der Paketobjekte abgebrochen"
 
-#: bundle.c:333
+#: bundle.c:353
 msgid "rev-list died"
 msgstr "\"rev-list\" abgebrochen"
 
-#: bundle.c:382
+#: bundle.c:402
 #, c-format
 msgid "ref '%s' is excluded by the rev-list options"
 msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
 
-#: bundle.c:461 builtin/log.c:208 builtin/log.c:1834 builtin/shortlog.c:306
+#: bundle.c:481 builtin/log.c:208 builtin/log.c:1834 builtin/shortlog.c:306
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
 
-#: bundle.c:469
+#: bundle.c:489
 msgid "Refusing to create empty bundle."
 msgstr "Erstellung eines leeren Pakets zurückgewiesen."
 
-#: bundle.c:479
+#: bundle.c:499
 #, c-format
 msgid "cannot create '%s'"
 msgstr "kann '%s' nicht erstellen"
 
-#: bundle.c:504
+#: bundle.c:524
 msgid "index-pack died"
 msgstr "Erstellung der Paketindexdatei abgebrochen"
 
@@ -2081,258 +2121,250 @@
 msgid "invalid color value: %.*s"
 msgstr "Ungültiger Farbwert: %.*s"
 
-#: commit-graph.c:183
+#: commit-graph.c:238
 msgid "commit-graph file is too small"
 msgstr "Commit-Graph-Datei ist zu klein."
 
-#: commit-graph.c:248
+#: commit-graph.c:303
 #, c-format
 msgid "commit-graph signature %X does not match signature %X"
 msgstr "Commit-Graph-Signatur %X stimmt nicht mit Signatur %X überein."
 
-#: commit-graph.c:255
+#: commit-graph.c:310
 #, c-format
 msgid "commit-graph version %X does not match version %X"
 msgstr "Commit-Graph-Version %X stimmt nicht mit Version %X überein."
 
-#: commit-graph.c:262
+#: commit-graph.c:317
 #, c-format
 msgid "commit-graph hash version %X does not match version %X"
 msgstr "Hash-Version des Commit-Graph %X stimmt nicht mit Version %X überein."
 
-#: commit-graph.c:284
+#: commit-graph.c:339
 msgid "commit-graph chunk lookup table entry missing; file may be incomplete"
 msgstr ""
 "fehlender Tabelleneintrag für Commit-Graph Chunk-Lookup; Datei "
 "möglicherweise unvollständig"
 
-#: commit-graph.c:294
+#: commit-graph.c:349
 #, c-format
 msgid "commit-graph improper chunk offset %08x%08x"
 msgstr "Unzulässiger Commit-Graph Chunk-Offset %08x%08x"
 
-#: commit-graph.c:362
+#: commit-graph.c:417
 #, c-format
 msgid "commit-graph chunk id %08x appears multiple times"
 msgstr "Commit-Graph Chunk-Id %08x kommt mehrfach vor."
 
-#: commit-graph.c:436
+#: commit-graph.c:491
 msgid "commit-graph has no base graphs chunk"
 msgstr "Commit-Graph hat keinen Basis-Graph-Chunk"
 
-#: commit-graph.c:446
+#: commit-graph.c:501
 msgid "commit-graph chain does not match"
 msgstr "Commit-Graph Verkettung stimmt nicht überein."
 
-#: commit-graph.c:494
+#: commit-graph.c:549
 #, c-format
 msgid "invalid commit-graph chain: line '%s' not a hash"
 msgstr "Ungültige Commit-Graph Verkettung: Zeile '%s' ist kein Hash"
 
-#: commit-graph.c:518
+#: commit-graph.c:573
 msgid "unable to find all commit-graph files"
 msgstr "Konnte nicht alle Commit-Graph-Dateien finden."
 
-#: commit-graph.c:651 commit-graph.c:711
+#: commit-graph.c:706 commit-graph.c:770
 msgid "invalid commit position. commit-graph is likely corrupt"
 msgstr "Ungültige Commit-Position. Commit-Graph ist wahrscheinlich beschädigt."
 
-#: commit-graph.c:672
+#: commit-graph.c:727
 #, c-format
 msgid "could not find commit %s"
 msgstr "Konnte Commit %s nicht finden."
 
-#: commit-graph.c:948 builtin/am.c:1292
+#: commit-graph.c:1009 builtin/am.c:1292
 #, c-format
 msgid "unable to parse commit %s"
 msgstr "Konnte Commit '%s' nicht parsen."
 
-#: commit-graph.c:1096
+#: commit-graph.c:1157
 msgid "Writing changed paths Bloom filters index"
 msgstr "Schreibe Index für veränderte Pfade Bloom-Filter"
 
-#: commit-graph.c:1121
+#: commit-graph.c:1182
 msgid "Writing changed paths Bloom filters data"
 msgstr "Schreibe Daten für veränderte Pfade Bloom-Filter"
 
-#: commit-graph.c:1160 builtin/pack-objects.c:2783
+#: commit-graph.c:1221 builtin/pack-objects.c:2832
 #, c-format
 msgid "unable to get type of object %s"
 msgstr "Konnte Art von Objekt '%s' nicht bestimmen."
 
-#: commit-graph.c:1196
+#: commit-graph.c:1257
 msgid "Loading known commits in commit graph"
 msgstr "Lade bekannte Commits in Commit-Graph"
 
-#: commit-graph.c:1213
+#: commit-graph.c:1274
 msgid "Expanding reachable commits in commit graph"
 msgstr "Erweitere erreichbare Commits in Commit-Graph"
 
-#: commit-graph.c:1233
+#: commit-graph.c:1294
 msgid "Clearing commit marks in commit graph"
 msgstr "Lösche Commit-Markierungen in Commit-Graph"
 
-#: commit-graph.c:1252
+#: commit-graph.c:1313
 msgid "Computing commit graph generation numbers"
 msgstr "Commit-Graph Generationsnummern berechnen"
 
-#: commit-graph.c:1300
+#: commit-graph.c:1367
 msgid "Computing commit changed paths Bloom filters"
 msgstr "Berechnung der Bloom-Filter für veränderte Pfade des Commits"
 
-#: commit-graph.c:1359
+#: commit-graph.c:1423
+msgid "Collecting referenced commits"
+msgstr "Sammle referenzierte Commits"
+
+#: commit-graph.c:1447
 #, c-format
 msgid "Finding commits for commit graph in %d pack"
 msgid_plural "Finding commits for commit graph in %d packs"
 msgstr[0] "Suche Commits für Commit-Graph in %d Paket"
 msgstr[1] "Suche Commits für Commit-Graph in %d Paketen"
 
-#: commit-graph.c:1372
+#: commit-graph.c:1460
 #, c-format
 msgid "error adding pack %s"
 msgstr "Fehler beim Hinzufügen von Paket %s."
 
-#: commit-graph.c:1376
+#: commit-graph.c:1464
 #, c-format
 msgid "error opening index for %s"
 msgstr "Fehler beim Öffnen des Index für %s."
 
-#: commit-graph.c:1405
-#, c-format
-msgid "Finding commits for commit graph from %d ref"
-msgid_plural "Finding commits for commit graph from %d refs"
-msgstr[0] "Suche Commits für Commit-Graph in %d Referenz"
-msgstr[1] "Suche Commits für Commit-Graph in %d Referenzen"
-
-#: commit-graph.c:1426
-#, c-format
-msgid "invalid commit object id: %s"
-msgstr "ungültige Commit-Objekt-ID: %s"
-
-#: commit-graph.c:1442
+#: commit-graph.c:1503
 msgid "Finding commits for commit graph among packed objects"
 msgstr "Suche Commits für Commit-Graph in gepackten Objekten"
 
-#: commit-graph.c:1457
+#: commit-graph.c:1518
 msgid "Counting distinct commits in commit graph"
 msgstr "Zähle Commits in Commit-Graph"
 
-#: commit-graph.c:1489
+#: commit-graph.c:1550
 msgid "Finding extra edges in commit graph"
 msgstr "Suche zusätzliche Ränder in Commit-Graph"
 
-#: commit-graph.c:1538
+#: commit-graph.c:1599
 msgid "failed to write correct number of base graph ids"
 msgstr "Fehler beim Schreiben der korrekten Anzahl von Basis-Graph-IDs."
 
-#: commit-graph.c:1572 midx.c:812
+#: commit-graph.c:1633 midx.c:812
 #, c-format
 msgid "unable to create leading directories of %s"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: commit-graph.c:1585
+#: commit-graph.c:1646
 msgid "unable to create temporary graph layer"
 msgstr "konnte temporäre Graphen-Schicht nicht erstellen"
 
-#: commit-graph.c:1590
+#: commit-graph.c:1651
 #, c-format
 msgid "unable to adjust shared permissions for '%s'"
 msgstr "konnte geteilte Zugriffsberechtigungen für '%s' nicht ändern"
 
-#: commit-graph.c:1667
+#: commit-graph.c:1728
 #, c-format
 msgid "Writing out commit graph in %d pass"
 msgid_plural "Writing out commit graph in %d passes"
 msgstr[0] "Schreibe Commit-Graph in %d Durchgang"
 msgstr[1] "Schreibe Commit-Graph in %d Durchgängen"
 
-#: commit-graph.c:1712
+#: commit-graph.c:1773
 msgid "unable to open commit-graph chain file"
 msgstr "Konnte Commit-Graph Chain-Datei nicht öffnen."
 
-#: commit-graph.c:1728
+#: commit-graph.c:1789
 msgid "failed to rename base commit-graph file"
 msgstr "Konnte Basis-Commit-Graph-Datei nicht umbenennen."
 
-#: commit-graph.c:1748
+#: commit-graph.c:1809
 msgid "failed to rename temporary commit-graph file"
 msgstr "Konnte temporäre Commit-Graph-Datei nicht umbenennen."
 
-#: commit-graph.c:1874
+#: commit-graph.c:1935
 msgid "Scanning merged commits"
 msgstr "Durchsuche zusammengeführte Commits"
 
-#: commit-graph.c:1885
+#: commit-graph.c:1946
 #, c-format
 msgid "unexpected duplicate commit id %s"
 msgstr "Unerwartete doppelte Commit-ID %s"
 
-#: commit-graph.c:1908
+#: commit-graph.c:1969
 msgid "Merging commit-graph"
 msgstr "Zusammenführen von Commit-Graph"
 
-#: commit-graph.c:2096
+#: commit-graph.c:2156
 #, c-format
 msgid "the commit graph format cannot write %d commits"
 msgstr "Das Commit-Graph Format kann nicht %d Commits schreiben."
 
-#: commit-graph.c:2107
+#: commit-graph.c:2167
 msgid "too many commits to write graph"
 msgstr "Zu viele Commits zum Schreiben des Graphen."
 
-#: commit-graph.c:2200
+#: commit-graph.c:2260
 msgid "the commit-graph file has incorrect checksum and is likely corrupt"
 msgstr ""
 "Die Commit-Graph-Datei hat eine falsche Prüfsumme und ist wahrscheinlich "
 "beschädigt."
 
-#: commit-graph.c:2210
+#: commit-graph.c:2270
 #, c-format
 msgid "commit-graph has incorrect OID order: %s then %s"
 msgstr "Commit-Graph hat fehlerhafte OID-Reihenfolge: %s dann %s"
 
-#: commit-graph.c:2220 commit-graph.c:2235
+#: commit-graph.c:2280 commit-graph.c:2295
 #, c-format
 msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
 msgstr "Commit-Graph hat fehlerhaften Fanout-Wert: fanout[%d] = %u != %u"
 
-#: commit-graph.c:2227
+#: commit-graph.c:2287
 #, c-format
 msgid "failed to parse commit %s from commit-graph"
 msgstr "Konnte Commit %s von Commit-Graph nicht parsen."
 
-#: commit-graph.c:2245
+#: commit-graph.c:2305
 msgid "Verifying commits in commit graph"
 msgstr "Commit in Commit-Graph überprüfen"
 
-#: commit-graph.c:2259
+#: commit-graph.c:2320
 #, c-format
 msgid "failed to parse commit %s from object database for commit-graph"
 msgstr ""
 "Fehler beim Parsen des Commits %s von Objekt-Datenbank für Commit-Graph"
 
-#: commit-graph.c:2266
+#: commit-graph.c:2327
 #, c-format
 msgid "root tree OID for commit %s in commit-graph is %s != %s"
 msgstr ""
 "OID des Wurzelverzeichnisses für Commit %s in Commit-Graph ist %s != %s"
 
-#: commit-graph.c:2276
+#: commit-graph.c:2337
 #, c-format
 msgid "commit-graph parent list for commit %s is too long"
 msgstr "Commit-Graph Vorgänger-Liste für Commit %s ist zu lang"
 
-#: commit-graph.c:2285
+#: commit-graph.c:2346
 #, c-format
 msgid "commit-graph parent for %s is %s != %s"
 msgstr "Commit-Graph-Vorgänger für %s ist %s != %s"
 
-#: commit-graph.c:2298
+#: commit-graph.c:2360
 #, c-format
 msgid "commit-graph parent list for commit %s terminates early"
 msgstr "Commit-Graph Vorgänger-Liste für Commit %s endet zu früh"
 
-#: commit-graph.c:2303
+#: commit-graph.c:2365
 #, c-format
 msgid ""
 "commit-graph has generation number zero for commit %s, but non-zero elsewhere"
@@ -2340,7 +2372,7 @@
 "Commit-Graph hat Generationsnummer null für Commit %s, aber sonst ungleich "
 "null"
 
-#: commit-graph.c:2307
+#: commit-graph.c:2369
 #, c-format
 msgid ""
 "commit-graph has non-zero generation number for commit %s, but zero elsewhere"
@@ -2348,12 +2380,12 @@
 "Commit-Graph hat Generationsnummer ungleich null für Commit %s, aber sonst "
 "null"
 
-#: commit-graph.c:2322
+#: commit-graph.c:2385
 #, c-format
 msgid "commit-graph generation for commit %s is %u != %u"
 msgstr "Commit-Graph Erstellung für Commit %s ist %u != %u"
 
-#: commit-graph.c:2328
+#: commit-graph.c:2391
 #, c-format
 msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
 msgstr ""
@@ -2391,28 +2423,28 @@
 "Sie können diese Meldung unterdrücken, indem Sie\n"
 "\"git config advice.graftFileDeprecated false\" ausführen."
 
-#: commit.c:1168
+#: commit.c:1172
 #, c-format
 msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
 msgstr ""
 "Commit %s hat eine nicht vertrauenswürdige GPG-Signatur, angeblich von %s."
 
-#: commit.c:1172
+#: commit.c:1176
 #, c-format
 msgid "Commit %s has a bad GPG signature allegedly by %s."
 msgstr "Commit %s hat eine ungültige GPG-Signatur, angeblich von %s."
 
-#: commit.c:1175
+#: commit.c:1179
 #, c-format
 msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
-#: commit.c:1178
+#: commit.c:1182
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n"
 
-#: commit.c:1432
+#: commit.c:1436
 msgid ""
 "Warning: commit message did not conform to UTF-8.\n"
 "You may want to amend it after fixing the message, or set the config\n"
@@ -2614,7 +2646,7 @@
 msgstr ""
 "Muss einer von diesen sein: nothing, matching, simple, upstream, current"
 
-#: config.c:1533 builtin/pack-objects.c:3542
+#: config.c:1533 builtin/pack-objects.c:3617
 #, c-format
 msgid "bad pack compression level %d"
 msgstr "ungültiger Komprimierungsgrad (%d) für Paketierung"
@@ -2770,74 +2802,83 @@
 msgid "server doesn't support '%s'"
 msgstr "Der Server unterstützt kein '%s'."
 
-#: connect.c:103
+#: connect.c:118
 #, c-format
 msgid "server doesn't support feature '%s'"
 msgstr "Der Server unterstützt das Feature '%s' nicht."
 
-#: connect.c:114
+#: connect.c:129
 msgid "expected flush after capabilities"
 msgstr "Erwartete Flush nach Fähigkeiten."
 
-#: connect.c:233
+#: connect.c:263
 #, c-format
 msgid "ignoring capabilities after first line '%s'"
 msgstr "Ignoriere Fähigkeiten nach der ersten Zeile '%s'."
 
-#: connect.c:252
+#: connect.c:284
 msgid "protocol error: unexpected capabilities^{}"
 msgstr "Protokollfehler: unerwartetes capabilities^{}"
 
-#: connect.c:273
+#: connect.c:306
 #, c-format
 msgid "protocol error: expected shallow sha-1, got '%s'"
 msgstr "Protokollfehler: shallow SHA-1 erwartet, '%s' bekommen"
 
-#: connect.c:275
+#: connect.c:308
 msgid "repository on the other end cannot be shallow"
 msgstr ""
 "Repository auf der Gegenseite kann keine unvollständige Historie (shallow) "
 "enthalten"
 
-#: connect.c:313
+#: connect.c:347
 msgid "invalid packet"
-msgstr "Ungültiges Paket."
+msgstr "ungültiges Paket"
 
-#: connect.c:333
+#: connect.c:367
 #, c-format
 msgid "protocol error: unexpected '%s'"
 msgstr "Protokollfehler: unerwartetes '%s'"
 
-#: connect.c:441
+#: connect.c:473
+#, c-format
+msgid "unknown object format '%s' specified by server"
+msgstr "unbekanntes Objekt-Format '%s' vom Server angegeben"
+
+#: connect.c:500
 #, c-format
 msgid "invalid ls-refs response: %s"
-msgstr "Ungültige ls-refs Antwort: %s"
+msgstr "ungültige ls-refs Antwort: %s"
 
-#: connect.c:445
+#: connect.c:504
 msgid "expected flush after ref listing"
-msgstr "Erwartete Flush nach Auflistung der Referenzen."
+msgstr "Flush nach Auflistung der Referenzen erwartet"
 
-#: connect.c:544
+#: connect.c:507
+msgid "expected response end packet after ref listing"
+msgstr "Antwort-Endpaket nach Auflistung der Referenzen erwartet"
+
+#: connect.c:640
 #, c-format
 msgid "protocol '%s' is not supported"
-msgstr "Protokoll '%s' wird nicht unterstützt."
+msgstr "Protokoll '%s' wird nicht unterstützt"
 
-#: connect.c:595
+#: connect.c:691
 msgid "unable to set SO_KEEPALIVE on socket"
-msgstr "Kann SO_KEEPALIVE bei Socket nicht setzen."
+msgstr "kann SO_KEEPALIVE bei Socket nicht setzen"
 
-#: connect.c:635 connect.c:698
+#: connect.c:731 connect.c:794
 #, c-format
 msgid "Looking up %s ... "
 msgstr "Suche nach %s ..."
 
-#: connect.c:639
+#: connect.c:735
 #, c-format
 msgid "unable to look up %s (port %s) (%s)"
 msgstr "Fehler bei Suche nach %s (Port %s) (%s)."
 
 #. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:643 connect.c:714
+#: connect.c:739 connect.c:810
 #, c-format
 msgid ""
 "done.\n"
@@ -2846,7 +2887,7 @@
 "Fertig.\n"
 "Verbinde nach %s (Port %s) ... "
 
-#: connect.c:665 connect.c:742
+#: connect.c:761 connect.c:838
 #, c-format
 msgid ""
 "unable to connect to %s:\n"
@@ -2856,76 +2897,76 @@
 "%s"
 
 #. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:671 connect.c:748
+#: connect.c:767 connect.c:844
 msgid "done."
 msgstr "Fertig."
 
-#: connect.c:702
+#: connect.c:798
 #, c-format
 msgid "unable to look up %s (%s)"
 msgstr "Fehler bei der Suche nach %s (%s)"
 
-#: connect.c:708
+#: connect.c:804
 #, c-format
 msgid "unknown port %s"
 msgstr "Unbekannter Port %s"
 
-#: connect.c:845 connect.c:1175
+#: connect.c:941 connect.c:1271
 #, c-format
 msgid "strange hostname '%s' blocked"
 msgstr "Merkwürdigen Hostnamen '%s' blockiert."
 
-#: connect.c:847
+#: connect.c:943
 #, c-format
 msgid "strange port '%s' blocked"
 msgstr "Merkwürdigen Port '%s' blockiert."
 
-#: connect.c:857
+#: connect.c:953
 #, c-format
 msgid "cannot start proxy %s"
 msgstr "Kann Proxy %s nicht starten."
 
-#: connect.c:928
+#: connect.c:1024
 msgid "no path specified; see 'git help pull' for valid url syntax"
 msgstr ""
 "Kein Pfad angegeben; siehe 'git help pull' für eine gültige URL-Syntax."
 
-#: connect.c:1123
+#: connect.c:1219
 msgid "ssh variant 'simple' does not support -4"
 msgstr "SSH-Variante 'simple' unterstützt kein -4."
 
-#: connect.c:1135
+#: connect.c:1231
 msgid "ssh variant 'simple' does not support -6"
 msgstr "SSH-Variante 'simple' unterstützt kein -6."
 
-#: connect.c:1152
+#: connect.c:1248
 msgid "ssh variant 'simple' does not support setting port"
 msgstr "SSH-Variante 'simple' unterstützt nicht das Setzen eines Ports."
 
-#: connect.c:1264
+#: connect.c:1360
 #, c-format
 msgid "strange pathname '%s' blocked"
 msgstr "Merkwürdigen Pfadnamen '%s' blockiert."
 
-#: connect.c:1311
+#: connect.c:1407
 msgid "unable to fork"
 msgstr "Kann Prozess nicht starten."
 
-#: connected.c:107 builtin/fsck.c:209 builtin/prune.c:45
+#: connected.c:109 builtin/fsck.c:209 builtin/prune.c:45
 msgid "Checking connectivity"
 msgstr "Prüfe Konnektivität"
 
-#: connected.c:119
+#: connected.c:121
 msgid "Could not run 'git rev-list'"
 msgstr "Konnte 'git rev-list' nicht ausführen"
 
-#: connected.c:139
+#: connected.c:141
 msgid "failed write to rev-list"
 msgstr "Fehler beim Schreiben nach rev-list"
 
-#: connected.c:146
+#: connected.c:148
 msgid "failed to close rev-list's stdin"
-msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe"
+msgstr "Fehler beim Schließen von rev-lists Standard-Eingabe"
 
 #: convert.c:194
 #, c-format
@@ -3191,18 +3232,18 @@
 "Kein Git-Repository. Nutzen Sie --no-index, um zwei Pfade außerhalb des "
 "Arbeitsverzeichnisses zu vergleichen."
 
-#: diff.c:155
+#: diff.c:156
 #, c-format
 msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
 msgstr ""
 "  Fehler beim Parsen des abgeschnittenen \"dirstat\" Prozentsatzes '%s'\n"
 
-#: diff.c:160
+#: diff.c:161
 #, c-format
 msgid "  Unknown dirstat parameter '%s'\n"
 msgstr "  Unbekannter \"dirstat\" Parameter '%s'\n"
 
-#: diff.c:296
+#: diff.c:297
 msgid ""
 "color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
 "'dimmed-zebra', 'plain'"
@@ -3210,7 +3251,7 @@
 "\"color moved\"-Einstellung muss eines von diesen sein: 'no', 'default', "
 "'blocks', 'zebra', 'dimmed_zebra', 'plain'"
 
-#: diff.c:324
+#: diff.c:325
 #, c-format
 msgid ""
 "unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
@@ -3219,7 +3260,7 @@
 "Unbekannter color-moved-ws Modus '%s', mögliche Werte sind 'ignore-space-"
 "change', 'ignore-space-at-eol', 'ignore-all-space', 'allow-identation-change'"
 
-#: diff.c:332
+#: diff.c:333
 msgid ""
 "color-moved-ws: allow-indentation-change cannot be combined with other "
 "whitespace modes"
@@ -3227,12 +3268,12 @@
 "color-moved-ws: allow-indentation-change kann nicht mit anderen\n"
 "Whitespace-Modi kombiniert werden."
 
-#: diff.c:405
+#: diff.c:410
 #, c-format
 msgid "Unknown value for 'diff.submodule' config variable: '%s'"
 msgstr "Unbekannter Wert in Konfigurationsvariable 'diff.dirstat': '%s'"
 
-#: diff.c:465
+#: diff.c:470
 #, c-format
 msgid ""
 "Found errors in 'diff.dirstat' config variable:\n"
@@ -3241,36 +3282,36 @@
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:4238
+#: diff.c:4243
 #, c-format
 msgid "external diff died, stopping at %s"
 msgstr "externes Diff-Programm unerwartet beendet, angehalten bei %s"
 
-#: diff.c:4583
+#: diff.c:4589
 msgid "--name-only, --name-status, --check and -s are mutually exclusive"
 msgstr ""
 "--name-only, --name-status, --check und -s schließen sich gegenseitig aus"
 
-#: diff.c:4586
+#: diff.c:4592
 msgid "-G, -S and --find-object are mutually exclusive"
 msgstr "-G, -S und --find-object schließen sich gegenseitig aus"
 
-#: diff.c:4664
+#: diff.c:4670
 msgid "--follow requires exactly one pathspec"
 msgstr "--follow erfordert genau eine Pfadspezifikation"
 
-#: diff.c:4712
+#: diff.c:4718
 #, c-format
 msgid "invalid --stat value: %s"
 msgstr "Ungültiger --stat Wert: %s"
 
-#: diff.c:4717 diff.c:4722 diff.c:4727 diff.c:4732 diff.c:5245
+#: diff.c:4723 diff.c:4728 diff.c:4733 diff.c:4738 diff.c:5250
 #: parse-options.c:197 parse-options.c:201
 #, c-format
 msgid "%s expects a numerical value"
 msgstr "%s erwartet einen numerischen Wert."
 
-#: diff.c:4749
+#: diff.c:4755
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -3279,42 +3320,42 @@
 "Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
 "%s"
 
-#: diff.c:4834
+#: diff.c:4840
 #, c-format
 msgid "unknown change class '%c' in --diff-filter=%s"
 msgstr "Unbekannte Änderungsklasse '%c' in --diff-filter=%s"
 
-#: diff.c:4858
+#: diff.c:4864
 #, c-format
 msgid "unknown value after ws-error-highlight=%.*s"
 msgstr "Unbekannter Wert nach ws-error-highlight=%.*s"
 
-#: diff.c:4872
+#: diff.c:4878
 #, c-format
 msgid "unable to resolve '%s'"
 msgstr "konnte '%s' nicht auflösen"
 
-#: diff.c:4922 diff.c:4928
+#: diff.c:4928 diff.c:4934
 #, c-format
 msgid "%s expects <n>/<m> form"
 msgstr "%s erwartet die Form <n>/<m>"
 
-#: diff.c:4940
+#: diff.c:4946
 #, c-format
 msgid "%s expects a character, got '%s'"
 msgstr "%s erwartet ein Zeichen, '%s' bekommen"
 
-#: diff.c:4961
+#: diff.c:4967
 #, c-format
 msgid "bad --color-moved argument: %s"
 msgstr "Ungültiges --color-moved Argument: %s"
 
-#: diff.c:4980
+#: diff.c:4986
 #, c-format
 msgid "invalid mode '%s' in --color-moved-ws"
 msgstr "Ungültiger Modus '%s' in --color-moved-ws"
 
-#: diff.c:5020
+#: diff.c:5026
 msgid ""
 "option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
@@ -3322,152 +3363,152 @@
 "Option diff-algorithm akzeptiert: \"myers\", \"minimal\", \"patience\" and "
 "\"histogram\""
 
-#: diff.c:5056 diff.c:5076
+#: diff.c:5062 diff.c:5082
 #, c-format
 msgid "invalid argument to %s"
 msgstr "Ungültiges Argument für %s"
 
-#: diff.c:5214
+#: diff.c:5219
 #, c-format
 msgid "failed to parse --submodule option parameter: '%s'"
 msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
 
-#: diff.c:5270
+#: diff.c:5275
 #, c-format
 msgid "bad --word-diff argument: %s"
 msgstr "Ungültiges --word-diff Argument: %s"
 
-#: diff.c:5293
+#: diff.c:5298
 msgid "Diff output format options"
 msgstr "Diff-Optionen zu Ausgabeformaten"
 
-#: diff.c:5295 diff.c:5301
+#: diff.c:5300 diff.c:5306
 msgid "generate patch"
 msgstr "Erzeuge Patch"
 
-#: diff.c:5298 builtin/log.c:177
+#: diff.c:5303 builtin/log.c:177
 msgid "suppress diff output"
 msgstr "Ausgabe der Unterschiede unterdrücken"
 
-#: diff.c:5303 diff.c:5417 diff.c:5424
+#: diff.c:5308 diff.c:5422 diff.c:5429
 msgid "<n>"
 msgstr "<n>"
 
-#: diff.c:5304 diff.c:5307
+#: diff.c:5309 diff.c:5312
 msgid "generate diffs with <n> lines context"
 msgstr "Erstelle Unterschiede mit <n> Zeilen des Kontextes"
 
-#: diff.c:5309
+#: diff.c:5314
 msgid "generate the diff in raw format"
 msgstr "Erstelle Unterschiede im Rohformat"
 
-#: diff.c:5312
+#: diff.c:5317
 msgid "synonym for '-p --raw'"
 msgstr "Synonym für '-p --raw'"
 
-#: diff.c:5316
+#: diff.c:5321
 msgid "synonym for '-p --stat'"
 msgstr "Synonym für '-p --stat'"
 
-#: diff.c:5320
+#: diff.c:5325
 msgid "machine friendly --stat"
 msgstr "maschinenlesbare Ausgabe von --stat"
 
-#: diff.c:5323
+#: diff.c:5328
 msgid "output only the last line of --stat"
 msgstr "nur die letzte Zeile von --stat ausgeben"
 
-#: diff.c:5325 diff.c:5333
+#: diff.c:5330 diff.c:5338
 msgid "<param1,param2>..."
 msgstr "<Parameter1,Parameter2>..."
 
-#: diff.c:5326
+#: diff.c:5331
 msgid ""
 "output the distribution of relative amount of changes for each sub-directory"
 msgstr ""
 "Gebe die Verteilung des relativen Umfangs der Änderungen für jedes "
 "Unterverzeichnis aus"
 
-#: diff.c:5330
+#: diff.c:5335
 msgid "synonym for --dirstat=cumulative"
 msgstr "Synonym für --dirstat=cumulative"
 
-#: diff.c:5334
+#: diff.c:5339
 msgid "synonym for --dirstat=files,param1,param2..."
 msgstr "Synonym für --dirstat=files,Parameter1,Parameter2..."
 
-#: diff.c:5338
+#: diff.c:5343
 msgid "warn if changes introduce conflict markers or whitespace errors"
 msgstr ""
 "Warnen, wenn Änderungen Konfliktmarker oder Whitespace-Fehler einbringen"
 
-#: diff.c:5341
+#: diff.c:5346
 msgid "condensed summary such as creations, renames and mode changes"
 msgstr ""
 "Gekürzte Zusammenfassung, wie z.B. Erstellungen, Umbenennungen und "
 "Änderungen der Datei-Rechte"
 
-#: diff.c:5344
+#: diff.c:5349
 msgid "show only names of changed files"
 msgstr "nur Dateinamen der geänderten Dateien anzeigen"
 
-#: diff.c:5347
+#: diff.c:5352
 msgid "show only names and status of changed files"
 msgstr "nur Dateinamen und Status der geänderten Dateien anzeigen"
 
-#: diff.c:5349
+#: diff.c:5354
 msgid "<width>[,<name-width>[,<count>]]"
 msgstr "<Breite>[,<Namens-Breite>[,<Anzahl>]]"
 
-#: diff.c:5350
+#: diff.c:5355
 msgid "generate diffstat"
 msgstr "Generiere Zusammenfassung der Unterschiede"
 
-#: diff.c:5352 diff.c:5355 diff.c:5358
+#: diff.c:5357 diff.c:5360 diff.c:5363
 msgid "<width>"
 msgstr "<Breite>"
 
-#: diff.c:5353
+#: diff.c:5358
 msgid "generate diffstat with a given width"
 msgstr "Erzeuge Zusammenfassung der Unterschiede mit gegebener Breite"
 
-#: diff.c:5356
+#: diff.c:5361
 msgid "generate diffstat with a given name width"
 msgstr "Erzeuge Zusammenfassung der Unterschiede mit gegebener Namens-Breite"
 
-#: diff.c:5359
+#: diff.c:5364
 msgid "generate diffstat with a given graph width"
 msgstr "Erzeuge Zusammenfassung der Unterschiede mit gegebener Graph-Breite"
 
-#: diff.c:5361
+#: diff.c:5366
 msgid "<count>"
 msgstr "<Anzahl>"
 
-#: diff.c:5362
+#: diff.c:5367
 msgid "generate diffstat with limited lines"
 msgstr "Erzeuge Zusammenfassung der Unterschiede mit begrenzten Zeilen"
 
-#: diff.c:5365
+#: diff.c:5370
 msgid "generate compact summary in diffstat"
 msgstr "Erzeuge kompakte Zusammenstellung in Zusammenfassung der Unterschiede"
 
-#: diff.c:5368
+#: diff.c:5373
 msgid "output a binary diff that can be applied"
 msgstr "Gebe eine binäre Differenz aus, dass angewendet werden kann"
 
-#: diff.c:5371
+#: diff.c:5376
 msgid "show full pre- and post-image object names on the \"index\" lines"
 msgstr "Zeige vollständige Objekt-Namen in den \"index\"-Zeilen"
 
-#: diff.c:5373
+#: diff.c:5378
 msgid "show colored diff"
 msgstr "Zeige farbige Unterschiede"
 
-#: diff.c:5374
+#: diff.c:5379
 msgid "<kind>"
 msgstr "<Art>"
 
-#: diff.c:5375
+#: diff.c:5380
 msgid ""
 "highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
 "diff"
@@ -3475,7 +3516,7 @@
 "Hebe Whitespace-Fehler in den Zeilen 'context', 'old' oder 'new' bei den "
 "Unterschieden hervor"
 
-#: diff.c:5378
+#: diff.c:5383
 msgid ""
 "do not munge pathnames and use NULs as output field terminators in --raw or "
 "--numstat"
@@ -3483,91 +3524,91 @@
 "Verschleiere nicht die Pfadnamen und nutze NUL-Zeichen als Schlusszeichen in "
 "Ausgabefeldern bei --raw oder --numstat"
 
-#: diff.c:5381 diff.c:5384 diff.c:5387 diff.c:5493
+#: diff.c:5386 diff.c:5389 diff.c:5392 diff.c:5498
 msgid "<prefix>"
 msgstr "<Präfix>"
 
-#: diff.c:5382
+#: diff.c:5387
 msgid "show the given source prefix instead of \"a/\""
 msgstr "Zeige den gegebenen Quell-Präfix statt \"a/\""
 
-#: diff.c:5385
+#: diff.c:5390
 msgid "show the given destination prefix instead of \"b/\""
 msgstr "Zeige den gegebenen Ziel-Präfix statt \"b/\""
 
-#: diff.c:5388
+#: diff.c:5393
 msgid "prepend an additional prefix to every line of output"
 msgstr "Stelle einen zusätzlichen Präfix bei jeder Ausgabezeile voran"
 
-#: diff.c:5391
+#: diff.c:5396
 msgid "do not show any source or destination prefix"
 msgstr "Zeige keine Quell- oder Ziel-Präfixe an"
 
-#: diff.c:5394
+#: diff.c:5399
 msgid "show context between diff hunks up to the specified number of lines"
 msgstr ""
 "Zeige Kontext zwischen Unterschied-Blöcken bis zur angegebenen Anzahl von "
 "Zeilen."
 
-#: diff.c:5398 diff.c:5403 diff.c:5408
+#: diff.c:5403 diff.c:5408 diff.c:5413
 msgid "<char>"
 msgstr "<Zeichen>"
 
-#: diff.c:5399
+#: diff.c:5404
 msgid "specify the character to indicate a new line instead of '+'"
 msgstr "Das Zeichen festlegen, das eine neue Zeile kennzeichnet (statt '+')"
 
-#: diff.c:5404
+#: diff.c:5409
 msgid "specify the character to indicate an old line instead of '-'"
 msgstr "Das Zeichen festlegen, das eine alte Zeile kennzeichnet (statt '-')"
 
-#: diff.c:5409
+#: diff.c:5414
 msgid "specify the character to indicate a context instead of ' '"
 msgstr "Das Zeichen festlegen, das den Kontext kennzeichnet (statt ' ')"
 
-#: diff.c:5412
+#: diff.c:5417
 msgid "Diff rename options"
 msgstr "Diff-Optionen zur Umbenennung"
 
-#: diff.c:5413
+#: diff.c:5418
 msgid "<n>[/<m>]"
 msgstr "<n>[/<m>]"
 
-#: diff.c:5414
+#: diff.c:5419
 msgid "break complete rewrite changes into pairs of delete and create"
 msgstr ""
 "Teile komplette Rewrite-Änderungen in Änderungen mit \"löschen\" und "
 "\"erstellen\""
 
-#: diff.c:5418
+#: diff.c:5423
 msgid "detect renames"
 msgstr "Umbenennungen erkennen"
 
-#: diff.c:5422
+#: diff.c:5427
 msgid "omit the preimage for deletes"
 msgstr "Preimage für Löschungen weglassen."
 
-#: diff.c:5425
+#: diff.c:5430
 msgid "detect copies"
 msgstr "Kopien erkennen"
 
-#: diff.c:5429
+#: diff.c:5434
 msgid "use unmodified files as source to find copies"
 msgstr "Nutze ungeänderte Dateien als Quelle zum Finden von Kopien"
 
-#: diff.c:5431
+#: diff.c:5436
 msgid "disable rename detection"
 msgstr "Erkennung von Umbenennungen deaktivieren"
 
-#: diff.c:5434
+#: diff.c:5439
 msgid "use empty blobs as rename source"
 msgstr "Nutze leere Blobs als Quelle von Umbennungen"
 
-#: diff.c:5436
+#: diff.c:5441
 msgid "continue listing the history of a file beyond renames"
 msgstr "Fortführen der Auflistung der Historie einer Datei nach Umbennung"
 
-#: diff.c:5439
+#: diff.c:5444
 msgid ""
 "prevent rename/copy detection if the number of rename/copy targets exceeds "
 "given limit"
@@ -3575,159 +3616,159 @@
 "Verhindere die Erkennung von Umbennungen und Kopien, wenn die Anzahl der "
 "Ziele für Umbennungen und Kopien das gegebene Limit überschreitet"
 
-#: diff.c:5441
+#: diff.c:5446
 msgid "Diff algorithm options"
 msgstr "Diff Algorithmus-Optionen"
 
-#: diff.c:5443
+#: diff.c:5448
 msgid "produce the smallest possible diff"
 msgstr "Erzeuge die kleinstmöglichen Änderungen"
 
-#: diff.c:5446
+#: diff.c:5451
 msgid "ignore whitespace when comparing lines"
 msgstr "Whitespace-Änderungen beim Vergleich von Zeilen ignorieren"
 
-#: diff.c:5449
+#: diff.c:5454
 msgid "ignore changes in amount of whitespace"
 msgstr "Änderungen bei der Anzahl von Whitespace ignorieren"
 
-#: diff.c:5452
+#: diff.c:5457
 msgid "ignore changes in whitespace at EOL"
 msgstr "Whitespace-Änderungen am Zeilenende ignorieren"
 
-#: diff.c:5455
+#: diff.c:5460
 msgid "ignore carrier-return at the end of line"
 msgstr "Ignoriere den Zeilenumbruch am Ende der Zeile"
 
-#: diff.c:5458
+#: diff.c:5463
 msgid "ignore changes whose lines are all blank"
 msgstr "Ignoriere Änderungen in leeren Zeilen"
 
-#: diff.c:5461
+#: diff.c:5466
 msgid "heuristic to shift diff hunk boundaries for easy reading"
 msgstr ""
 "Heuristik, um Grenzen der Änderungsblöcke für bessere Lesbarkeit zu "
 "verschieben"
 
-#: diff.c:5464
+#: diff.c:5469
 msgid "generate diff using the \"patience diff\" algorithm"
 msgstr "Erzeuge Änderungen durch Nutzung des Algorithmus \"Patience Diff\""
 
-#: diff.c:5468
+#: diff.c:5473
 msgid "generate diff using the \"histogram diff\" algorithm"
 msgstr "Erzeuge Änderungen durch Nutzung des Algorithmus \"Histogram Diff\""
 
-#: diff.c:5470
+#: diff.c:5475
 msgid "<algorithm>"
 msgstr "<Algorithmus>"
 
-#: diff.c:5471
+#: diff.c:5476
 msgid "choose a diff algorithm"
 msgstr "Ein Algorithmus für Änderungen wählen"
 
-#: diff.c:5473
+#: diff.c:5478
 msgid "<text>"
 msgstr "<Text>"
 
-#: diff.c:5474
+#: diff.c:5479
 msgid "generate diff using the \"anchored diff\" algorithm"
 msgstr "Erzeuge Änderungen durch Nutzung des Algorithmus \"Anchored Diff\""
 
-#: diff.c:5476 diff.c:5485 diff.c:5488
+#: diff.c:5481 diff.c:5490 diff.c:5493
 msgid "<mode>"
 msgstr "<Modus>"
 
-#: diff.c:5477
+#: diff.c:5482
 msgid "show word diff, using <mode> to delimit changed words"
 msgstr "Zeige Wort-Änderungen, nutze <Modus>, um Wörter abzugrenzen"
 
-#: diff.c:5479 diff.c:5482 diff.c:5527
+#: diff.c:5484 diff.c:5487 diff.c:5532
 msgid "<regex>"
 msgstr "<Regex>"
 
-#: diff.c:5480
+#: diff.c:5485
 msgid "use <regex> to decide what a word is"
 msgstr "Nutze <Regex>, um zu entscheiden, was ein Wort ist"
 
-#: diff.c:5483
+#: diff.c:5488
 msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
 msgstr "Entsprechend wie --word-diff=color --word-diff-regex=<Regex>"
 
-#: diff.c:5486
+#: diff.c:5491
 msgid "moved lines of code are colored differently"
 msgstr "Verschobene Codezeilen sind andersfarbig"
 
-#: diff.c:5489
+#: diff.c:5494
 msgid "how white spaces are ignored in --color-moved"
 msgstr "Wie Whitespaces in --color-moved ignoriert werden"
 
-#: diff.c:5492
+#: diff.c:5497
 msgid "Other diff options"
 msgstr "Andere Diff-Optionen"
 
-#: diff.c:5494
+#: diff.c:5499
 msgid "when run from subdir, exclude changes outside and show relative paths"
 msgstr ""
 "Wenn vom Unterverzeichnis aufgerufen, schließe Änderungen außerhalb aus und "
 "zeige relative Pfade an"
 
-#: diff.c:5498
+#: diff.c:5503
 msgid "treat all files as text"
 msgstr "alle Dateien als Text behandeln"
 
-#: diff.c:5500
+#: diff.c:5505
 msgid "swap two inputs, reverse the diff"
 msgstr "Vertausche die beiden Eingaben und drehe die Änderungen um"
 
-#: diff.c:5502
+#: diff.c:5507
 msgid "exit with 1 if there were differences, 0 otherwise"
 msgstr ""
 "Beende mit Exit-Status 1, wenn Änderungen vorhanden sind, andernfalls mit 0"
 
-#: diff.c:5504
+#: diff.c:5509
 msgid "disable all output of the program"
 msgstr "Keine Ausgaben vom Programm"
 
-#: diff.c:5506
+#: diff.c:5511
 msgid "allow an external diff helper to be executed"
 msgstr "Erlaube die Ausführung eines externes Programms für Änderungen"
 
-#: diff.c:5508
+#: diff.c:5513
 msgid "run external text conversion filters when comparing binary files"
 msgstr ""
 "Führe externe Text-Konvertierungsfilter aus, wenn binäre Dateien vergleicht "
 "werden"
 
-#: diff.c:5510
+#: diff.c:5515
 msgid "<when>"
 msgstr "<wann>"
 
-#: diff.c:5511
+#: diff.c:5516
 msgid "ignore changes to submodules in the diff generation"
 msgstr ""
 "Änderungen in Submodulen während der Erstellung der Unterschiede ignorieren"
 
-#: diff.c:5514
+#: diff.c:5519
 msgid "<format>"
 msgstr "<Format>"
 
-#: diff.c:5515
+#: diff.c:5520
 msgid "specify how differences in submodules are shown"
 msgstr "Angeben, wie Unterschiede in Submodulen gezeigt werden"
 
-#: diff.c:5519
+#: diff.c:5524
 msgid "hide 'git add -N' entries from the index"
 msgstr "verstecke 'git add -N' Einträge vom Index"
 
-#: diff.c:5522
+#: diff.c:5527
 msgid "treat 'git add -N' entries as real in the index"
 msgstr "Behandle 'git add -N' Einträge im Index als echt"
 
-#: diff.c:5524
+#: diff.c:5529
 msgid "<string>"
 msgstr "<Zeichenkette>"
 
-#: diff.c:5525
+#: diff.c:5530
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "string"
@@ -3735,7 +3776,7 @@
 "Suche nach Unterschieden, welche die Anzahl des Vorkommens der angegebenen "
 "Zeichenkette verändern"
 
-#: diff.c:5528
+#: diff.c:5533
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "regex"
@@ -3743,25 +3784,25 @@
 "Suche nach Unterschieden, welche die Anzahl des Vorkommens des angegebenen "
 "regulären Ausdrucks verändern"
 
-#: diff.c:5531
+#: diff.c:5536
 msgid "show all changes in the changeset with -S or -G"
 msgstr "zeige alle Änderungen im Changeset mit -S oder -G"
 
-#: diff.c:5534
+#: diff.c:5539
 msgid "treat <string> in -S as extended POSIX regular expression"
 msgstr ""
 "behandle <Zeichenkette> bei -S als erweiterten POSIX regulären Ausdruck"
 
-#: diff.c:5537
+#: diff.c:5542
 msgid "control the order in which files appear in the output"
 msgstr ""
 "kontrolliere die Reihenfolge, in der die Dateien in der Ausgabe erscheinen"
 
-#: diff.c:5538
+#: diff.c:5543
 msgid "<object-id>"
 msgstr "<Objekt-ID>"
 
-#: diff.c:5539
+#: diff.c:5544
 msgid ""
 "look for differences that change the number of occurrences of the specified "
 "object"
@@ -3769,33 +3810,33 @@
 "Suche nach Unterschieden, welche die Anzahl des Vorkommens des angegebenen "
 "Objektes verändern"
 
-#: diff.c:5541
+#: diff.c:5546
 msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
 msgstr "[(A|C|D|M|R|T|U|X|B)...[*]]"
 
-#: diff.c:5542
+#: diff.c:5547
 msgid "select files by diff type"
 msgstr "Wähle Dateien anhand der Art der Änderung"
 
-#: diff.c:5544
+#: diff.c:5549
 msgid "<file>"
 msgstr "<Datei>"
 
-#: diff.c:5545
+#: diff.c:5550
 msgid "Output to a specific file"
 msgstr "Ausgabe zu einer bestimmten Datei"
 
-#: diff.c:6200
+#: diff.c:6205
 msgid "inexact rename detection was skipped due to too many files."
 msgstr ""
 "Ungenaue Erkennung für Umbenennungen wurde aufgrund zu vieler Dateien\n"
 "übersprungen."
 
-#: diff.c:6203
+#: diff.c:6208
 msgid "only found copies from modified paths due to too many files."
 msgstr "nur Kopien von geänderten Pfaden, aufgrund zu vieler Dateien, gefunden"
 
-#: diff.c:6206
+#: diff.c:6211
 #, c-format
 msgid ""
 "you may want to set your %s variable to at least %d and retry the command."
@@ -3812,64 +3853,64 @@
 msgid "Performing inexact rename detection"
 msgstr "Führe Erkennung für ungenaue Umbenennung aus"
 
-#: dir.c:555
+#: dir.c:573
 #, c-format
 msgid "pathspec '%s' did not match any file(s) known to git"
 msgstr ""
 "Pfadspezifikation '%s' stimmt mit keinen git-bekannten Dateien überein."
 
-#: dir.c:695 dir.c:724 dir.c:737
+#: dir.c:713 dir.c:742 dir.c:755
 #, c-format
 msgid "unrecognized pattern: '%s'"
 msgstr "Unbekanntes Muster: '%s'"
 
-#: dir.c:754 dir.c:768
+#: dir.c:772 dir.c:786
 #, c-format
 msgid "unrecognized negative pattern: '%s'"
 msgstr "Unbekanntes verneinendes Muster: '%s'"
 
-#: dir.c:786
+#: dir.c:804
 #, c-format
 msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
 msgstr ""
 "Ihre Datei für den partiellen Checkout hat eventuell Probleme:\n"
 "Muster '%s' wiederholt sich."
 
-#: dir.c:796
+#: dir.c:814
 msgid "disabling cone pattern matching"
 msgstr "Deaktiviere Cone-Muster-Übereinstimmung"
 
-#: dir.c:1173
+#: dir.c:1191
 #, c-format
 msgid "cannot use %s as an exclude file"
 msgstr "Kann %s nicht als exclude-Filter benutzen."
 
-#: dir.c:2275
+#: dir.c:2296
 #, c-format
 msgid "could not open directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht öffnen."
 
-#: dir.c:2575
+#: dir.c:2596
 msgid "failed to get kernel name and information"
 msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
 
-#: dir.c:2699
+#: dir.c:2720
 msgid "untracked cache is disabled on this system or location"
 msgstr ""
 "Cache für unversionierte Dateien ist auf diesem System oder\n"
 "für dieses Verzeichnis deaktiviert."
 
-#: dir.c:3481
+#: dir.c:3502
 #, c-format
 msgid "index file corrupt in repo %s"
 msgstr "Index-Datei in Repository %s beschädigt."
 
-#: dir.c:3526 dir.c:3531
+#: dir.c:3547 dir.c:3552
 #, c-format
 msgid "could not create directories for %s"
 msgstr "Konnte Verzeichnisse für '%s' nicht erstellen."
 
-#: dir.c:3560
+#: dir.c:3581
 #, c-format
 msgid "could not migrate git directory from '%s' to '%s'"
 msgstr "Konnte Git-Verzeichnis nicht von '%s' nach '%s' migrieren."
@@ -3879,11 +3920,11 @@
 msgid "hint: Waiting for your editor to close the file...%c"
 msgstr "Hinweis: Warte auf das Schließen der Datei durch Ihren Editor...%c"
 
-#: entry.c:178
+#: entry.c:177
 msgid "Filtering content"
 msgstr "Filtere Inhalt"
 
-#: entry.c:479
+#: entry.c:478
 #, c-format
 msgid "could not stat file '%s'"
 msgstr "Konnte Datei '%s' nicht lesen."
@@ -3903,227 +3944,245 @@
 msgid "too many args to run %s"
 msgstr "Zu viele Argumente angegeben, um %s auszuführen."
 
-#: fetch-pack.c:151
+#: fetch-pack.c:152
 msgid "git fetch-pack: expected shallow list"
 msgstr "git fetch-pack: erwartete shallow-Liste"
 
-#: fetch-pack.c:154
+#: fetch-pack.c:155
 msgid "git fetch-pack: expected a flush packet after shallow list"
 msgstr "git fetch-pack: erwartete ein Flush-Paket nach der shallow-Liste"
 
-#: fetch-pack.c:165
+#: fetch-pack.c:166
 msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
 msgstr "git fetch-pack: ACK/NAK erwartet, Flush-Paket bekommen"
 
-#: fetch-pack.c:185
+#: fetch-pack.c:186
 #, c-format
 msgid "git fetch-pack: expected ACK/NAK, got '%s'"
 msgstr "git fetch-pack: ACK/NAK erwartet, '%s' bekommen"
 
-#: fetch-pack.c:196
+#: fetch-pack.c:197
 msgid "unable to write to remote"
 msgstr "konnte nicht zum Remote schreiben"
 
-#: fetch-pack.c:258
+#: fetch-pack.c:259
 msgid "--stateless-rpc requires multi_ack_detailed"
 msgstr "--stateless-rpc benötigt multi_ack_detailed"
 
-#: fetch-pack.c:357 fetch-pack.c:1364
+#: fetch-pack.c:358 fetch-pack.c:1408
 #, c-format
 msgid "invalid shallow line: %s"
 msgstr "Ungültige shallow-Zeile: %s"
 
-#: fetch-pack.c:363 fetch-pack.c:1370
+#: fetch-pack.c:364 fetch-pack.c:1414
 #, c-format
 msgid "invalid unshallow line: %s"
 msgstr "Ungültige unshallow-Zeile: %s"
 
-#: fetch-pack.c:365 fetch-pack.c:1372
+#: fetch-pack.c:366 fetch-pack.c:1416
 #, c-format
 msgid "object not found: %s"
 msgstr "Objekt nicht gefunden: %s"
 
-#: fetch-pack.c:368 fetch-pack.c:1375
+#: fetch-pack.c:369 fetch-pack.c:1419
 #, c-format
 msgid "error in object: %s"
 msgstr "Fehler in Objekt: %s"
 
-#: fetch-pack.c:370 fetch-pack.c:1377
+#: fetch-pack.c:371 fetch-pack.c:1421
 #, c-format
 msgid "no shallow found: %s"
 msgstr "Kein shallow-Objekt gefunden: %s"
 
-#: fetch-pack.c:373 fetch-pack.c:1381
+#: fetch-pack.c:374 fetch-pack.c:1425
 #, c-format
 msgid "expected shallow/unshallow, got %s"
 msgstr "shallow/unshallow erwartet, %s bekommen"
 
-#: fetch-pack.c:415
+#: fetch-pack.c:416
 #, c-format
 msgid "got %s %d %s"
 msgstr "%s %d %s bekommen"
 
-#: fetch-pack.c:432
+#: fetch-pack.c:433
 #, c-format
 msgid "invalid commit %s"
 msgstr "Ungültiger Commit %s"
 
-#: fetch-pack.c:463
+#: fetch-pack.c:464
 msgid "giving up"
 msgstr "Gebe auf"
 
-#: fetch-pack.c:476 progress.c:336
+#: fetch-pack.c:477 progress.c:336
 msgid "done"
 msgstr "Fertig"
 
-#: fetch-pack.c:488
+#: fetch-pack.c:489
 #, c-format
 msgid "got %s (%d) %s"
 msgstr "%s (%d) %s bekommen"
 
-#: fetch-pack.c:534
+#: fetch-pack.c:535
 #, c-format
 msgid "Marking %s as complete"
 msgstr "Markiere %s als vollständig"
 
-#: fetch-pack.c:755
+#: fetch-pack.c:756
 #, c-format
 msgid "already have %s (%s)"
 msgstr "habe %s (%s) bereits"
 
-#: fetch-pack.c:819
+#: fetch-pack.c:821
 msgid "fetch-pack: unable to fork off sideband demultiplexer"
 msgstr "fetch-pack: Fehler beim Starten des sideband demultiplexer"
 
-#: fetch-pack.c:827
+#: fetch-pack.c:829
 msgid "protocol error: bad pack header"
 msgstr "Protokollfehler: ungültiger Pack-Header"
 
-#: fetch-pack.c:901
+#: fetch-pack.c:910
 #, c-format
 msgid "fetch-pack: unable to fork off %s"
 msgstr "fetch-pack: konnte %s nicht starten"
 
-#: fetch-pack.c:917
+#: fetch-pack.c:927
 #, c-format
 msgid "%s failed"
 msgstr "%s fehlgeschlagen"
 
-#: fetch-pack.c:919
+#: fetch-pack.c:929
 msgid "error in sideband demultiplexer"
 msgstr "Fehler in sideband demultiplexer"
 
-#: fetch-pack.c:966
+#: fetch-pack.c:976
 #, c-format
 msgid "Server version is %.*s"
 msgstr "Server-Version ist %.*s"
 
-#: fetch-pack.c:971 fetch-pack.c:977 fetch-pack.c:980 fetch-pack.c:986
-#: fetch-pack.c:990 fetch-pack.c:994 fetch-pack.c:998 fetch-pack.c:1002
-#: fetch-pack.c:1006 fetch-pack.c:1010 fetch-pack.c:1014 fetch-pack.c:1018
-#: fetch-pack.c:1024 fetch-pack.c:1030 fetch-pack.c:1035 fetch-pack.c:1040
+#: fetch-pack.c:981 fetch-pack.c:987 fetch-pack.c:990 fetch-pack.c:996
+#: fetch-pack.c:1000 fetch-pack.c:1004 fetch-pack.c:1008 fetch-pack.c:1012
+#: fetch-pack.c:1016 fetch-pack.c:1020 fetch-pack.c:1024 fetch-pack.c:1028
+#: fetch-pack.c:1034 fetch-pack.c:1040 fetch-pack.c:1045 fetch-pack.c:1050
 #, c-format
 msgid "Server supports %s"
 msgstr "Server unterstützt %s"
 
-#: fetch-pack.c:973
+#: fetch-pack.c:983
 msgid "Server does not support shallow clients"
 msgstr "Server unterstützt keine shallow-Clients"
 
-#: fetch-pack.c:1033
+#: fetch-pack.c:1043
 msgid "Server does not support --shallow-since"
 msgstr "Server unterstützt kein --shallow-since"
 
-#: fetch-pack.c:1038
+#: fetch-pack.c:1048
 msgid "Server does not support --shallow-exclude"
 msgstr "Server unterstützt kein --shallow-exclude"
 
-#: fetch-pack.c:1042
+#: fetch-pack.c:1052
 msgid "Server does not support --deepen"
 msgstr "Server unterstützt kein --deepen"
 
-#: fetch-pack.c:1059
+#: fetch-pack.c:1054
+msgid "Server does not support this repository's object format"
+msgstr "Server unterstützt das Objekt-Format dieses Repositories nicht"
+
+#: fetch-pack.c:1071
 msgid "no common commits"
 msgstr "keine gemeinsamen Commits"
 
-#: fetch-pack.c:1071 fetch-pack.c:1563
+#: fetch-pack.c:1083 fetch-pack.c:1639
 msgid "git fetch-pack: fetch failed."
 msgstr "git fetch-pack: Abholen fehlgeschlagen."
 
 #: fetch-pack.c:1211
-msgid "Server does not support shallow requests"
-msgstr "Server unterstützt keine shallow-Anfragen."
+#, c-format
+msgid "mismatched algorithms: client %s; server %s"
+msgstr "Algorithmen stimmen nicht überein: Client %s; Server %s"
 
-#: fetch-pack.c:1218
+#: fetch-pack.c:1215
+#, c-format
+msgid "the server does not support algorithm '%s'"
+msgstr "der Server unterstützt Algorithmus '%s' nicht"
+
+#: fetch-pack.c:1235
+msgid "Server does not support shallow requests"
+msgstr "Server unterstützt keine shallow-Anfragen"
+
+#: fetch-pack.c:1242
 msgid "Server supports filter"
 msgstr "Server unterstützt Filter"
 
-#: fetch-pack.c:1242
+#: fetch-pack.c:1286
 msgid "unable to write request to remote"
 msgstr "konnte Anfrage nicht zum Remote schreiben"
 
-#: fetch-pack.c:1260
+#: fetch-pack.c:1304
 #, c-format
 msgid "error reading section header '%s'"
 msgstr "Fehler beim Lesen von Sektionskopf '%s'."
 
-#: fetch-pack.c:1266
+#: fetch-pack.c:1310
 #, c-format
 msgid "expected '%s', received '%s'"
 msgstr "'%s' erwartet, '%s' empfangen"
 
-#: fetch-pack.c:1327
+#: fetch-pack.c:1371
 #, c-format
 msgid "unexpected acknowledgment line: '%s'"
 msgstr "Unerwartete Acknowledgment-Zeile: '%s'"
 
-#: fetch-pack.c:1332
+#: fetch-pack.c:1376
 #, c-format
 msgid "error processing acks: %d"
 msgstr "Fehler beim Verarbeiten von ACKS: %d"
 
-#: fetch-pack.c:1342
+#: fetch-pack.c:1386
 msgid "expected packfile to be sent after 'ready'"
 msgstr "Erwartete Versand einer Packdatei nach 'ready'."
 
-#: fetch-pack.c:1344
+#: fetch-pack.c:1388
 msgid "expected no other sections to be sent after no 'ready'"
 msgstr "Erwartete keinen Versand einer anderen Sektion ohne 'ready'."
 
-#: fetch-pack.c:1386
+#: fetch-pack.c:1430
 #, c-format
 msgid "error processing shallow info: %d"
 msgstr "Fehler beim Verarbeiten von Shallow-Informationen: %d"
 
-#: fetch-pack.c:1433
+#: fetch-pack.c:1477
 #, c-format
 msgid "expected wanted-ref, got '%s'"
 msgstr "wanted-ref erwartet, '%s' bekommen"
 
-#: fetch-pack.c:1438
+#: fetch-pack.c:1482
 #, c-format
 msgid "unexpected wanted-ref: '%s'"
-msgstr "Unerwartetes wanted-ref: '%s'"
+msgstr "unerwartetes wanted-ref: '%s'"
 
-#: fetch-pack.c:1443
+#: fetch-pack.c:1487
 #, c-format
 msgid "error processing wanted refs: %d"
 msgstr "Fehler beim Verarbeiten von wanted-refs: %d"
 
-#: fetch-pack.c:1789
+#: fetch-pack.c:1517
+msgid "git fetch-pack: expected response end packet"
+msgstr "git fetch-pack: Antwort-Endpaket erwartet"
+
+#: fetch-pack.c:1921
 msgid "no matching remote head"
 msgstr "kein übereinstimmender Remote-Branch"
 
-#: fetch-pack.c:1812 builtin/clone.c:692
+#: fetch-pack.c:1944 builtin/clone.c:692
 msgid "remote did not send all necessary objects"
-msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet."
+msgstr "Remote-Repository hat nicht alle erforderlichen Objekte gesendet"
 
-#: fetch-pack.c:1839
+#: fetch-pack.c:1971
 #, c-format
 msgid "no such remote ref %s"
 msgstr "keine solche Remote-Referenz %s"
 
-#: fetch-pack.c:1842
+#: fetch-pack.c:1974
 #, c-format
 msgid "Server does not allow request for unadvertised object %s"
 msgstr "Der Server lehnt Anfrage nach nicht angebotenem Objekt %s ab."
@@ -4159,7 +4218,7 @@
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte %s nicht lesen"
 
-#: grep.c:2145 setup.c:176 builtin/clone.c:411 builtin/diff.c:82
+#: grep.c:2145 setup.c:176 builtin/clone.c:411 builtin/diff.c:89
 #: builtin/rm.c:135
 #, c-format
 msgid "failed to stat '%s'"
@@ -4306,16 +4365,16 @@
 "\n"
 "Die ähnlichsten Befehle sind"
 
-#: help.c:653
+#: help.c:654
 msgid "git version [<options>]"
 msgstr "git version [<Optionen>]"
 
-#: help.c:708
+#: help.c:709
 #, c-format
 msgid "%s: %s - %s"
 msgstr "%s: %s - %s"
 
-#: help.c:712
+#: help.c:713
 msgid ""
 "\n"
 "Did you mean this?"
@@ -4412,7 +4471,13 @@
 
 #: list-objects-filter-options.c:226
 msgid "multiple filter-specs cannot be combined"
-msgstr "Mehrere filter-specs können nicht kombiniert werden."
+msgstr "mehrere filter-specs können nicht kombiniert werden"
+
+#: list-objects-filter-options.c:330
+msgid "unable to upgrade repository format to support partial clone"
+msgstr ""
+"Repository-Format konnte nicht erweitert werden, um partielles Klonen zu "
+"unterstützen"
 
 #: list-objects-filter.c:492
 #, c-format
@@ -4422,7 +4487,7 @@
 #: list-objects-filter.c:495
 #, c-format
 msgid "unable to parse sparse filter data in %s"
-msgstr "Konnte partielle Filter-Daten in %s nicht parsen."
+msgstr "konnte partielle Filter-Daten in %s nicht parsen"
 
 #: list-objects.c:127
 #, c-format
@@ -4792,7 +4857,7 @@
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
 
-#: merge-recursive.c:3101 git-submodule.sh:985
+#: merge-recursive.c:3101 git-submodule.sh:959
 msgid "submodule"
 msgstr "Submodul"
 
@@ -4921,7 +4986,7 @@
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
 #: merge.c:108 rerere.c:720 builtin/am.c:1878 builtin/am.c:1912
-#: builtin/checkout.c:559 builtin/checkout.c:824 builtin/clone.c:816
+#: builtin/checkout.c:559 builtin/checkout.c:822 builtin/clone.c:816
 #: builtin/stash.c:265
 msgid "unable to write new index file"
 msgstr "Konnte neue Index-Datei nicht schreiben."
@@ -5176,21 +5241,21 @@
 msgid "hash mismatch %s"
 msgstr "Hash stimmt nicht mit %s überein."
 
-#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2135
+#: pack-bitmap.c:815 pack-bitmap.c:821 builtin/pack-objects.c:2184
 #, c-format
 msgid "unable to get size of %s"
 msgstr "Konnte Größe von %s nicht bestimmen."
 
-#: packfile.c:629
+#: packfile.c:630
 msgid "offset before end of packfile (broken .idx?)"
 msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
 
-#: packfile.c:1899
+#: packfile.c:1900
 #, c-format
 msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
 
-#: packfile.c:1903
+#: packfile.c:1904
 #, c-format
 msgid "offset beyond end of pack index for %s (truncated index?)"
 msgstr "Offset hinter Ende des Pack-Index für %s (abgeschnittener Index?)"
@@ -5391,52 +5456,56 @@
 
 #: pkt-line.c:92
 msgid "unable to write flush packet"
-msgstr "Konnte Flush-Paket nicht schreiben."
+msgstr "konnte Flush-Paket nicht schreiben"
 
 #: pkt-line.c:99
 msgid "unable to write delim packet"
-msgstr "Konnte Delim-Paket nicht schreiben."
+msgstr "konnte Delim-Paket nicht schreiben"
 
 #: pkt-line.c:106
+msgid "unable to write stateless separator packet"
+msgstr "konnte zustandsloses Separator-Paket nicht schreiben"
+
+#: pkt-line.c:113
 msgid "flush packet write failed"
 msgstr "Flush beim Schreiben des Pakets fehlgeschlagen."
 
-#: pkt-line.c:146 pkt-line.c:232
+#: pkt-line.c:153 pkt-line.c:239
 msgid "protocol error: impossibly long line"
 msgstr "Protokollfehler: unmöglich lange Zeile"
 
-#: pkt-line.c:162 pkt-line.c:164
+#: pkt-line.c:169 pkt-line.c:171
 msgid "packet write with format failed"
 msgstr "Schreiben des Pakets mit Format fehlgeschlagen."
 
-#: pkt-line.c:196
+#: pkt-line.c:203
 msgid "packet write failed - data exceeds max packet size"
 msgstr ""
 "Schreiben des Pakets fehlgeschlagen - Daten überschreiten maximale Paketgröße"
 
-#: pkt-line.c:203 pkt-line.c:210
+#: pkt-line.c:210 pkt-line.c:217
 msgid "packet write failed"
 msgstr "Schreiben des Pakets fehlgeschlagen."
 
-#: pkt-line.c:295
+#: pkt-line.c:302
 msgid "read error"
 msgstr "Lesefehler"
 
-#: pkt-line.c:303
+#: pkt-line.c:310
 msgid "the remote end hung up unexpectedly"
 msgstr "Die Gegenseite hat unerwartet abgebrochen."
 
-#: pkt-line.c:331
+#: pkt-line.c:338
 #, c-format
 msgid "protocol error: bad line length character: %.4s"
 msgstr "Protokollfehler: ungültiges Zeichen für Zeilenlänge: %.4s"
 
-#: pkt-line.c:341 pkt-line.c:346
+#: pkt-line.c:352 pkt-line.c:357
 #, c-format
 msgid "protocol error: bad line length %d"
 msgstr "Protokollfehler: ungültige Zeilenlänge %d"
 
-#: pkt-line.c:362
+#: pkt-line.c:373
 #, c-format
 msgid "remote error: %s"
 msgstr "Fehler am anderen Ende: %s"
@@ -5617,7 +5686,7 @@
 
 #: read-cache.c:1983 read-cache.c:2271 rerere.c:565 rerere.c:599 rerere.c:1111
 #: submodule.c:1619 builtin/add.c:532 builtin/check-ignore.c:181
-#: builtin/checkout.c:488 builtin/checkout.c:676 builtin/clean.c:961
+#: builtin/checkout.c:488 builtin/checkout.c:674 builtin/clean.c:991
 #: builtin/commit.c:364 builtin/diff-tree.c:121 builtin/grep.c:507
 #: builtin/mv.c:145 builtin/reset.c:247 builtin/rm.c:290
 #: builtin/submodule--helper.c:332
@@ -5674,7 +5743,7 @@
 msgid "broken index, expect %s in %s, got %s"
 msgstr "Fehlerhafter Index. Erwartete %s in %s, erhielt %s."
 
-#: read-cache.c:3026 strbuf.c:1176 wrapper.c:622 builtin/merge.c:1130
+#: read-cache.c:3026 strbuf.c:1171 wrapper.c:630 builtin/merge.c:1130
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen."
@@ -5860,7 +5929,7 @@
 msgid "could not read '%s'."
 msgstr "Konnte '%s' nicht lesen."
 
-#: ref-filter.c:42 wt-status.c:1936
+#: ref-filter.c:42 wt-status.c:1977
 msgid "gone"
 msgstr "entfernt"
 
@@ -6085,7 +6154,7 @@
 msgid "ignoring ref with broken name %s"
 msgstr "Ignoriere Referenz mit fehlerhaftem Namen %s"
 
-#: ref-filter.c:2095 refs.c:625
+#: ref-filter.c:2095 refs.c:657
 #, c-format
 msgid "ignoring broken ref %s"
 msgstr "Ignoriere fehlerhafte Referenz %s"
@@ -6098,137 +6167,151 @@
 #: ref-filter.c:2495
 #, c-format
 msgid "option `%s' is incompatible with --merged"
-msgstr "Die Option `%s' ist inkompatibel mit --merged."
+msgstr "die Option `%s' ist inkompatibel mit --merged"
 
 #: ref-filter.c:2498
 #, c-format
 msgid "option `%s' is incompatible with --no-merged"
-msgstr "Die Option `%s' ist inkompatibel mit --no-merged."
+msgstr "die Option `%s' ist inkompatibel mit --no-merged"
 
 #: ref-filter.c:2508
 #, c-format
 msgid "malformed object name %s"
-msgstr "Missgebildeter Objektname %s"
+msgstr "missgebildeter Objektname %s"
 
 #: ref-filter.c:2513
 #, c-format
 msgid "option `%s' must point to a commit"
-msgstr "Die Option `%s' muss auf einen Commit zeigen."
+msgstr "die Option `%s' muss auf einen Commit zeigen"
 
-#: refs.c:262
+#: refs.c:264
 #, c-format
 msgid "%s does not point to a valid object!"
 msgstr "%s zeigt auf kein gültiges Objekt!"
 
-#: refs.c:623
+#: refs.c:572
+#, c-format
+msgid "could not retrieve `%s`"
+msgstr "konnte `%s` nicht abrufen"
+
+#: refs.c:579
+#, c-format
+msgid "invalid branch name: %s = %s"
+msgstr "ungültiger Branchname: %s = %s"
+
+#: refs.c:655
 #, c-format
 msgid "ignoring dangling symref %s"
 msgstr "Ignoriere unreferenzierte symbolische Referenz %s"
 
-#: refs.c:760
+#: refs.c:792
 #, c-format
 msgid "could not open '%s' for writing: %s"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen: %s"
 
-#: refs.c:770 refs.c:821
+#: refs.c:802 refs.c:853
 #, c-format
 msgid "could not read ref '%s'"
 msgstr "Konnte Referenz '%s' nicht lesen."
 
-#: refs.c:776
+#: refs.c:808
 #, c-format
 msgid "ref '%s' already exists"
 msgstr "Referenz '%s' existiert bereits."
 
-#: refs.c:781
+#: refs.c:813
 #, c-format
 msgid "unexpected object ID when writing '%s'"
 msgstr "Unerwartete Objekt-ID beim Schreiben von '%s'."
 
-#: refs.c:789 sequencer.c:408 sequencer.c:2721 sequencer.c:2925
-#: sequencer.c:2939 sequencer.c:3195 sequencer.c:5159 strbuf.c:1173
-#: wrapper.c:620
+#: refs.c:821 sequencer.c:408 sequencer.c:2721 sequencer.c:2925
+#: sequencer.c:2939 sequencer.c:3195 sequencer.c:5159 strbuf.c:1168
+#: wrapper.c:628
 #, c-format
 msgid "could not write to '%s'"
 msgstr "Konnte nicht nach '%s' schreiben."
 
-#: refs.c:816 strbuf.c:1171 wrapper.c:188 wrapper.c:358 builtin/am.c:719
+#: refs.c:848 strbuf.c:1166 wrapper.c:196 wrapper.c:366 builtin/am.c:719
 #: builtin/rebase.c:852
 #, c-format
 msgid "could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: refs.c:823
+#: refs.c:855
 #, c-format
 msgid "unexpected object ID when deleting '%s'"
 msgstr "Unerwartete Objekt-ID beim Löschen von '%s'."
 
-#: refs.c:954
+#: refs.c:986
 #, c-format
 msgid "log for ref %s has gap after %s"
 msgstr "Log für Referenz %s hat eine Lücke nach %s."
 
-#: refs.c:960
+#: refs.c:992
 #, c-format
 msgid "log for ref %s unexpectedly ended on %s"
 msgstr "Log für Referenz %s unerwartet bei %s beendet."
 
-#: refs.c:1019
+#: refs.c:1051
 #, c-format
 msgid "log for %s is empty"
 msgstr "Log für %s ist leer."
 
-#: refs.c:1111
+#: refs.c:1143
 #, c-format
 msgid "refusing to update ref with bad name '%s'"
-msgstr "Verweigere Aktualisierung einer Referenz mit fehlerhaftem Namen '%s'."
+msgstr "verweigere Aktualisierung einer Referenz mit fehlerhaftem Namen '%s'"
 
-#: refs.c:1187
+#: refs.c:1219
 #, c-format
 msgid "update_ref failed for ref '%s': %s"
 msgstr "update_ref für Referenz '%s' fehlgeschlagen: %s"
 
-#: refs.c:1979
+#: refs.c:2011
 #, c-format
 msgid "multiple updates for ref '%s' not allowed"
-msgstr "Mehrere Aktualisierungen für Referenz '%s' nicht erlaubt."
+msgstr "mehrere Aktualisierungen für Referenz '%s' nicht erlaubt"
 
-#: refs.c:2011
+#: refs.c:2098
 msgid "ref updates forbidden inside quarantine environment"
 msgstr ""
 "Aktualisierungen von Referenzen ist innerhalb der Quarantäne-Umgebung "
-"verboten."
+"verboten"
 
-#: refs.c:2107 refs.c:2137
+#: refs.c:2109
+msgid "ref updates aborted by hook"
+msgstr "Aktualisierungen von Referenzen durch Hook abgebrochen"
+
+#: refs.c:2209 refs.c:2239
 #, c-format
 msgid "'%s' exists; cannot create '%s'"
 msgstr "'%s' existiert; kann '%s' nicht erstellen"
 
-#: refs.c:2113 refs.c:2148
+#: refs.c:2215 refs.c:2250
 #, c-format
 msgid "cannot process '%s' and '%s' at the same time"
-msgstr "Kann '%s' und '%s' nicht zur selben Zeit verarbeiten."
+msgstr "kann '%s' und '%s' nicht zur selben Zeit verarbeiten"
 
 #: refs/files-backend.c:1233
 #, c-format
 msgid "could not remove reference %s"
-msgstr "Konnte Referenz %s nicht löschen"
+msgstr "konnte Referenz %s nicht löschen"
 
 #: refs/files-backend.c:1247 refs/packed-backend.c:1541
 #: refs/packed-backend.c:1551
 #, c-format
 msgid "could not delete reference %s: %s"
-msgstr "Konnte Referenz %s nicht entfernen: %s"
+msgstr "konnte Referenz %s nicht entfernen: %s"
 
 #: refs/files-backend.c:1250 refs/packed-backend.c:1554
 #, c-format
 msgid "could not delete references: %s"
-msgstr "Konnte Referenzen nicht entfernen: %s"
+msgstr "konnte Referenzen nicht entfernen: %s"
 
 #: refspec.c:137
 #, c-format
 msgid "invalid refspec '%s'"
-msgstr "Ungültige Refspec '%s'"
+msgstr "ungültige Refspec '%s'"
 
 #: remote.c:355
 #, c-format
@@ -6501,7 +6584,7 @@
 "  (benutzen Sie \"git pull\", um Ihren Branch mit dem Remote-Branch "
 "zusammenzuführen)\n"
 
-#: remote.c:2233
+#: remote.c:2241
 #, c-format
 msgid "cannot parse expected object name '%s'"
 msgstr "Kann erwarteten Objektnamen '%s' nicht parsen."
@@ -6628,20 +6711,20 @@
 msgid "failed to find tree of %s"
 msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s."
 
-#: revision.c:2655
+#: revision.c:2661
 msgid "your current branch appears to be broken"
 msgstr "Ihr aktueller Branch scheint fehlerhaft zu sein."
 
-#: revision.c:2658
+#: revision.c:2664
 #, c-format
 msgid "your current branch '%s' does not have any commits yet"
 msgstr "Ihr aktueller Branch '%s' hat noch keine Commits."
 
-#: revision.c:2866
+#: revision.c:2873
 msgid "--first-parent is incompatible with --bisect"
 msgstr "Die Optionen --first-parent und --bisect sind inkompatibel."
 
-#: revision.c:2870
+#: revision.c:2877
 msgid "-L does not yet support diff formats besides -p and -s"
 msgstr "-L unterstützt noch keine anderen Diff-Formate außer -p und -s"
 
@@ -6682,12 +6765,17 @@
 msgid "failed to sign the push certificate"
 msgstr "Fehler beim Signieren des \"push\"-Zertifikates"
 
-#: send-pack.c:399
+#: send-pack.c:394
+msgid "the receiving end does not support this repository's hash algorithm"
+msgstr ""
+"die Gegenseite unterstützt nicht den Hash-Algorithmus dieses Repositories"
+
+#: send-pack.c:403
 msgid "the receiving end does not support --signed push"
 msgstr ""
 "die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
 
-#: send-pack.c:401
+#: send-pack.c:405
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
@@ -6695,11 +6783,11 @@
 "kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
 "Versand (\"--signed push\") unterstützt"
 
-#: send-pack.c:413
+#: send-pack.c:417
 msgid "the receiving end does not support --atomic push"
 msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
 
-#: send-pack.c:418
+#: send-pack.c:422
 msgid "the receiving end does not support push options"
 msgstr "die Gegenseite unterstützt keine Push-Optionen"
 
@@ -6821,7 +6909,7 @@
 msgid "unable to dequote value of '%s'"
 msgstr "Konnte Anführungszeichen von '%s' nicht entfernen."
 
-#: sequencer.c:785 wrapper.c:190 wrapper.c:360 builtin/am.c:710
+#: sequencer.c:785 wrapper.c:198 wrapper.c:368 builtin/am.c:710
 #: builtin/am.c:802 builtin/merge.c:1125 builtin/rebase.c:896
 #, c-format
 msgid "could not open '%s' for reading"
@@ -7672,84 +7760,84 @@
 msgid "this operation must be run in a work tree"
 msgstr "Diese Operation muss in einem Arbeitsverzeichnis ausgeführt werden."
 
-#: setup.c:569
+#: setup.c:604
 #, c-format
 msgid "Expected git repo version <= %d, found %d"
 msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
 
-#: setup.c:577
+#: setup.c:612
 msgid "unknown repository extensions found:"
 msgstr "Unbekannte Repository-Erweiterungen gefunden:"
 
-#: setup.c:596
+#: setup.c:631
 #, c-format
 msgid "error opening '%s'"
 msgstr "Fehler beim Öffnen von '%s'."
 
-#: setup.c:598
+#: setup.c:633
 #, c-format
 msgid "too large to be a .git file: '%s'"
 msgstr "Zu groß, um eine .git-Datei zu sein: '%s'"
 
-#: setup.c:600
+#: setup.c:635
 #, c-format
 msgid "error reading %s"
 msgstr "Fehler beim Lesen von '%s'."
 
-#: setup.c:602
+#: setup.c:637
 #, c-format
 msgid "invalid gitfile format: %s"
 msgstr "Ungültiges gitfile-Format: %s"
 
-#: setup.c:604
+#: setup.c:639
 #, c-format
 msgid "no path in gitfile: %s"
 msgstr "Kein Pfad in gitfile: %s"
 
-#: setup.c:606
+#: setup.c:641
 #, c-format
 msgid "not a git repository: %s"
 msgstr "Kein Git-Repository: %s"
 
-#: setup.c:708
+#: setup.c:743
 #, c-format
 msgid "'$%s' too big"
 msgstr "'$%s' zu groß"
 
-#: setup.c:722
+#: setup.c:757
 #, c-format
 msgid "not a git repository: '%s'"
 msgstr "Kein Git-Repository: '%s'"
 
-#: setup.c:751 setup.c:753 setup.c:784
+#: setup.c:786 setup.c:788 setup.c:819
 #, c-format
 msgid "cannot chdir to '%s'"
 msgstr "Kann nicht in Verzeichnis '%s' wechseln."
 
-#: setup.c:756 setup.c:812 setup.c:822 setup.c:861 setup.c:869
+#: setup.c:791 setup.c:847 setup.c:857 setup.c:896 setup.c:904
 msgid "cannot come back to cwd"
 msgstr "Kann nicht zum aktuellen Arbeitsverzeichnis zurückwechseln."
 
-#: setup.c:883
+#: setup.c:918
 #, c-format
 msgid "failed to stat '%*s%s%s'"
 msgstr "Konnte '%*s%s%s' nicht lesen."
 
-#: setup.c:1121
+#: setup.c:1156
 msgid "Unable to read current working directory"
 msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
 
-#: setup.c:1130 setup.c:1136
+#: setup.c:1165 setup.c:1171
 #, c-format
 msgid "cannot change to '%s'"
 msgstr "Kann nicht nach '%s' wechseln."
 
-#: setup.c:1141
+#: setup.c:1176
 #, c-format
 msgid "not a git repository (or any of the parent directories): %s"
 msgstr "Kein Git-Repository (oder irgendeines der Elternverzeichnisse): %s"
 
-#: setup.c:1147
+#: setup.c:1182
 #, c-format
 msgid ""
 "not a git repository (or any parent up to mount point %s)\n"
@@ -7759,7 +7847,7 @@
 "%s)\n"
 "Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
 
-#: setup.c:1258
+#: setup.c:1293
 #, c-format
 msgid ""
 "problem with core.sharedRepository filemode value (0%.3o).\n"
@@ -7768,15 +7856,15 @@
 "Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
 "Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
 
-#: setup.c:1304
+#: setup.c:1340
 msgid "open /dev/null or dup failed"
 msgstr "Öffnen von /dev/null oder dup fehlgeschlagen."
 
-#: setup.c:1319
+#: setup.c:1355
 msgid "fork failed"
 msgstr "fork fehlgeschlagen"
 
-#: setup.c:1324
+#: setup.c:1360
 msgid "setsid failed"
 msgstr "setsid fehlgeschlagen"
 
@@ -7964,7 +8052,7 @@
 msgid "confused by unstable object source data for %s"
 msgstr "Fehler wegen instabilen Objektquelldaten für %s"
 
-#: sha1-file.c:1906 builtin/pack-objects.c:1055
+#: sha1-file.c:1906 builtin/pack-objects.c:1085
 #, c-format
 msgid "failed utime() on %s"
 msgstr "Fehler beim Aufruf von utime() auf '%s'."
@@ -8145,43 +8233,43 @@
 msgstr "ungültiger Objektname '%.*s'."
 
 #. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:853
+#: strbuf.c:848
 #, c-format
 msgid "%u.%2.2u GiB"
 msgstr "%u.%2.2u GiB"
 
 #. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:855
+#: strbuf.c:850
 #, c-format
 msgid "%u.%2.2u GiB/s"
 msgstr "%u.%2.2u GiB/s"
 
 #. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:863
+#: strbuf.c:858
 #, c-format
 msgid "%u.%2.2u MiB"
 msgstr "%u.%2.2u MiB"
 
 #. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:865
+#: strbuf.c:860
 #, c-format
 msgid "%u.%2.2u MiB/s"
 msgstr "%u.%2.2u MiB/s"
 
 #. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:872
+#: strbuf.c:867
 #, c-format
 msgid "%u.%2.2u KiB"
 msgstr "%u.%2.2u KiB"
 
 #. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:874
+#: strbuf.c:869
 #, c-format
 msgid "%u.%2.2u KiB/s"
 msgstr "%u.%2.2u KiB/s"
 
 #. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:880
+#: strbuf.c:875
 #, c-format
 msgid "%u byte"
 msgid_plural "%u bytes"
@@ -8189,14 +8277,14 @@
 msgstr[1] "%u Bytes"
 
 #. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:882
+#: strbuf.c:877
 #, c-format
 msgid "%u byte/s"
 msgid_plural "%u bytes/s"
 msgstr[0] "%u Byte/s"
 msgstr[1] "%u Bytes/s"
 
-#: strbuf.c:1180
+#: strbuf.c:1175
 #, c-format
 msgid "could not edit '%s'"
 msgstr "Konnte '%s' nicht editieren."
@@ -8446,7 +8534,7 @@
 msgid "could not read from stdin"
 msgstr "konnte nicht von der Standard-Eingabe lesen"
 
-#: trailer.c:1011 wrapper.c:665
+#: trailer.c:1011 wrapper.c:673
 #, c-format
 msgid "could not stat %s"
 msgstr "Konnte '%s' nicht lesen"
@@ -8470,22 +8558,22 @@
 msgid "could not rename temporary file to %s"
 msgstr "konnte temporäre Datei nicht zu %s umbenennen"
 
-#: transport-helper.c:61 transport-helper.c:90
+#: transport-helper.c:62 transport-helper.c:91
 msgid "full write to remote helper failed"
 msgstr "Vollständiges Schreiben zu Remote-Helper fehlgeschlagen."
 
-#: transport-helper.c:144
+#: transport-helper.c:145
 #, c-format
 msgid "unable to find remote helper for '%s'"
 msgstr "Konnte Remote-Helper für '%s' nicht finden."
 
-#: transport-helper.c:160 transport-helper.c:571
+#: transport-helper.c:161 transport-helper.c:575
 msgid "can't dup helper output fd"
 msgstr ""
 "Konnte dup() auf Dateideskriptor für Ausgaben des Remote-Helpers nicht "
 "ausführen."
 
-#: transport-helper.c:211
+#: transport-helper.c:214
 #, c-format
 msgid ""
 "unknown mandatory capability %s; this remote helper probably needs newer "
@@ -8494,158 +8582,163 @@
 "Unbekannte erforderliche Fähigkeit %s; dieser Remote-Helper benötigt\n"
 "wahrscheinlich eine neuere Version von Git."
 
-#: transport-helper.c:217
+#: transport-helper.c:220
 msgid "this remote helper should implement refspec capability"
 msgstr "Dieser Remote-Helper sollte die \"refspec\"-Fähigkeit implementieren."
 
-#: transport-helper.c:284 transport-helper.c:425
+#: transport-helper.c:287 transport-helper.c:429
 #, c-format
 msgid "%s unexpectedly said: '%s'"
 msgstr "unerwartete Ausgabe von %s: '%s'"
 
-#: transport-helper.c:414
+#: transport-helper.c:417
 #, c-format
 msgid "%s also locked %s"
 msgstr "%s sperrte auch %s"
 
-#: transport-helper.c:493
+#: transport-helper.c:497
 msgid "couldn't run fast-import"
 msgstr "Konnte \"fast-import\" nicht ausführen."
 
-#: transport-helper.c:516
+#: transport-helper.c:520
 msgid "error while running fast-import"
 msgstr "Fehler beim Ausführen von 'fast-import'."
 
-#: transport-helper.c:545 transport-helper.c:1135
+#: transport-helper.c:549 transport-helper.c:1156
 #, c-format
 msgid "could not read ref %s"
 msgstr "Konnte Referenz %s nicht lesen."
 
-#: transport-helper.c:590
+#: transport-helper.c:594
 #, c-format
 msgid "unknown response to connect: %s"
 msgstr "Unbekannte Antwort auf 'connect': %s"
 
-#: transport-helper.c:612
+#: transport-helper.c:616
 msgid "setting remote service path not supported by protocol"
 msgstr ""
 "Setzen des Remote-Service Pfads wird von dem Protokoll nicht unterstützt."
 
-#: transport-helper.c:614
+#: transport-helper.c:618
 msgid "invalid remote service path"
 msgstr "Ungültiger Remote-Service Pfad."
 
-#: transport-helper.c:657 transport.c:1339
+#: transport-helper.c:661 transport.c:1347
 msgid "operation not supported by protocol"
 msgstr "Die Operation wird von dem Protokoll nicht unterstützt."
 
-#: transport-helper.c:660
+#: transport-helper.c:664
 #, c-format
 msgid "can't connect to subservice %s"
 msgstr "Kann keine Verbindung zu Subservice %s herstellen."
 
-#: transport-helper.c:736
+#: transport-helper.c:740
 #, c-format
 msgid "expected ok/error, helper said '%s'"
 msgstr "Erwartete ok/error, Remote-Helper gab '%s' aus."
 
-#: transport-helper.c:789
+#: transport-helper.c:793
 #, c-format
 msgid "helper reported unexpected status of %s"
 msgstr "Remote-Helper meldete unerwarteten Status von %s."
 
-#: transport-helper.c:850
+#: transport-helper.c:854
 #, c-format
 msgid "helper %s does not support dry-run"
 msgstr "Remote-Helper %s unterstützt kein Trockenlauf."
 
-#: transport-helper.c:853
+#: transport-helper.c:857
 #, c-format
 msgid "helper %s does not support --signed"
 msgstr "Remote-Helper %s unterstützt kein --signed."
 
-#: transport-helper.c:856
+#: transport-helper.c:860
 #, c-format
 msgid "helper %s does not support --signed=if-asked"
 msgstr "Remote-Helper %s unterstützt kein --signed=if-asked."
 
-#: transport-helper.c:861
+#: transport-helper.c:865
 #, c-format
 msgid "helper %s does not support --atomic"
 msgstr "Remote-Helper %s unterstützt kein --atomic."
 
-#: transport-helper.c:867
+#: transport-helper.c:871
 #, c-format
 msgid "helper %s does not support 'push-option'"
 msgstr "Remote-Helper %s unterstützt nicht 'push-option'."
 
-#: transport-helper.c:966
+#: transport-helper.c:970
 msgid "remote-helper doesn't support push; refspec needed"
 msgstr "Remote-Helper unterstützt kein Push; Refspec benötigt"
 
-#: transport-helper.c:971
+#: transport-helper.c:975
 #, c-format
 msgid "helper %s does not support 'force'"
 msgstr "Remote-Helper %s unterstützt kein 'force'."
 
-#: transport-helper.c:1018
+#: transport-helper.c:1022
 msgid "couldn't run fast-export"
 msgstr "Konnte \"fast-export\" nicht ausführen."
 
-#: transport-helper.c:1023
+#: transport-helper.c:1027
 msgid "error while running fast-export"
 msgstr "Fehler beim Ausführen von \"fast-export\"."
 
-#: transport-helper.c:1048
+#: transport-helper.c:1052
 #, c-format
 msgid ""
 "No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch such as 'master'.\n"
+"Perhaps you should specify a branch.\n"
 msgstr ""
 "Keine gemeinsamen Referenzen und nichts spezifiziert; keine Ausführung.\n"
-"Vielleicht sollten Sie einen Branch wie 'master' angeben.\n"
+"Vielleicht sollten Sie einen Branch angeben.\n"
 
-#: transport-helper.c:1121
+#: transport-helper.c:1133
+#, c-format
+msgid "unsupported object format '%s'"
+msgstr "nicht unterstütztes Objekt-Format '%s'"
+
+#: transport-helper.c:1142
 #, c-format
 msgid "malformed response in ref list: %s"
 msgstr "Ungültige Antwort in Referenzliste: %s"
 
-#: transport-helper.c:1273
+#: transport-helper.c:1294
 #, c-format
 msgid "read(%s) failed"
 msgstr "Lesen von %s fehlgeschlagen."
 
-#: transport-helper.c:1300
+#: transport-helper.c:1321
 #, c-format
 msgid "write(%s) failed"
 msgstr "Schreiben von %s fehlgeschlagen."
 
-#: transport-helper.c:1349
+#: transport-helper.c:1370
 #, c-format
 msgid "%s thread failed"
 msgstr "Thread %s fehlgeschlagen."
 
-#: transport-helper.c:1353
+#: transport-helper.c:1374
 #, c-format
 msgid "%s thread failed to join: %s"
 msgstr "Fehler beim Beitreten zu Thread %s: %s"
 
-#: transport-helper.c:1372 transport-helper.c:1376
+#: transport-helper.c:1393 transport-helper.c:1397
 #, c-format
 msgid "can't start thread for copying data: %s"
 msgstr "Kann Thread zum Kopieren von Daten nicht starten: %s"
 
-#: transport-helper.c:1413
+#: transport-helper.c:1434
 #, c-format
 msgid "%s process failed to wait"
 msgstr "Fehler beim Warten von Prozess %s."
 
-#: transport-helper.c:1417
+#: transport-helper.c:1438
 #, c-format
 msgid "%s process failed"
 msgstr "Prozess %s fehlgeschlagen"
 
-#: transport-helper.c:1435 transport-helper.c:1444
+#: transport-helper.c:1456 transport-helper.c:1465
 msgid "can't start thread for copying data"
 msgstr "Kann Thread zum Kopieren von Daten nicht starten."
 
@@ -8659,33 +8752,33 @@
 msgid "could not read bundle '%s'"
 msgstr "Konnte Paket '%s' nicht lesen."
 
-#: transport.c:214
+#: transport.c:220
 #, c-format
 msgid "transport: invalid depth option '%s'"
 msgstr "transport: ungültige --depth Option '%s'"
 
-#: transport.c:266
+#: transport.c:272
 msgid "see protocol.version in 'git help config' for more details"
 msgstr "Siehe protocol.version in 'git help config' für weitere Informationen"
 
-#: transport.c:267
+#: transport.c:273
 msgid "server options require protocol version 2 or later"
 msgstr "Server-Optionen benötigen Protokoll-Version 2 oder höher"
 
-#: transport.c:632
+#: transport.c:631
 msgid "could not parse transport.color.* config"
 msgstr "Konnte transport.color.* Konfiguration nicht parsen."
 
-#: transport.c:705
+#: transport.c:704
 msgid "support for protocol v2 not implemented yet"
 msgstr "Unterstützung für Protokoll v2 noch nicht implementiert."
 
-#: transport.c:839
+#: transport.c:838
 #, c-format
 msgid "unknown value for config '%s': %s"
 msgstr "Unbekannter Wert für Konfiguration '%s': %s"
 
-#: transport.c:905
+#: transport.c:904
 #, c-format
 msgid "transport '%s' not allowed"
 msgstr "Übertragungsart '%s' nicht erlaubt."
@@ -8694,7 +8787,7 @@
 msgid "git-over-rsync is no longer supported"
 msgstr "git-over-rsync wird nicht länger unterstützt."
 
-#: transport.c:1052
+#: transport.c:1059
 #, c-format
 msgid ""
 "The following submodule paths contain changes that can\n"
@@ -8703,7 +8796,7 @@
 "Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
 "Remote-Repository gefunden wurden:\n"
 
-#: transport.c:1056
+#: transport.c:1063
 #, c-format
 msgid ""
 "\n"
@@ -8730,11 +8823,11 @@
 "zum Versenden zu einem Remote-Repository.\n"
 "\n"
 
-#: transport.c:1064
+#: transport.c:1071
 msgid "Aborting."
 msgstr "Abbruch."
 
-#: transport.c:1209
+#: transport.c:1216
 msgid "failed to push all needed submodules"
 msgstr "Fehler beim Versand aller erforderlichen Submodule."
 
@@ -9028,7 +9121,7 @@
 msgid "Updating index flags"
 msgstr "Aktualisiere Index-Markierungen"
 
-#: upload-pack.c:1337
+#: upload-pack.c:1415
 msgid "expected flush after fetch arguments"
 msgstr "erwartete Flush nach Abrufen der Argumente"
 
@@ -9065,47 +9158,47 @@
 msgid "Fetching objects"
 msgstr "Anfordern der Objekte"
 
-#: worktree.c:262 builtin/am.c:2098
+#: worktree.c:248 builtin/am.c:2098
 #, c-format
 msgid "failed to read '%s'"
 msgstr "Fehler beim Lesen von '%s'"
 
-#: worktree.c:309
+#: worktree.c:295
 #, c-format
 msgid "'%s' at main working tree is not the repository directory"
 msgstr "'%s' im Hauptarbeitsverzeichnis ist nicht das Repository-Verzeichnis."
 
-#: worktree.c:320
+#: worktree.c:306
 #, c-format
 msgid "'%s' file does not contain absolute path to the working tree location"
 msgstr "'%s' Datei enthält nicht den absoluten Pfad zum Arbeitsverzeichnis."
 
-#: worktree.c:332
+#: worktree.c:318
 #, c-format
 msgid "'%s' does not exist"
 msgstr "'%s' existiert nicht."
 
-#: worktree.c:338
+#: worktree.c:324
 #, c-format
 msgid "'%s' is not a .git file, error code %d"
 msgstr "'%s' ist keine .git-Datei, Fehlercode %d"
 
-#: worktree.c:347
+#: worktree.c:333
 #, c-format
 msgid "'%s' does not point back to '%s'"
 msgstr "'%s' zeigt nicht zurück auf '%s'"
 
-#: wrapper.c:186 wrapper.c:356
+#: wrapper.c:194 wrapper.c:364
 #, c-format
 msgid "could not open '%s' for reading and writing"
 msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
 
-#: wrapper.c:387 wrapper.c:588
+#: wrapper.c:395 wrapper.c:596
 #, c-format
 msgid "unable to access '%s'"
 msgstr "konnte nicht auf '%s' zugreifen"
 
-#: wrapper.c:596
+#: wrapper.c:604
 msgid "unable to get current working directory"
 msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
 
@@ -9526,39 +9619,46 @@
 "  (benutzen Sie \"git bisect reset\", um zum ursprünglichen Branch "
 "zurückzukehren)"
 
-#: wt-status.c:1692
+#: wt-status.c:1494
+#, c-format
+msgid "You are in a sparse checkout with %d%% of tracked files present."
+msgstr ""
+"Sie sind in einem partiellen Checkout mit %d%% vorhandenen versionierten "
+"Dateien."
+
+#: wt-status.c:1733
 msgid "On branch "
 msgstr "Auf Branch "
 
-#: wt-status.c:1699
+#: wt-status.c:1740
 msgid "interactive rebase in progress; onto "
 msgstr "interaktives Rebase im Gange; auf "
 
-#: wt-status.c:1701
+#: wt-status.c:1742
 msgid "rebase in progress; onto "
 msgstr "Rebase im Gange; auf "
 
-#: wt-status.c:1711
+#: wt-status.c:1752
 msgid "Not currently on any branch."
 msgstr "Im Moment auf keinem Branch."
 
-#: wt-status.c:1728
+#: wt-status.c:1769
 msgid "Initial commit"
 msgstr "Initialer Commit"
 
-#: wt-status.c:1729
+#: wt-status.c:1770
 msgid "No commits yet"
 msgstr "Noch keine Commits"
 
-#: wt-status.c:1743
+#: wt-status.c:1784
 msgid "Untracked files"
 msgstr "Unversionierte Dateien"
 
-#: wt-status.c:1745
+#: wt-status.c:1786
 msgid "Ignored files"
 msgstr "Ignorierte Dateien"
 
-#: wt-status.c:1749
+#: wt-status.c:1790
 #, c-format
 msgid ""
 "It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -9569,32 +9669,32 @@
 "'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
 "neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
 
-#: wt-status.c:1755
+#: wt-status.c:1796
 #, c-format
 msgid "Untracked files not listed%s"
 msgstr "Unversionierte Dateien nicht aufgelistet%s"
 
-#: wt-status.c:1757
+#: wt-status.c:1798
 msgid " (use -u option to show untracked files)"
 msgstr " (benutzen Sie die Option -u, um unversionierte Dateien anzuzeigen)"
 
-#: wt-status.c:1763
+#: wt-status.c:1804
 msgid "No changes"
 msgstr "Keine Änderungen"
 
-#: wt-status.c:1768
+#: wt-status.c:1809
 #, c-format
 msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 "keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
 "\"git commit -a\")\n"
 
-#: wt-status.c:1771
+#: wt-status.c:1812
 #, c-format
 msgid "no changes added to commit\n"
 msgstr "keine Änderungen zum Commit vorgemerkt\n"
 
-#: wt-status.c:1774
+#: wt-status.c:1815
 #, c-format
 msgid ""
 "nothing added to commit but untracked files present (use \"git add\" to "
@@ -9603,67 +9703,67 @@
 "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 "(benutzen Sie \"git add\" zum Versionieren)\n"
 
-#: wt-status.c:1777
+#: wt-status.c:1818
 #, c-format
 msgid "nothing added to commit but untracked files present\n"
 msgstr "nichts zum Commit vorgemerkt, aber es gibt unversionierte Dateien\n"
 
-#: wt-status.c:1780
+#: wt-status.c:1821
 #, c-format
 msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 "nichts zu committen (erstellen/kopieren Sie Dateien und benutzen\n"
 "Sie \"git add\" zum Versionieren)\n"
 
-#: wt-status.c:1783 wt-status.c:1788
+#: wt-status.c:1824 wt-status.c:1829
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nichts zu committen\n"
 
-#: wt-status.c:1786
+#: wt-status.c:1827
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
 "anzuzeigen)\n"
 
-#: wt-status.c:1790
+#: wt-status.c:1831
 #, c-format
 msgid "nothing to commit, working tree clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
-#: wt-status.c:1903
+#: wt-status.c:1944
 msgid "No commits yet on "
 msgstr "Noch keine Commits in "
 
-#: wt-status.c:1907
+#: wt-status.c:1948
 msgid "HEAD (no branch)"
 msgstr "HEAD (kein Branch)"
 
-#: wt-status.c:1938
+#: wt-status.c:1979
 msgid "different"
 msgstr "unterschiedlich"
 
-#: wt-status.c:1940 wt-status.c:1948
+#: wt-status.c:1981 wt-status.c:1989
 msgid "behind "
 msgstr "hinterher "
 
-#: wt-status.c:1943 wt-status.c:1946
+#: wt-status.c:1984 wt-status.c:1987
 msgid "ahead "
 msgstr "voraus "
 
 #. TRANSLATORS: the action is e.g. "pull with rebase"
-#: wt-status.c:2468
+#: wt-status.c:2509
 #, c-format
 msgid "cannot %s: You have unstaged changes."
 msgstr ""
 "%s nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
 
-#: wt-status.c:2474
+#: wt-status.c:2515
 msgid "additionally, your index contains uncommitted changes."
 msgstr "Zusätzlich enthält die Staging-Area nicht committete Änderungen."
 
-#: wt-status.c:2476
+#: wt-status.c:2517
 #, c-format
 msgid "cannot %s: Your index contains uncommitted changes."
 msgstr ""
@@ -9744,7 +9844,7 @@
 msgid "interactive picking"
 msgstr "interaktives Auswählen"
 
-#: builtin/add.c:326 builtin/checkout.c:1535 builtin/reset.c:308
+#: builtin/add.c:326 builtin/checkout.c:1533 builtin/reset.c:308
 msgid "select hunks interactively"
 msgstr "Blöcke interaktiv auswählen"
 
@@ -9882,14 +9982,14 @@
 msgid "--chmod param '%s' must be either -x or +x"
 msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
-#: builtin/add.c:501 builtin/checkout.c:1703 builtin/commit.c:351
+#: builtin/add.c:501 builtin/checkout.c:1701 builtin/commit.c:351
 #: builtin/reset.c:328 builtin/rm.c:272 builtin/stash.c:1506
 msgid "--pathspec-from-file is incompatible with pathspec arguments"
 msgstr ""
 "Die Option --pathspec-from-file ist inkompatibel mit\n"
 "Pfadspezifikation-Argumenten."
 
-#: builtin/add.c:508 builtin/checkout.c:1715 builtin/commit.c:357
+#: builtin/add.c:508 builtin/checkout.c:1713 builtin/commit.c:357
 #: builtin/reset.c:334 builtin/rm.c:278 builtin/stash.c:1512
 msgid "--pathspec-file-nul requires --pathspec-from-file"
 msgstr "Die Option --pathspec-file-nul benötigt --pathspec-from-file"
@@ -10162,7 +10262,7 @@
 msgid "allow fall back on 3way merging if needed"
 msgstr "erlaube, falls notwendig, das Zurückfallen auf einen 3-Wege-Merge"
 
-#: builtin/am.c:2218 builtin/init-db.c:541 builtin/prune-packed.c:16
+#: builtin/am.c:2218 builtin/init-db.c:559 builtin/prune-packed.c:16
 #: builtin/repack.c:306 builtin/stash.c:816
 msgid "be quiet"
 msgstr "weniger Ausgaben"
@@ -10217,7 +10317,7 @@
 
 #: builtin/am.c:2262 builtin/branch.c:659 builtin/for-each-ref.c:38
 #: builtin/replace.c:556 builtin/tag.c:438 builtin/verify-tag.c:38
-#: bugreport.c:131
+#: bugreport.c:137
 msgid "format"
 msgstr "Format"
 
@@ -10514,114 +10614,118 @@
 "Ungültiges Argument %s für 'git bisect terms'.\n"
 "Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
 
-#: builtin/bisect--helper.c:478
+#: builtin/bisect--helper.c:460 builtin/bisect--helper.c:473
+msgid "'' is not a valid term"
+msgstr "'' ist kein gültiger Begriff"
+
+#: builtin/bisect--helper.c:483
 #, c-format
 msgid "unrecognized option: '%s'"
 msgstr "Nicht erkannte Position: '%s'"
 
-#: builtin/bisect--helper.c:482
+#: builtin/bisect--helper.c:487
 #, c-format
 msgid "'%s' does not appear to be a valid revision"
 msgstr "'%s' scheint kein gültiger Commit zu sein."
 
-#: builtin/bisect--helper.c:514
+#: builtin/bisect--helper.c:519
 msgid "bad HEAD - I need a HEAD"
 msgstr "Ungültiger HEAD - HEAD wird benötigt."
 
-#: builtin/bisect--helper.c:529
+#: builtin/bisect--helper.c:534
 #, c-format
 msgid "checking out '%s' failed. Try 'git bisect start <valid-branch>'."
 msgstr ""
 "Auschecken von '%s' fehlgeschlagen. Versuchen Sie 'git bisect start "
 "<gültiger-Branch>'."
 
-#: builtin/bisect--helper.c:550
+#: builtin/bisect--helper.c:555
 msgid "won't bisect on cg-seek'ed tree"
 msgstr ""
 "binäre Suche auf einem durch 'cg-seek' geändertem Verzeichnis nicht möglich"
 
-#: builtin/bisect--helper.c:553
+#: builtin/bisect--helper.c:558
 msgid "bad HEAD - strange symbolic ref"
 msgstr "Ungültiger HEAD - merkwürdige symbolische Referenz."
 
-#: builtin/bisect--helper.c:577
+#: builtin/bisect--helper.c:582
 #, c-format
 msgid "invalid ref: '%s'"
 msgstr "Ungültige Referenz: '%s'"
 
-#: builtin/bisect--helper.c:633
+#: builtin/bisect--helper.c:638
 msgid "perform 'git bisect next'"
 msgstr "'git bisect next' ausführen"
 
-#: builtin/bisect--helper.c:635
+#: builtin/bisect--helper.c:640
 msgid "write the terms to .git/BISECT_TERMS"
 msgstr "die Begriffe nach .git/BISECT_TERMS schreiben"
 
-#: builtin/bisect--helper.c:637
+#: builtin/bisect--helper.c:642
 msgid "cleanup the bisection state"
 msgstr "den Zustand der binären Suche aufräumen"
 
-#: builtin/bisect--helper.c:639
+#: builtin/bisect--helper.c:644
 msgid "check for expected revs"
 msgstr "auf erwartete Commits prüfen"
 
-#: builtin/bisect--helper.c:641
+#: builtin/bisect--helper.c:646
 msgid "reset the bisection state"
 msgstr "den Zustand der binären Suche zurücksetzen"
 
-#: builtin/bisect--helper.c:643
+#: builtin/bisect--helper.c:648
 msgid "write out the bisection state in BISECT_LOG"
 msgstr "den Zustand der binären Suche nach BISECT_LOG schreiben"
 
-#: builtin/bisect--helper.c:645
+#: builtin/bisect--helper.c:650
 msgid "check and set terms in a bisection state"
 msgstr "Begriffe innerhalb einer binären Suche prüfen und setzen"
 
-#: builtin/bisect--helper.c:647
+#: builtin/bisect--helper.c:652
 msgid "check whether bad or good terms exist"
 msgstr "prüfen, ob Begriffe für gute und schlechte Commits existieren"
 
-#: builtin/bisect--helper.c:649
+#: builtin/bisect--helper.c:654
 msgid "print out the bisect terms"
 msgstr "die Begriffe für die binäre Suche ausgeben"
 
-#: builtin/bisect--helper.c:651
+#: builtin/bisect--helper.c:656
 msgid "start the bisect session"
 msgstr "Sitzung für binäre Suche starten"
 
-#: builtin/bisect--helper.c:653
+#: builtin/bisect--helper.c:658
 msgid "update BISECT_HEAD instead of checking out the current commit"
 msgstr "BISECT_HEAD aktualisieren, anstatt den aktuellen Commit auszuchecken"
 
-#: builtin/bisect--helper.c:655
+#: builtin/bisect--helper.c:660
 msgid "no log for BISECT_WRITE"
 msgstr "kein Log für BISECT_WRITE"
 
-#: builtin/bisect--helper.c:673
+#: builtin/bisect--helper.c:678
 msgid "--write-terms requires two arguments"
 msgstr "--write-terms benötigt zwei Argumente."
 
-#: builtin/bisect--helper.c:677
+#: builtin/bisect--helper.c:682
 msgid "--bisect-clean-state requires no arguments"
 msgstr "--bisect-clean-state erwartet keine Argumente."
 
-#: builtin/bisect--helper.c:684
+#: builtin/bisect--helper.c:689
 msgid "--bisect-reset requires either no argument or a commit"
 msgstr "--bisect-reset benötigt entweder kein Argument oder ein Commit."
 
-#: builtin/bisect--helper.c:688
+#: builtin/bisect--helper.c:693
 msgid "--bisect-write requires either 4 or 5 arguments"
 msgstr "--bisect-write benötigt entweder 4 oder 5 Argumente."
 
-#: builtin/bisect--helper.c:694
+#: builtin/bisect--helper.c:699
 msgid "--check-and-set-terms requires 3 arguments"
 msgstr "--check-and-set-terms benötigt 3 Argumente."
 
-#: builtin/bisect--helper.c:700
+#: builtin/bisect--helper.c:705
 msgid "--bisect-next-check requires 2 or 3 arguments"
 msgstr "--bisect-next-check benötigt 2 oder 3 Argumente."
 
-#: builtin/bisect--helper.c:706
+#: builtin/bisect--helper.c:711
 msgid "--bisect-terms requires 0 or 1 argument"
 msgstr "--bisect-terms benötigt 0 oder 1 Argument."
 
@@ -11239,19 +11343,19 @@
 msgid "git bundle unbundle <file> [<refname>...]"
 msgstr "git bundle unbundle <Datei> [<Referenzname>...]"
 
-#: builtin/bundle.c:66 builtin/pack-objects.c:3376
+#: builtin/bundle.c:66 builtin/pack-objects.c:3448
 msgid "do not show progress meter"
 msgstr "keine Fortschrittsanzeige anzeigen"
 
-#: builtin/bundle.c:68 builtin/pack-objects.c:3378
+#: builtin/bundle.c:68 builtin/pack-objects.c:3450
 msgid "show progress meter"
 msgstr "Fortschrittsanzeige anzeigen"
 
-#: builtin/bundle.c:70 builtin/pack-objects.c:3380
+#: builtin/bundle.c:70 builtin/pack-objects.c:3452
 msgid "show progress meter during object writing phase"
 msgstr "Forschrittsanzeige während des Schreibens von Objekten anzeigen"
 
-#: builtin/bundle.c:73 builtin/pack-objects.c:3383
+#: builtin/bundle.c:73 builtin/pack-objects.c:3455
 msgid "similar to --all-progress when progress meter is shown"
 msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
 
@@ -11291,11 +11395,11 @@
 
 #: builtin/cat-file.c:599
 msgid ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
-"filters]"
+"git cat-file (--batch[=<format>] | --batch-check[=<format>]) [--follow-"
+"symlinks] [--textconv | --filters]"
 msgstr ""
-"git cat-file (--batch | --batch-check) [--follow-symlinks] [--textconv | --"
-"filters]"
+"git cat-file (--batch[=<Format>] | --batch-check[=<Format>]) [--follow-"
+"symlinks] [--textconv | --filters]"
 
 #: builtin/cat-file.c:620
 msgid "only one batch option may be specified"
@@ -11329,7 +11433,7 @@
 msgid "for blob objects, run filters on object's content"
 msgstr "für Blob-Objekte, Filter auf Objekt-Inhalte ausführen"
 
-#: builtin/cat-file.c:648 git-submodule.sh:984
+#: builtin/cat-file.c:648 git-submodule.sh:958
 msgid "blob"
 msgstr "Blob"
 
@@ -11394,8 +11498,8 @@
 msgid "terminate input and output records by a NUL character"
 msgstr "Einträge von Ein- und Ausgabe mit NUL-Zeichen abschließen"
 
-#: builtin/check-ignore.c:21 builtin/checkout.c:1488 builtin/gc.c:537
-#: builtin/worktree.c:502
+#: builtin/check-ignore.c:21 builtin/checkout.c:1486 builtin/gc.c:537
+#: builtin/worktree.c:561
 msgid "suppress progress reporting"
 msgstr "Fortschrittsanzeige unterdrücken"
 
@@ -11490,7 +11594,7 @@
 #: builtin/checkout-index.c:178 builtin/column.c:31
 #: builtin/submodule--helper.c:1400 builtin/submodule--helper.c:1403
 #: builtin/submodule--helper.c:1411 builtin/submodule--helper.c:1909
-#: builtin/worktree.c:675
+#: builtin/worktree.c:754
 msgid "string"
 msgstr "Zeichenkette"
 
@@ -11607,11 +11711,11 @@
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:704
+#: builtin/checkout.c:702
 msgid "you need to resolve your current index first"
 msgstr "Sie müssen zuerst die Konflikte in Ihrem aktuellen Index auflösen."
 
-#: builtin/checkout.c:758
+#: builtin/checkout.c:756
 #, c-format
 msgid ""
 "cannot continue with staged changes in the following files:\n"
@@ -11620,50 +11724,50 @@
 "Kann nicht mit vorgemerkten Änderungen in folgenden Dateien fortsetzen:\n"
 "%s"
 
-#: builtin/checkout.c:861
+#: builtin/checkout.c:859
 #, c-format
 msgid "Can not do reflog for '%s': %s\n"
 msgstr "Kann \"reflog\" für '%s' nicht durchführen: %s\n"
 
-#: builtin/checkout.c:903
+#: builtin/checkout.c:901
 msgid "HEAD is now at"
 msgstr "HEAD ist jetzt bei"
 
-#: builtin/checkout.c:907 builtin/clone.c:720
+#: builtin/checkout.c:905 builtin/clone.c:720
 msgid "unable to update HEAD"
 msgstr "Konnte HEAD nicht aktualisieren."
 
-#: builtin/checkout.c:911
+#: builtin/checkout.c:909
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Branch '%s' neu\n"
 
-#: builtin/checkout.c:914
+#: builtin/checkout.c:912
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:918
+#: builtin/checkout.c:916
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Zu umgesetztem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:920 builtin/checkout.c:1344
+#: builtin/checkout.c:918 builtin/checkout.c:1342
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Zu neuem Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:922
+#: builtin/checkout.c:920
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Zu Branch '%s' gewechselt\n"
 
-#: builtin/checkout.c:973
+#: builtin/checkout.c:971
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
-#: builtin/checkout.c:979
+#: builtin/checkout.c:977
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -11686,7 +11790,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:998
+#: builtin/checkout.c:996
 #, c-format
 msgid ""
 "If you want to keep it by creating a new branch, this may be a good time\n"
@@ -11713,19 +11817,19 @@
 " git branch <neuer-Branchname> %s\n"
 "\n"
 
-#: builtin/checkout.c:1033
+#: builtin/checkout.c:1031
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:1037
+#: builtin/checkout.c:1035
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position von HEAD war"
 
-#: builtin/checkout.c:1077 builtin/checkout.c:1339
+#: builtin/checkout.c:1075 builtin/checkout.c:1337
 msgid "You are on a branch yet to be born"
 msgstr "Sie sind auf einem Branch, der noch nicht geboren ist"
 
-#: builtin/checkout.c:1152
+#: builtin/checkout.c:1150
 #, c-format
 msgid ""
 "'%s' could be both a local file and a tracking branch.\n"
@@ -11735,7 +11839,7 @@
 "Bitte benutzen Sie -- (und optional --no-guess), um diese\n"
 "eindeutig voneinander zu unterscheiden."
 
-#: builtin/checkout.c:1159
+#: builtin/checkout.c:1157
 msgid ""
 "If you meant to check out a remote tracking branch on, e.g. 'origin',\n"
 "you can do so by fully qualifying the name with the --track option:\n"
@@ -11758,51 +11862,51 @@
 "bevorzugen möchten, z.B. 'origin', können Sie die Einstellung\n"
 "checkout.defaultRemote=origin in Ihrer Konfiguration setzen."
 
-#: builtin/checkout.c:1169
+#: builtin/checkout.c:1167
 #, c-format
 msgid "'%s' matched multiple (%d) remote tracking branches"
 msgstr "'%s' entspricht mehreren (%d) Remote-Tracking-Branches"
 
-#: builtin/checkout.c:1235
+#: builtin/checkout.c:1233
 msgid "only one reference expected"
 msgstr "nur eine Referenz erwartet"
 
-#: builtin/checkout.c:1252
+#: builtin/checkout.c:1250
 #, c-format
 msgid "only one reference expected, %d given."
 msgstr "nur eine Referenz erwartet, %d gegeben."
 
-#: builtin/checkout.c:1298 builtin/worktree.c:283 builtin/worktree.c:451
+#: builtin/checkout.c:1296 builtin/worktree.c:342 builtin/worktree.c:510
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
-#: builtin/checkout.c:1311 builtin/checkout.c:1677
+#: builtin/checkout.c:1309 builtin/checkout.c:1675
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
 
-#: builtin/checkout.c:1358
+#: builtin/checkout.c:1356
 #, c-format
 msgid "a branch is expected, got tag '%s'"
 msgstr "Ein Branch wird erwartet, Tag '%s' bekommen"
 
-#: builtin/checkout.c:1360
+#: builtin/checkout.c:1358
 #, c-format
 msgid "a branch is expected, got remote branch '%s'"
 msgstr "Ein Branch wird erwartet, Remote-Branch '%s' bekommen"
 
-#: builtin/checkout.c:1361 builtin/checkout.c:1369
+#: builtin/checkout.c:1359 builtin/checkout.c:1367
 #, c-format
 msgid "a branch is expected, got '%s'"
 msgstr "Ein Branch wird erwartet, '%s' bekommen"
 
-#: builtin/checkout.c:1364
+#: builtin/checkout.c:1362
 #, c-format
 msgid "a branch is expected, got commit '%s'"
 msgstr "Ein Branch wird erwartet, Commit '%s' bekommen"
 
-#: builtin/checkout.c:1380
+#: builtin/checkout.c:1378
 msgid ""
 "cannot switch branch while merging\n"
 "Consider \"git merge --quit\" or \"git worktree add\"."
@@ -11810,7 +11914,7 @@
 "Der Branch kann nicht während eines Merges gewechselt werden.\n"
 "Ziehen Sie \"git merge --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1384
+#: builtin/checkout.c:1382
 msgid ""
 "cannot switch branch in the middle of an am session\n"
 "Consider \"git am --quit\" or \"git worktree add\"."
@@ -11819,7 +11923,7 @@
 "werden.\n"
 "Ziehen Sie \"git am --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1388
+#: builtin/checkout.c:1386
 msgid ""
 "cannot switch branch while rebasing\n"
 "Consider \"git rebase --quit\" or \"git worktree add\"."
@@ -11828,7 +11932,7 @@
 "werden.\n"
 "Ziehen Sie \"git rebase --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1392
+#: builtin/checkout.c:1390
 msgid ""
 "cannot switch branch while cherry-picking\n"
 "Consider \"git cherry-pick --quit\" or \"git worktree add\"."
@@ -11837,7 +11941,7 @@
 "gewechselt werden.\n"
 "Ziehen Sie \"git cherry-pick --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1396
+#: builtin/checkout.c:1394
 msgid ""
 "cannot switch branch while reverting\n"
 "Consider \"git revert --quit\" or \"git worktree add\"."
@@ -11846,147 +11950,147 @@
 "werden.\n"
 "Ziehen Sie \"git revert --quit\" oder \"git worktree add\" in Betracht."
 
-#: builtin/checkout.c:1400
+#: builtin/checkout.c:1398
 msgid "you are switching branch while bisecting"
 msgstr "Sie wechseln den Branch während einer binären Suche"
 
-#: builtin/checkout.c:1407
+#: builtin/checkout.c:1405
 msgid "paths cannot be used with switching branches"
 msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1410 builtin/checkout.c:1414 builtin/checkout.c:1418
+#: builtin/checkout.c:1408 builtin/checkout.c:1412 builtin/checkout.c:1416
 #, c-format
 msgid "'%s' cannot be used with switching branches"
 msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
 
-#: builtin/checkout.c:1422 builtin/checkout.c:1425 builtin/checkout.c:1428
-#: builtin/checkout.c:1433 builtin/checkout.c:1438
+#: builtin/checkout.c:1420 builtin/checkout.c:1423 builtin/checkout.c:1426
+#: builtin/checkout.c:1431 builtin/checkout.c:1436
 #, c-format
 msgid "'%s' cannot be used with '%s'"
 msgstr "'%s' kann nicht mit '%s' verwendet werden"
 
-#: builtin/checkout.c:1435
+#: builtin/checkout.c:1433
 #, c-format
 msgid "'%s' cannot take <start-point>"
 msgstr "'%s' kann nicht <Startpunkt> bekommen"
 
-#: builtin/checkout.c:1443
+#: builtin/checkout.c:1441
 #, c-format
 msgid "Cannot switch branch to a non-commit '%s'"
 msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
 
-#: builtin/checkout.c:1450
+#: builtin/checkout.c:1448
 msgid "missing branch or commit argument"
 msgstr "Branch- oder Commit-Argument fehlt"
 
-#: builtin/checkout.c:1492 builtin/clone.c:91 builtin/commit-graph.c:80
-#: builtin/commit-graph.c:164 builtin/fetch.c:168 builtin/merge.c:288
+#: builtin/checkout.c:1490 builtin/clone.c:91 builtin/commit-graph.c:82
+#: builtin/commit-graph.c:189 builtin/fetch.c:168 builtin/merge.c:288
 #: builtin/multi-pack-index.c:27 builtin/pull.c:119 builtin/push.c:561
 #: builtin/send-pack.c:173
 msgid "force progress reporting"
 msgstr "Fortschrittsanzeige erzwingen"
 
-#: builtin/checkout.c:1493
+#: builtin/checkout.c:1491
 msgid "perform a 3-way merge with the new branch"
 msgstr "einen 3-Wege-Merge mit dem neuen Branch ausführen"
 
-#: builtin/checkout.c:1494 builtin/log.c:1709 parse-options.h:322
+#: builtin/checkout.c:1492 builtin/log.c:1709 parse-options.h:322
 msgid "style"
 msgstr "Stil"
 
-#: builtin/checkout.c:1495
+#: builtin/checkout.c:1493
 msgid "conflict style (merge or diff3)"
 msgstr "Konfliktstil (merge oder diff3)"
 
-#: builtin/checkout.c:1507 builtin/worktree.c:499
+#: builtin/checkout.c:1505 builtin/worktree.c:558
 msgid "detach HEAD at named commit"
 msgstr "HEAD bei benanntem Commit loslösen"
 
-#: builtin/checkout.c:1508
+#: builtin/checkout.c:1506
 msgid "set upstream info for new branch"
 msgstr "Informationen zum Upstream-Branch für den neuen Branch setzen"
 
-#: builtin/checkout.c:1510
+#: builtin/checkout.c:1508
 msgid "force checkout (throw away local modifications)"
 msgstr "Auschecken erzwingen (verwirft lokale Änderungen)"
 
-#: builtin/checkout.c:1512
+#: builtin/checkout.c:1510
 msgid "new-branch"
 msgstr "neuer Branch"
 
-#: builtin/checkout.c:1512
+#: builtin/checkout.c:1510
 msgid "new unparented branch"
 msgstr "neuer Branch ohne Eltern-Commit"
 
-#: builtin/checkout.c:1514 builtin/merge.c:292
+#: builtin/checkout.c:1512 builtin/merge.c:292
 msgid "update ignored files (default)"
 msgstr "ignorierte Dateien aktualisieren (Standard)"
 
-#: builtin/checkout.c:1517
+#: builtin/checkout.c:1515
 msgid "do not check if another worktree is holding the given ref"
 msgstr ""
 "Prüfung, ob die Referenz bereits in einem anderen Arbeitsverzeichnis "
 "ausgecheckt wurde, deaktivieren"
 
-#: builtin/checkout.c:1530
+#: builtin/checkout.c:1528
 msgid "checkout our version for unmerged files"
 msgstr "unsere Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1533
+#: builtin/checkout.c:1531
 msgid "checkout their version for unmerged files"
 msgstr "ihre Variante für nicht zusammengeführte Dateien auschecken"
 
-#: builtin/checkout.c:1537
+#: builtin/checkout.c:1535
 msgid "do not limit pathspecs to sparse entries only"
 msgstr "keine Einschränkung bei Pfadspezifikationen zum partiellen Auschecken"
 
-#: builtin/checkout.c:1592
+#: builtin/checkout.c:1590
 #, c-format
 msgid "-%c, -%c and --orphan are mutually exclusive"
 msgstr "die Optionen -%c, -%c und --orphan schließen sich gegenseitig aus"
 
-#: builtin/checkout.c:1596
+#: builtin/checkout.c:1594
 msgid "-p and --overlay are mutually exclusive"
 msgstr "-p und --overlay schließen sich gegenseitig aus."
 
-#: builtin/checkout.c:1633
+#: builtin/checkout.c:1631
 msgid "--track needs a branch name"
 msgstr "Bei der Option --track muss ein Branchname angegeben werden."
 
-#: builtin/checkout.c:1638
+#: builtin/checkout.c:1636
 #, c-format
 msgid "missing branch name; try -%c"
 msgstr "kein Branchname; versuchen Sie -%c"
 
-#: builtin/checkout.c:1670
+#: builtin/checkout.c:1668
 #, c-format
 msgid "could not resolve %s"
 msgstr "Konnte %s nicht auflösen."
 
-#: builtin/checkout.c:1686
+#: builtin/checkout.c:1684
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1693
+#: builtin/checkout.c:1691
 #, c-format
 msgid "'%s' is not a commit and a branch '%s' cannot be created from it"
 msgstr ""
 "'%s' ist kein Commit und es kann kein Branch '%s' aus diesem erstellt werden."
 
-#: builtin/checkout.c:1697
+#: builtin/checkout.c:1695
 #, c-format
 msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout: --detach nimmt kein Pfad-Argument '%s'"
 
-#: builtin/checkout.c:1706
+#: builtin/checkout.c:1704
 msgid "--pathspec-from-file is incompatible with --detach"
 msgstr "Die Optionen --pathspec-from-file und --detach sind inkompatibel."
 
-#: builtin/checkout.c:1709 builtin/reset.c:325 builtin/stash.c:1503
+#: builtin/checkout.c:1707 builtin/reset.c:325 builtin/stash.c:1503
 msgid "--pathspec-from-file is incompatible with --patch"
 msgstr "Die Optionen --pathspec-from-file und --patch sind inkompatibel."
 
-#: builtin/checkout.c:1720
+#: builtin/checkout.c:1718
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -11994,69 +12098,70 @@
 "git checkout: --ours/--theirs, --force und --merge sind inkompatibel wenn\n"
 "Sie aus dem Index auschecken."
 
-#: builtin/checkout.c:1725
+#: builtin/checkout.c:1723
 msgid "you must specify path(s) to restore"
 msgstr "Sie müssen Pfad(e) zur Wiederherstellung angeben."
 
-#: builtin/checkout.c:1751 builtin/checkout.c:1753 builtin/checkout.c:1802
-#: builtin/checkout.c:1804 builtin/clone.c:121 builtin/remote.c:170
-#: builtin/remote.c:172 builtin/worktree.c:495 builtin/worktree.c:497
+#: builtin/checkout.c:1749 builtin/checkout.c:1751 builtin/checkout.c:1800
+#: builtin/checkout.c:1802 builtin/clone.c:121 builtin/remote.c:170
+#: builtin/remote.c:172 builtin/submodule--helper.c:2295 builtin/worktree.c:554
+#: builtin/worktree.c:556
 msgid "branch"
 msgstr "Branch"
 
-#: builtin/checkout.c:1752
+#: builtin/checkout.c:1750
 msgid "create and checkout a new branch"
 msgstr "einen neuen Branch erzeugen und auschecken"
 
-#: builtin/checkout.c:1754
+#: builtin/checkout.c:1752
 msgid "create/reset and checkout a branch"
 msgstr "einen Branch erstellen/umsetzen und auschecken"
 
-#: builtin/checkout.c:1755
+#: builtin/checkout.c:1753
 msgid "create reflog for new branch"
 msgstr "das Reflog für den neuen Branch erzeugen"
 
-#: builtin/checkout.c:1757
+#: builtin/checkout.c:1755
 msgid "second guess 'git checkout <no-such-branch>' (default)"
 msgstr "Zweite Vermutung 'git checkout <kein-solcher-Branch>' (Standard)"
 
-#: builtin/checkout.c:1758
+#: builtin/checkout.c:1756
 msgid "use overlay mode (default)"
 msgstr "benutze Overlay-Modus (Standard)"
 
-#: builtin/checkout.c:1803
+#: builtin/checkout.c:1801
 msgid "create and switch to a new branch"
 msgstr "einen neuen Branch erzeugen und dahin wechseln"
 
-#: builtin/checkout.c:1805
+#: builtin/checkout.c:1803
 msgid "create/reset and switch to a branch"
 msgstr "einen Branch erstellen/umsetzen und dahin wechseln"
 
-#: builtin/checkout.c:1807
+#: builtin/checkout.c:1805
 msgid "second guess 'git switch <no-such-branch>'"
 msgstr "Zweite Vermutung 'git switch <kein-solcher-Branch>'"
 
-#: builtin/checkout.c:1809
+#: builtin/checkout.c:1807
 msgid "throw away local modifications"
 msgstr "lokale Änderungen verwerfen"
 
-#: builtin/checkout.c:1843
+#: builtin/checkout.c:1841
 msgid "which tree-ish to checkout from"
 msgstr "Von welcher Commit-Referenz ausgecheckt werden soll"
 
-#: builtin/checkout.c:1845
+#: builtin/checkout.c:1843
 msgid "restore the index"
 msgstr "Index wiederherstellen"
 
-#: builtin/checkout.c:1847
+#: builtin/checkout.c:1845
 msgid "restore the working tree (default)"
 msgstr "das Arbeitsverzeichnis wiederherstellen (Standard)"
 
-#: builtin/checkout.c:1849
+#: builtin/checkout.c:1847
 msgid "ignore unmerged entries"
 msgstr "ignoriere nicht zusammengeführte Einträge"
 
-#: builtin/checkout.c:1850
+#: builtin/checkout.c:1848
 msgid "use overlay mode"
 msgstr "benutze Overlay-Modus"
 
@@ -12219,11 +12324,7 @@
 msgid "remove only ignored files"
 msgstr "nur ignorierte Dateien löschen"
 
-#: builtin/clean.c:931
-msgid "-x and -X cannot be used together"
-msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
-
-#: builtin/clean.c:935
+#: builtin/clean.c:929
 msgid ""
 "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
 "clean"
@@ -12231,7 +12332,7 @@
 "clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
 "\"clean\" verweigert"
 
-#: builtin/clean.c:938
+#: builtin/clean.c:932
 msgid ""
 "clean.requireForce defaults to true and neither -i, -n, nor -f given; "
 "refusing to clean"
@@ -12239,6 +12340,10 @@
 "clean.requireForce standardmäßig auf \"true\" gesetzt und weder -i, -n noch -"
 "f gegeben; \"clean\" verweigert"
 
+#: builtin/clean.c:944
+msgid "-x and -X cannot be used together"
+msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
+
 #: builtin/clone.c:45
 msgid "git clone [<options>] [--] <repo> [<dir>]"
 msgstr "git clone [<Optionen>] [--] <Repository> [<Verzeichnis>]"
@@ -12247,7 +12352,7 @@
 msgid "don't create a checkout"
 msgstr "kein Auschecken"
 
-#: builtin/clone.c:94 builtin/clone.c:96 builtin/init-db.c:536
+#: builtin/clone.c:94 builtin/clone.c:96 builtin/init-db.c:554
 msgid "create a bare repository"
 msgstr "ein Bare-Repository erstellen"
 
@@ -12279,11 +12384,11 @@
 msgid "number of submodules cloned in parallel"
 msgstr "Anzahl der parallel zu klonenden Submodule"
 
-#: builtin/clone.c:111 builtin/init-db.c:533
+#: builtin/clone.c:111 builtin/init-db.c:551
 msgid "template-directory"
 msgstr "Vorlagenverzeichnis"
 
-#: builtin/clone.c:112 builtin/init-db.c:534
+#: builtin/clone.c:112 builtin/init-db.c:552
 msgid "directory from which templates will be used"
 msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
 
@@ -12297,8 +12402,8 @@
 msgid "use --reference only while cloning"
 msgstr "--reference nur während des Klonens benutzen"
 
-#: builtin/clone.c:119 builtin/column.c:27 builtin/merge-file.c:46
-#: builtin/pack-objects.c:3442 builtin/repack.c:329
+#: builtin/clone.c:119 builtin/column.c:27 builtin/init-db.c:562
+#: builtin/merge-file.c:46 builtin/pack-objects.c:3514 builtin/repack.c:329
 msgid "name"
 msgstr "Name"
 
@@ -12324,7 +12429,7 @@
 msgstr ""
 "einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe erstellen"
 
-#: builtin/clone.c:127 builtin/fetch.c:171 builtin/pack-objects.c:3431
+#: builtin/clone.c:127 builtin/fetch.c:171 builtin/pack-objects.c:3503
 #: builtin/pull.c:211
 msgid "time"
 msgstr "Zeit"
@@ -12360,11 +12465,11 @@
 msgid "any cloned submodules will be shallow"
 msgstr "jedes geklonte Submodul mit unvollständiger Historie (shallow)"
 
-#: builtin/clone.c:137 builtin/init-db.c:542
+#: builtin/clone.c:137 builtin/init-db.c:560
 msgid "gitdir"
 msgstr ".git-Verzeichnis"
 
-#: builtin/clone.c:138 builtin/init-db.c:543
+#: builtin/clone.c:138 builtin/init-db.c:561
 msgid "separate git dir from working tree"
 msgstr "Git-Verzeichnis vom Arbeitsverzeichnis separieren"
 
@@ -12495,7 +12600,7 @@
 msgid "cannot unlink temporary alternates file"
 msgstr "Kann temporäre \"alternates\"-Datei nicht entfernen"
 
-#: builtin/clone.c:971 builtin/receive-pack.c:1972
+#: builtin/clone.c:971 builtin/receive-pack.c:1982
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
@@ -12512,48 +12617,48 @@
 msgid "--bare and --separate-git-dir are incompatible."
 msgstr "Die Optionen --bare und --separate-git-dir sind inkompatibel."
 
-#: builtin/clone.c:1004
+#: builtin/clone.c:1007
 #, c-format
 msgid "repository '%s' does not exist"
 msgstr "Repository '%s' existiert nicht."
 
-#: builtin/clone.c:1010 builtin/fetch.c:1789
+#: builtin/clone.c:1011 builtin/fetch.c:1794
 #, c-format
 msgid "depth %s is not a positive number"
 msgstr "Tiefe %s ist keine positive Zahl"
 
-#: builtin/clone.c:1020
+#: builtin/clone.c:1021
 #, c-format
 msgid "destination path '%s' already exists and is not an empty directory."
 msgstr "Zielpfad '%s' existiert bereits und ist kein leeres Verzeichnis."
 
-#: builtin/clone.c:1030
+#: builtin/clone.c:1033
 #, c-format
 msgid "working tree '%s' already exists."
 msgstr "Arbeitsverzeichnis '%s' existiert bereits."
 
-#: builtin/clone.c:1045 builtin/clone.c:1066 builtin/difftool.c:271
-#: builtin/log.c:1886 builtin/worktree.c:295 builtin/worktree.c:327
+#: builtin/clone.c:1048 builtin/clone.c:1069 builtin/difftool.c:271
+#: builtin/log.c:1886 builtin/worktree.c:354 builtin/worktree.c:386
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "Konnte führende Verzeichnisse von '%s' nicht erstellen."
 
-#: builtin/clone.c:1050
+#: builtin/clone.c:1053
 #, c-format
 msgid "could not create work tree dir '%s'"
 msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen"
 
-#: builtin/clone.c:1070
+#: builtin/clone.c:1073
 #, c-format
 msgid "Cloning into bare repository '%s'...\n"
 msgstr "Klone in Bare-Repository '%s' ...\n"
 
-#: builtin/clone.c:1072
+#: builtin/clone.c:1075
 #, c-format
 msgid "Cloning into '%s'...\n"
 msgstr "Klone nach '%s' ...\n"
 
-#: builtin/clone.c:1096
+#: builtin/clone.c:1099
 msgid ""
 "clone --recursive is not compatible with both --reference and --reference-if-"
 "able"
@@ -12561,45 +12666,45 @@
 "'clone --recursive' ist nicht kompatibel mit --reference und --reference-if-"
 "able"
 
-#: builtin/clone.c:1160
+#: builtin/clone.c:1164
 msgid "--depth is ignored in local clones; use file:// instead."
 msgstr ""
 "Die Option --depth wird in lokalen Klonen ignoriert; benutzen Sie "
 "stattdessen file://"
 
-#: builtin/clone.c:1162
+#: builtin/clone.c:1166
 msgid "--shallow-since is ignored in local clones; use file:// instead."
 msgstr ""
 "--shallow-since wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
 "file://"
 
-#: builtin/clone.c:1164
+#: builtin/clone.c:1168
 msgid "--shallow-exclude is ignored in local clones; use file:// instead."
 msgstr ""
 "--shallow-exclude wird in lokalen Klonen ignoriert; benutzen Sie stattdessen "
 "file://"
 
-#: builtin/clone.c:1166
+#: builtin/clone.c:1170
 msgid "--filter is ignored in local clones; use file:// instead."
 msgstr ""
 "--filter wird in lokalen Klonen ignoriert; benutzen Sie stattdessen file://"
 
-#: builtin/clone.c:1169
+#: builtin/clone.c:1173
 msgid "source repository is shallow, ignoring --local"
 msgstr ""
 "Quelle ist ein Repository mit unvollständiger Historie (shallow),\n"
 "ignoriere --local"
 
-#: builtin/clone.c:1174
+#: builtin/clone.c:1178
 msgid "--local is ignored"
 msgstr "--local wird ignoriert"
 
-#: builtin/clone.c:1249 builtin/clone.c:1257
+#: builtin/clone.c:1262 builtin/clone.c:1270
 #, c-format
 msgid "Remote branch %s not found in upstream %s"
 msgstr "Remote-Branch %s nicht im Upstream-Repository %s gefunden"
 
-#: builtin/clone.c:1260
+#: builtin/clone.c:1273
 msgid "You appear to have cloned an empty repository."
 msgstr "Sie scheinen ein leeres Repository geklont zu haben."
 
@@ -12635,14 +12740,14 @@
 msgid "--command must be the first argument"
 msgstr "Die Option --command muss an erster Stelle stehen."
 
-#: builtin/commit-graph.c:11 builtin/commit-graph.c:19
+#: builtin/commit-graph.c:13 builtin/commit-graph.c:21
 msgid ""
 "git commit-graph verify [--object-dir <objdir>] [--shallow] [--[no-]progress]"
 msgstr ""
 "git commit-graph verify [--object-dir <Objektverzeichnis>] [--shallow] [--"
 "[no-]progress]"
 
-#: builtin/commit-graph.c:12 builtin/commit-graph.c:24
+#: builtin/commit-graph.c:14 builtin/commit-graph.c:26
 msgid ""
 "git commit-graph write [--object-dir <objdir>] [--append] [--"
 "split[=<strategy>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-"
@@ -12652,86 +12757,95 @@
 "split[=<Strategie>]] [--reachable|--stdin-packs|--stdin-commits] [--changed-"
 "paths] [--[no-]progress] <Split-Optionen>"
 
-#: builtin/commit-graph.c:60
+#: builtin/commit-graph.c:62
 #, c-format
 msgid "could not find object directory matching %s"
 msgstr "konnte Objekt-Verzeichnis nicht finden, dass '%s' entsprechen soll"
 
-#: builtin/commit-graph.c:76 builtin/commit-graph.c:152
-#: builtin/commit-graph.c:257 builtin/fetch.c:180 builtin/log.c:1678
+#: builtin/commit-graph.c:78 builtin/commit-graph.c:177
+#: builtin/commit-graph.c:276 builtin/fetch.c:180 builtin/log.c:1678
 msgid "dir"
 msgstr "Verzeichnis"
 
-#: builtin/commit-graph.c:77 builtin/commit-graph.c:153
-#: builtin/commit-graph.c:258
+#: builtin/commit-graph.c:79 builtin/commit-graph.c:178
+#: builtin/commit-graph.c:277
 msgid "The object directory to store the graph"
 msgstr "Das Objektverzeichnis zum Speichern des Graphen."
 
-#: builtin/commit-graph.c:79
+#: builtin/commit-graph.c:81
 msgid "if the commit-graph is split, only verify the tip file"
 msgstr ""
 "Wenn der Commit-Graph aufgeteilt ist, nur die Datei an der Spitze überprüfen"
 
-#: builtin/commit-graph.c:102
+#: builtin/commit-graph.c:104
 #, c-format
 msgid "Could not open commit-graph '%s'"
 msgstr "Konnte Commit-Graph '%s' nicht öffnen."
 
-#: builtin/commit-graph.c:136
+#: builtin/commit-graph.c:138
 #, c-format
 msgid "unrecognized --split argument, %s"
 msgstr "nicht erkanntes --split Argument, %s"
 
-#: builtin/commit-graph.c:155
+#: builtin/commit-graph.c:151
+#, c-format
+msgid "unexpected non-hex object ID: %s"
+msgstr "unerwartete nicht-hexadezimale Objekt-ID: %s"
+
+#: builtin/commit-graph.c:156
+#, c-format
+msgid "invalid object: %s"
+msgstr "ungültiges Objekt: %s"
+
+#: builtin/commit-graph.c:180
 msgid "start walk at all refs"
 msgstr "Durchlauf auf allen Referenzen beginnen"
 
-#: builtin/commit-graph.c:157
+#: builtin/commit-graph.c:182
 msgid "scan pack-indexes listed by stdin for commits"
 msgstr "durch Standard-Eingabe gelistete Pack-Indexe nach Commits scannen"
 
-#: builtin/commit-graph.c:159
+#: builtin/commit-graph.c:184
 msgid "start walk at commits listed by stdin"
 msgstr "Lauf bei Commits beginnen, die über die Standard-Eingabe gelistet sind"
 
-#: builtin/commit-graph.c:161
+#: builtin/commit-graph.c:186
 msgid "include all commits already in the commit-graph file"
 msgstr ""
 "alle Commits einschließen, die sich bereits in der Commit-Graph-Datei "
 "befinden"
 
-#: builtin/commit-graph.c:163
+#: builtin/commit-graph.c:188
 msgid "enable computation for changed paths"
 msgstr "Berechnung für veränderte Pfade aktivieren"
 
-#: builtin/commit-graph.c:166
+#: builtin/commit-graph.c:191
 msgid "allow writing an incremental commit-graph file"
 msgstr "Erlaube das Schreiben einer inkrementellen Commit-Graph-Datei"
 
-#: builtin/commit-graph.c:170
+#: builtin/commit-graph.c:195
 msgid "maximum number of commits in a non-base split commit-graph"
 msgstr ""
 "Maximale Anzahl von Commits in einem aufgeteilten Commit-Graph ohne Basis"
 
-#: builtin/commit-graph.c:172
+#: builtin/commit-graph.c:197
 msgid "maximum ratio between two levels of a split commit-graph"
 msgstr ""
 "Maximales Verhältnis zwischen zwei Ebenen eines aufgeteilten Commit-Graph"
 
-#: builtin/commit-graph.c:174
+#: builtin/commit-graph.c:199
 msgid "only expire files older than a given date-time"
 msgstr "nur Objekte älter als angegebene Zeit verfallen lassen"
 
-#: builtin/commit-graph.c:190
+#: builtin/commit-graph.c:215
 msgid "use at most one of --reachable, --stdin-commits, or --stdin-packs"
 msgstr ""
 "Benutzen Sie mindestens eins von --reachable, --stdin-commits, oder --stdin-"
 "packs."
 
-#: builtin/commit-graph.c:229
-#, c-format
-msgid "unexpected non-hex object ID: %s"
-msgstr "unerwartete nicht-hexadezimale Objekt-ID: %s"
+#: builtin/commit-graph.c:245
+msgid "Collecting commits from input"
+msgstr "Sammle Commits von der Standard-Eingabe"
 
 #: builtin/commit-tree.c:18
 msgid ""
@@ -13145,7 +13259,7 @@
 msgstr "Version"
 
 #: builtin/commit.c:1376 builtin/commit.c:1535 builtin/push.c:549
-#: builtin/worktree.c:646
+#: builtin/worktree.c:722
 msgid "machine-readable output"
 msgstr "maschinenlesbare Ausgabe"
 
@@ -13158,8 +13272,8 @@
 msgstr "Einträge mit NUL-Zeichen abschließen"
 
 #: builtin/commit.c:1384 builtin/commit.c:1388 builtin/commit.c:1543
-#: builtin/fast-export.c:1153 builtin/fast-export.c:1156
-#: builtin/fast-export.c:1159 builtin/rebase.c:1392 parse-options.h:336
+#: builtin/fast-export.c:1199 builtin/fast-export.c:1202
+#: builtin/fast-export.c:1205 builtin/rebase.c:1392 parse-options.h:336
 msgid "mode"
 msgstr "Modus"
 
@@ -13587,7 +13701,7 @@
 "#\tname = %s\n"
 "#\temail = %s\n"
 msgstr ""
-"# Das ist Git's benutzerspezifische Konfigurationsdatei.\n"
+"# Das ist Gits benutzerspezifische Konfigurationsdatei.\n"
 "[user]\n"
 "# Bitte passen Sie die folgenden Zeilen an und kommentieren Sie diese aus:\n"
 "#\tname = %s\n"
@@ -13857,35 +13971,45 @@
 msgid "--broken is incompatible with commit-ishes"
 msgstr "Die Option --broken kann nicht mit Commits verwendet werden."
 
-#: builtin/diff.c:84
+#: builtin/diff.c:91
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': keine reguläre Datei oder symbolische Verknüpfung"
 
-#: builtin/diff.c:235
+#: builtin/diff.c:242
 #, c-format
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:350
+#: builtin/diff.c:359
+#, c-format
+msgid "%s...%s: no merge base"
+msgstr "%s...%s: keine Merge-Basis"
+
+#: builtin/diff.c:469
 msgid "Not a git repository"
 msgstr "Kein Git-Repository"
 
-#: builtin/diff.c:394
+#: builtin/diff.c:514
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:403
+#: builtin/diff.c:525
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:408
+#: builtin/diff.c:530
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
 
+#: builtin/diff.c:564
+#, c-format
+msgid "%s...%s: multiple merge bases, using %s"
+msgstr "%s...%s: mehrere Merge-Basen, nutze %s"
+
 #: builtin/difftool.c:30
 msgid "git difftool [<options>] [<commit> [<commit>]] [--] [<path>...]"
 msgstr "git difftool [<Optionen>] [<Commit> [<Commit>]] [--] [<Pfad>...]"
@@ -14038,89 +14162,110 @@
 msgid "git fast-export [rev-list-opts]"
 msgstr "git fast-export [rev-list-opts]"
 
-#: builtin/fast-export.c:853
+#: builtin/fast-export.c:868
 msgid "Error: Cannot export nested tags unless --mark-tags is specified."
 msgstr ""
 "Fehler: Verschachtelte Tags können nicht exportiert werden, außer --mark-"
 "tags wurde angegeben."
 
-#: builtin/fast-export.c:1152
+#: builtin/fast-export.c:1178
+msgid "--anonymize-map token cannot be empty"
+msgstr "Token für --anonymize-map kann nicht leer sein"
+
+#: builtin/fast-export.c:1198
 msgid "show progress after <n> objects"
 msgstr "Fortschritt nach <n> Objekten anzeigen"
 
-#: builtin/fast-export.c:1154
+#: builtin/fast-export.c:1200
 msgid "select handling of signed tags"
 msgstr "Behandlung von signierten Tags wählen"
 
-#: builtin/fast-export.c:1157
+#: builtin/fast-export.c:1203
 msgid "select handling of tags that tag filtered objects"
 msgstr "Behandlung von Tags wählen, die gefilterte Objekte markieren"
 
-#: builtin/fast-export.c:1160
+#: builtin/fast-export.c:1206
 msgid "select handling of commit messages in an alternate encoding"
 msgstr ""
 "Auswählen der Behandlung von Commit-Beschreibungen bei wechselndem Encoding"
 
-#: builtin/fast-export.c:1163
+#: builtin/fast-export.c:1209
 msgid "Dump marks to this file"
 msgstr "Markierungen in diese Datei schreiben"
 
-#: builtin/fast-export.c:1165
+#: builtin/fast-export.c:1211
 msgid "Import marks from this file"
 msgstr "Markierungen von dieser Datei importieren"
 
-#: builtin/fast-export.c:1169
+#: builtin/fast-export.c:1215
 msgid "Import marks from this file if it exists"
 msgstr "Markierungen von dieser Datei importieren, wenn diese existiert"
 
-#: builtin/fast-export.c:1171
+#: builtin/fast-export.c:1217
 msgid "Fake a tagger when tags lack one"
 msgstr "künstlich einen Tag-Ersteller erzeugen, wenn das Tag keinen hat"
 
-#: builtin/fast-export.c:1173
+#: builtin/fast-export.c:1219
 msgid "Output full tree for each commit"
 msgstr "für jeden Commit das gesamte Verzeichnis ausgeben"
 
-#: builtin/fast-export.c:1175
+#: builtin/fast-export.c:1221
 msgid "Use the done feature to terminate the stream"
 msgstr "die \"done\"-Funktion benutzen, um den Datenstrom abzuschließen"
 
-#: builtin/fast-export.c:1176
+#: builtin/fast-export.c:1222
 msgid "Skip output of blob data"
 msgstr "Ausgabe von Blob-Daten überspringen"
 
-#: builtin/fast-export.c:1177 builtin/log.c:1724
+#: builtin/fast-export.c:1223 builtin/log.c:1724
 msgid "refspec"
 msgstr "Refspec"
 
-#: builtin/fast-export.c:1178
+#: builtin/fast-export.c:1224
 msgid "Apply refspec to exported refs"
 msgstr "Refspec auf exportierte Referenzen anwenden"
 
-#: builtin/fast-export.c:1179
+#: builtin/fast-export.c:1225
 msgid "anonymize output"
 msgstr "Ausgabe anonymisieren"
 
-#: builtin/fast-export.c:1181
+#: builtin/fast-export.c:1226
+msgid "from:to"
+msgstr "von:nach"
+
+#: builtin/fast-export.c:1227
+msgid "convert <from> to <to> in anonymized output"
+msgstr "konvertiere <von> zu <nach> in anonymisierter Ausgabe"
+
+#: builtin/fast-export.c:1230
 msgid "Reference parents which are not in fast-export stream by object id"
 msgstr ""
 "Eltern, die nicht im Fast-Export-Stream sind, anhand ihrer Objekt-ID "
 "referenzieren"
 
-#: builtin/fast-export.c:1183
+#: builtin/fast-export.c:1232
 msgid "Show original object ids of blobs/commits"
 msgstr "originale Objekt-IDs von Blobs/Commits anzeigen"
 
-#: builtin/fast-export.c:1185
+#: builtin/fast-export.c:1234
 msgid "Label tags with mark ids"
 msgstr "Tags mit Markierungs-IDs beschriften"
 
-#: builtin/fast-export.c:1220
+#: builtin/fast-export.c:1257
+msgid "--anonymize-map without --anonymize does not make sense"
+msgstr "--anonymize-map ohne --anonymize ist nicht sinnvoll"
+
+#: builtin/fast-export.c:1272
 msgid "Cannot pass both --import-marks and --import-marks-if-exists"
 msgstr ""
 "--import-marks und --import-marks-if-exists können nicht zusammen "
 "weitergegeben werden"
 
+#: builtin/fetch-pack.c:245
+#, c-format
+msgid "Lockfile created but not reported: %s"
+msgstr "Lock-Datei erstellt, aber nicht gemeldet: %s"
+
 #: builtin/fetch.c:35
 msgid "git fetch [<options>] [<repository> [<refspec>...]]"
 msgstr "git fetch [<Optionen>] [<Repository> [<Refspec>...]]"
@@ -14461,45 +14606,45 @@
 msgid "You need to specify a tag name."
 msgstr "Sie müssen den Namen des Tags angeben."
 
-#: builtin/fetch.c:1773
+#: builtin/fetch.c:1778
 msgid "Negative depth in --deepen is not supported"
 msgstr "Negative Tiefe wird von --deepen nicht unterstützt."
 
-#: builtin/fetch.c:1775
+#: builtin/fetch.c:1780
 msgid "--deepen and --depth are mutually exclusive"
 msgstr "--deepen und --depth schließen sich gegenseitig aus"
 
-#: builtin/fetch.c:1780
+#: builtin/fetch.c:1785
 msgid "--depth and --unshallow cannot be used together"
 msgstr ""
 "Die Optionen --depth und --unshallow können nicht gemeinsam verwendet werden."
 
-#: builtin/fetch.c:1782
+#: builtin/fetch.c:1787
 msgid "--unshallow on a complete repository does not make sense"
 msgstr ""
 "Die Option --unshallow kann nicht in einem Repository mit vollständiger "
 "Historie verwendet werden."
 
-#: builtin/fetch.c:1798
+#: builtin/fetch.c:1800
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all akzeptiert kein Repository als Argument"
 
-#: builtin/fetch.c:1800
+#: builtin/fetch.c:1802
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kann nicht mit Refspecs verwendet werden."
 
-#: builtin/fetch.c:1809
+#: builtin/fetch.c:1811
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Kein Remote-Repository (einzeln oder Gruppe): %s"
 
-#: builtin/fetch.c:1816
+#: builtin/fetch.c:1818
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 "Das Abholen einer Gruppe von Remote-Repositories kann nicht mit der Angabe\n"
 "von Refspecs verwendet werden."
 
-#: builtin/fetch.c:1834
+#: builtin/fetch.c:1836
 msgid ""
 "--filter can only be used with the remote configured in extensions."
 "partialclone"
@@ -14961,8 +15106,8 @@
 #. variable for tweaking threads, currently
 #. grep.threads
 #.
-#: builtin/grep.c:287 builtin/index-pack.c:1537 builtin/index-pack.c:1730
-#: builtin/pack-objects.c:2855
+#: builtin/grep.c:287 builtin/index-pack.c:1537 builtin/index-pack.c:1727
+#: builtin/pack-objects.c:2904
 #, c-format
 msgid "no threads support, ignoring %s"
 msgstr "keine Unterstützung von Threads, '%s' wird ignoriert"
@@ -15195,11 +15340,11 @@
 msgid "invalid option combination, ignoring --threads"
 msgstr "Ungültige Kombination von Optionen, --threads wird ignoriert."
 
-#: builtin/grep.c:1084 builtin/pack-objects.c:3548
+#: builtin/grep.c:1084 builtin/pack-objects.c:3623
 msgid "no threads support, ignoring --threads"
 msgstr "Keine Unterstützung für Threads, --threads wird ignoriert."
 
-#: builtin/grep.c:1087 builtin/index-pack.c:1534 builtin/pack-objects.c:2852
+#: builtin/grep.c:1087 builtin/index-pack.c:1534 builtin/pack-objects.c:2901
 #, c-format
 msgid "invalid number of threads specified (%d)"
 msgstr "ungültige Anzahl von Threads angegeben (%d)"
@@ -15406,7 +15551,7 @@
 msgid "used more bytes than were available"
 msgstr "verwendete mehr Bytes als verfügbar waren"
 
-#: builtin/index-pack.c:288 builtin/pack-objects.c:607
+#: builtin/index-pack.c:288 builtin/pack-objects.c:618
 msgid "pack too large for current definition of off_t"
 msgstr "Paket ist zu groß für die aktuelle Definition von off_t"
 
@@ -15478,8 +15623,8 @@
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
-#: builtin/index-pack.c:738 builtin/pack-objects.c:159
-#: builtin/pack-objects.c:219 builtin/pack-objects.c:314
+#: builtin/index-pack.c:738 builtin/pack-objects.c:170
+#: builtin/pack-objects.c:230 builtin/pack-objects.c:325
 #, c-format
 msgid "unable to read %s"
 msgstr "kann %s nicht lesen"
@@ -15540,7 +15685,7 @@
 msgid "Resolving deltas"
 msgstr "Löse Unterschiede auf"
 
-#: builtin/index-pack.c:1208 builtin/pack-objects.c:2616
+#: builtin/index-pack.c:1208 builtin/pack-objects.c:2665
 #, c-format
 msgid "unable to create thread: %s"
 msgstr "kann Thread nicht erzeugen: %s"
@@ -15605,58 +15750,67 @@
 msgid "cannot store index file"
 msgstr "Kann Indexdatei nicht speichern"
 
-#: builtin/index-pack.c:1528 builtin/pack-objects.c:2863
+#: builtin/index-pack.c:1528 builtin/pack-objects.c:2912
 #, c-format
 msgid "bad pack.indexversion=%<PRIu32>"
 msgstr "\"pack.indexversion=%<PRIu32>\" ist ungültig"
 
-#: builtin/index-pack.c:1596
+#: builtin/index-pack.c:1592
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kann existierende Paketdatei '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1598
+#: builtin/index-pack.c:1594
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Kann existierende Indexdatei für Paket '%s' nicht öffnen"
 
-#: builtin/index-pack.c:1646
+#: builtin/index-pack.c:1642
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "kein Unterschied: %d Objekt"
 msgstr[1] "kein Unterschied: %d Objekte"
 
-#: builtin/index-pack.c:1653
+#: builtin/index-pack.c:1649
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt"
 msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte"
 
-#: builtin/index-pack.c:1692
+#: builtin/index-pack.c:1689
 msgid "Cannot come back to cwd"
 msgstr "Kann nicht zurück zum Arbeitsverzeichnis wechseln"
 
-#: builtin/index-pack.c:1741 builtin/index-pack.c:1744
-#: builtin/index-pack.c:1760 builtin/index-pack.c:1764
+#: builtin/index-pack.c:1738 builtin/index-pack.c:1741
+#: builtin/index-pack.c:1757 builtin/index-pack.c:1761
 #, c-format
 msgid "bad %s"
 msgstr "%s ist ungültig"
 
-#: builtin/index-pack.c:1780
+#: builtin/index-pack.c:1767 builtin/init-db.c:392 builtin/init-db.c:621
+#, c-format
+msgid "unknown hash algorithm '%s'"
+msgstr "unbekannter Hash-Algorithmus '%s'"
+
+#: builtin/index-pack.c:1782
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "Die Option --fix-thin kann nicht ohne --stdin verwendet werden."
 
-#: builtin/index-pack.c:1782
+#: builtin/index-pack.c:1784
 msgid "--stdin requires a git repository"
 msgstr "--stdin erfordert ein Git-Repository"
 
-#: builtin/index-pack.c:1788
+#: builtin/index-pack.c:1786
+msgid "--object-format cannot be used with --stdin"
+msgstr "Die Option --object-format kann nicht mit --stdin verwendet werden."
+
+#: builtin/index-pack.c:1792
 msgid "--verify with no packfile name given"
 msgstr "Die Option --verify wurde ohne Namen der Paketdatei angegeben."
 
-#: builtin/index-pack.c:1836 builtin/unpack-objects.c:582
+#: builtin/index-pack.c:1840 builtin/unpack-objects.c:582
 msgid "fsck error in pack objects"
 msgstr "fsck Fehler beim Packen von Objekten"
 
@@ -15700,51 +15854,56 @@
 msgid "not copying templates from '%s': %s"
 msgstr "kopiere keine Vorlagen von '%s': %s"
 
-#: builtin/init-db.c:356
+#: builtin/init-db.c:276
+#, c-format
+msgid "invalid initial branch name: '%s'"
+msgstr "ungültiger initialer Branchname: '%s'"
+
+#: builtin/init-db.c:368
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kann nicht mit Dateityp %d umgehen"
 
-#: builtin/init-db.c:359
+#: builtin/init-db.c:371
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
-#: builtin/init-db.c:374
+#: builtin/init-db.c:386
 msgid "attempt to reinitialize repository with different hash"
 msgstr "Versuch, das Repository mit einem anderen Hash zu reinitialisieren"
 
-#: builtin/init-db.c:380 builtin/init-db.c:601
-#, c-format
-msgid "unknown hash algorithm '%s'"
-msgstr "unbekannter Hash-Algorithmus '%s'"
-
-#: builtin/init-db.c:397 builtin/init-db.c:400
+#: builtin/init-db.c:410 builtin/init-db.c:413
 #, c-format
 msgid "%s already exists"
 msgstr "%s existiert bereits"
 
-#: builtin/init-db.c:458
+#: builtin/init-db.c:444
+#, c-format
+msgid "re-init: ignored --initial-branch=%s"
+msgstr "Neu-Initialisierung: --initial-branch=%s ignoriert"
+
+#: builtin/init-db.c:475
 #, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
 msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:459
+#: builtin/init-db.c:476
 #, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
 msgstr "Bestehendes Git-Repository in %s%s neuinitialisiert\n"
 
-#: builtin/init-db.c:463
+#: builtin/init-db.c:480
 #, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
 msgstr "Leeres verteiltes Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:464
+#: builtin/init-db.c:481
 #, c-format
 msgid "Initialized empty Git repository in %s%s\n"
 msgstr "Leeres Git-Repository in %s%s initialisiert\n"
 
-#: builtin/init-db.c:513
+#: builtin/init-db.c:530
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
@@ -15752,33 +15911,37 @@
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
-#: builtin/init-db.c:538
+#: builtin/init-db.c:556
 msgid "permissions"
 msgstr "Berechtigungen"
 
-#: builtin/init-db.c:539
+#: builtin/init-db.c:557
 msgid "specify that the git repository is to be shared amongst several users"
 msgstr "angeben, dass das Git-Repository mit mehreren Benutzern geteilt wird"
 
-#: builtin/init-db.c:544
+#: builtin/init-db.c:563
+msgid "override the name of the initial branch"
+msgstr "den Namen des initialen Branches überschreiben"
+
+#: builtin/init-db.c:564
 msgid "hash"
 msgstr "Hash"
 
-#: builtin/init-db.c:545
+#: builtin/init-db.c:565 builtin/show-index.c:22
 msgid "specify the hash algorithm to use"
 msgstr "den zu verwendenen Hash-Algorithmus angeben"
 
-#: builtin/init-db.c:578 builtin/init-db.c:583
+#: builtin/init-db.c:598 builtin/init-db.c:603
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "kann Verzeichnis %s nicht erstellen"
 
-#: builtin/init-db.c:587
+#: builtin/init-db.c:607
 #, c-format
 msgid "cannot chdir to %s"
 msgstr "kann nicht in Verzeichnis %s wechseln"
 
-#: builtin/init-db.c:614
+#: builtin/init-db.c:634
 #, c-format
 msgid ""
 "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -15787,7 +15950,7 @@
 "%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
 "(oder --git-dir=<Verzeichnis>)"
 
-#: builtin/init-db.c:642
+#: builtin/init-db.c:662
 #, c-format
 msgid "Cannot access work tree '%s'"
 msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -17567,7 +17730,7 @@
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
-#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:164
+#: builtin/notes.c:954 builtin/prune.c:132 builtin/worktree.c:220
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
@@ -17602,357 +17765,384 @@
 "git pack-objects [<Optionen>...] <Basis-Name> [< <Referenzliste> | < "
 "<Objektliste>]"
 
-#: builtin/pack-objects.c:431
+#: builtin/pack-objects.c:442
 #, c-format
 msgid "bad packed object CRC for %s"
 msgstr "Ungültiges CRC für gepacktes Objekt %s."
 
-#: builtin/pack-objects.c:442
+#: builtin/pack-objects.c:453
 #, c-format
 msgid "corrupt packed object for %s"
 msgstr "Fehlerhaftes gepacktes Objekt für %s."
 
-#: builtin/pack-objects.c:573
+#: builtin/pack-objects.c:584
 #, c-format
 msgid "recursive delta detected for object %s"
 msgstr "Rekursiver Unterschied für Objekt %s festgestellt."
 
-#: builtin/pack-objects.c:784
+#: builtin/pack-objects.c:795
 #, c-format
 msgid "ordered %u objects, expected %<PRIu32>"
 msgstr "%u Objekte geordnet, %<PRIu32> erwartet."
 
-#: builtin/pack-objects.c:973
+#: builtin/pack-objects.c:1003
 msgid "disabling bitmap writing, packs are split due to pack.packSizeLimit"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, Pakete wurden durch pack.packSizeLimit\n"
 "aufgetrennt."
 
-#: builtin/pack-objects.c:986
+#: builtin/pack-objects.c:1016
 msgid "Writing objects"
 msgstr "Schreibe Objekte"
 
-#: builtin/pack-objects.c:1047 builtin/update-index.c:90
+#: builtin/pack-objects.c:1077 builtin/update-index.c:90
 #, c-format
 msgid "failed to stat %s"
 msgstr "Konnte '%s' nicht lesen"
 
-#: builtin/pack-objects.c:1100
+#: builtin/pack-objects.c:1130
 #, c-format
 msgid "wrote %<PRIu32> objects while expecting %<PRIu32>"
 msgstr "Schrieb %<PRIu32> Objekte während %<PRIu32> erwartet waren."
 
-#: builtin/pack-objects.c:1298
+#: builtin/pack-objects.c:1347
 msgid "disabling bitmap writing, as some objects are not being packed"
 msgstr ""
 "Deaktiviere Schreiben der Bitmap, da einige Objekte nicht in eine Pack-"
 "Datei\n"
 "geschrieben wurden."
 
-#: builtin/pack-objects.c:1725
+#: builtin/pack-objects.c:1774
 #, c-format
 msgid "delta base offset overflow in pack for %s"
 msgstr "\"delta base offset\" Überlauf in Paket für %s"
 
-#: builtin/pack-objects.c:1734
+#: builtin/pack-objects.c:1783
 #, c-format
 msgid "delta base offset out of bound for %s"
 msgstr "\"delta base offset\" liegt außerhalb des gültigen Bereichs für %s"
 
-#: builtin/pack-objects.c:2005
+#: builtin/pack-objects.c:2054
 msgid "Counting objects"
 msgstr "Zähle Objekte"
 
-#: builtin/pack-objects.c:2150
+#: builtin/pack-objects.c:2199
 #, c-format
 msgid "unable to parse object header of %s"
 msgstr "Konnte Kopfbereich von Objekt '%s' nicht parsen."
 
-#: builtin/pack-objects.c:2220 builtin/pack-objects.c:2236
-#: builtin/pack-objects.c:2246
+#: builtin/pack-objects.c:2269 builtin/pack-objects.c:2285
+#: builtin/pack-objects.c:2295
 #, c-format
 msgid "object %s cannot be read"
 msgstr "Objekt %s kann nicht gelesen werden."
 
-#: builtin/pack-objects.c:2223 builtin/pack-objects.c:2250
+#: builtin/pack-objects.c:2272 builtin/pack-objects.c:2299
 #, c-format
 msgid "object %s inconsistent object length (%<PRIuMAX> vs %<PRIuMAX>)"
 msgstr "Inkonsistente Objektlänge bei Objekt %s (%<PRIuMAX> vs %<PRIuMAX>)"
 
-#: builtin/pack-objects.c:2260
+#: builtin/pack-objects.c:2309
 msgid "suboptimal pack - out of memory"
 msgstr "ungünstiges Packet - Speicher voll"
 
-#: builtin/pack-objects.c:2575
+#: builtin/pack-objects.c:2624
 #, c-format
 msgid "Delta compression using up to %d threads"
 msgstr "Delta-Kompression verwendet bis zu %d Threads."
 
-#: builtin/pack-objects.c:2714
+#: builtin/pack-objects.c:2763
 #, c-format
 msgid "unable to pack objects reachable from tag %s"
 msgstr "Konnte keine Objekte packen, die von Tag %s erreichbar sind."
 
-#: builtin/pack-objects.c:2802
+#: builtin/pack-objects.c:2851
 msgid "Compressing objects"
 msgstr "Komprimiere Objekte"
 
-#: builtin/pack-objects.c:2808
+#: builtin/pack-objects.c:2857
 msgid "inconsistency with delta count"
 msgstr "Inkonsistenz mit der Anzahl von Deltas"
 
-#: builtin/pack-objects.c:2889
+#: builtin/pack-objects.c:2929
+#, c-format
+msgid ""
+"value of uploadpack.blobpackfileuri must be of the form '<object-hash> <pack-"
+"hash> <uri>' (got '%s')"
+msgstr ""
+"Wert für uploadpack.blobpackfileuri muss in der Form '<Objekt-Hash> <Pack-"
+"Hash> <URI>' vorliegen ('%s' erhalten)"
+
+#: builtin/pack-objects.c:2932
+#, c-format
+msgid ""
+"object already configured in another uploadpack.blobpackfileuri (got '%s')"
+msgstr ""
+"Objekt bereits in einem anderen uploadpack.blobpackfileuri konfiguriert "
+"('%s' erhalten)"
+
+#: builtin/pack-objects.c:2961
 #, c-format
 msgid ""
 "expected edge object ID, got garbage:\n"
 " %s"
 msgstr ""
-"Erwartete Randobjekt-ID, erhielt nutzlose Daten:\n"
+"erwartete Randobjekt-ID, erhielt nutzlose Daten:\n"
 " %s"
 
-#: builtin/pack-objects.c:2895
+#: builtin/pack-objects.c:2967
 #, c-format
 msgid ""
 "expected object ID, got garbage:\n"
 " %s"
 msgstr ""
-"Erwartete Objekt-ID, erhielt nutzlose Daten:\n"
+"erwartete Objekt-ID, erhielt nutzlose Daten:\n"
 " %s"
 
-#: builtin/pack-objects.c:2993
+#: builtin/pack-objects.c:3065
 msgid "invalid value for --missing"
-msgstr "Ungültiger Wert für --missing."
+msgstr "ungültiger Wert für --missing"
 
-#: builtin/pack-objects.c:3052 builtin/pack-objects.c:3160
+#: builtin/pack-objects.c:3124 builtin/pack-objects.c:3232
 msgid "cannot open pack index"
-msgstr "Kann Paketindex nicht öffnen."
+msgstr "kann Paketindex nicht öffnen"
 
-#: builtin/pack-objects.c:3083
+#: builtin/pack-objects.c:3155
 #, c-format
 msgid "loose object at %s could not be examined"
-msgstr "Loses Objekt bei %s konnte nicht untersucht werden."
+msgstr "loses Objekt bei %s konnte nicht untersucht werden"
 
-#: builtin/pack-objects.c:3168
+#: builtin/pack-objects.c:3240
 msgid "unable to force loose object"
-msgstr "Konnte loses Objekt nicht erzwingen."
+msgstr "konnte loses Objekt nicht erzwingen"
 
-#: builtin/pack-objects.c:3261
+#: builtin/pack-objects.c:3333
 #, c-format
 msgid "not a rev '%s'"
-msgstr "'%s' ist kein Commit."
+msgstr "'%s' ist kein Commit"
 
-#: builtin/pack-objects.c:3264
+#: builtin/pack-objects.c:3336
 #, c-format
 msgid "bad revision '%s'"
-msgstr "Ungültiger Commit '%s'."
+msgstr "ungültiger Commit '%s'"
 
-#: builtin/pack-objects.c:3289
+#: builtin/pack-objects.c:3361
 msgid "unable to add recent objects"
-msgstr "Konnte jüngste Objekte nicht hinzufügen."
+msgstr "konnte neuere Objekte nicht hinzufügen"
 
-#: builtin/pack-objects.c:3342
+#: builtin/pack-objects.c:3414
 #, c-format
 msgid "unsupported index version %s"
-msgstr "Nicht unterstützte Index-Version %s"
+msgstr "nicht unterstützte Index-Version %s"
 
-#: builtin/pack-objects.c:3346
+#: builtin/pack-objects.c:3418
 #, c-format
 msgid "bad index version '%s'"
-msgstr "Ungültige Index-Version '%s'"
+msgstr "ungültige Index-Version '%s'"
 
-#: builtin/pack-objects.c:3384
+#: builtin/pack-objects.c:3456
 msgid "<version>[,<offset>]"
 msgstr "<Version>[,<Offset>]"
 
-#: builtin/pack-objects.c:3385
+#: builtin/pack-objects.c:3457
 msgid "write the pack index file in the specified idx format version"
 msgstr ""
 "die Index-Datei des Paketes in der angegebenen Indexformat-Version schreiben"
 
-#: builtin/pack-objects.c:3388
+#: builtin/pack-objects.c:3460
 msgid "maximum size of each output pack file"
 msgstr "maximale Größe für jede ausgegebene Paketdatei"
 
-#: builtin/pack-objects.c:3390
+#: builtin/pack-objects.c:3462
 msgid "ignore borrowed objects from alternate object store"
 msgstr "geliehene Objekte von alternativem Objektspeicher ignorieren"
 
-#: builtin/pack-objects.c:3392
+#: builtin/pack-objects.c:3464
 msgid "ignore packed objects"
 msgstr "gepackte Objekte ignorieren"
 
-#: builtin/pack-objects.c:3394
+#: builtin/pack-objects.c:3466
 msgid "limit pack window by objects"
 msgstr "Paketfenster durch Objekte begrenzen"
 
-#: builtin/pack-objects.c:3396
+#: builtin/pack-objects.c:3468
 msgid "limit pack window by memory in addition to object limit"
 msgstr ""
 "Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher begrenzen"
 
-#: builtin/pack-objects.c:3398
+#: builtin/pack-objects.c:3470
 msgid "maximum length of delta chain allowed in the resulting pack"
 msgstr ""
 "maximale Länge der erlaubten Differenzverkettung im resultierenden Paket"
 
-#: builtin/pack-objects.c:3400
+#: builtin/pack-objects.c:3472
 msgid "reuse existing deltas"
 msgstr "existierende Unterschiede wiederverwenden"
 
-#: builtin/pack-objects.c:3402
+#: builtin/pack-objects.c:3474
 msgid "reuse existing objects"
 msgstr "existierende Objekte wiederverwenden"
 
-#: builtin/pack-objects.c:3404
+#: builtin/pack-objects.c:3476
 msgid "use OFS_DELTA objects"
 msgstr "OFS_DELTA Objekte verwenden"
 
-#: builtin/pack-objects.c:3406
+#: builtin/pack-objects.c:3478
 msgid "use threads when searching for best delta matches"
 msgstr ""
 "Threads bei der Suche nach den besten Übereinstimmungen bei Unterschieden "
 "verwenden"
 
-#: builtin/pack-objects.c:3408
+#: builtin/pack-objects.c:3480
 msgid "do not create an empty pack output"
 msgstr "keine leeren Pakete erzeugen"
 
-#: builtin/pack-objects.c:3410
+#: builtin/pack-objects.c:3482
 msgid "read revision arguments from standard input"
 msgstr "Argumente bezüglich Commits von der Standard-Eingabe lesen"
 
-#: builtin/pack-objects.c:3412
+#: builtin/pack-objects.c:3484
 msgid "limit the objects to those that are not yet packed"
 msgstr "die Objekte zu solchen, die noch nicht gepackt wurden, begrenzen"
 
-#: builtin/pack-objects.c:3415
+#: builtin/pack-objects.c:3487
 msgid "include objects reachable from any reference"
 msgstr "Objekte einschließen, die von jeder Referenz erreichbar sind"
 
-#: builtin/pack-objects.c:3418
+#: builtin/pack-objects.c:3490
 msgid "include objects referred by reflog entries"
 msgstr ""
 "Objekte einschließen, die von Einträgen des Reflogs referenziert werden"
 
-#: builtin/pack-objects.c:3421
+#: builtin/pack-objects.c:3493
 msgid "include objects referred to by the index"
 msgstr "Objekte einschließen, die vom Index referenziert werden"
 
-#: builtin/pack-objects.c:3424
+#: builtin/pack-objects.c:3496
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
-#: builtin/pack-objects.c:3426
+#: builtin/pack-objects.c:3498
 msgid "include tag objects that refer to objects to be packed"
 msgstr "Tag-Objekte einschließen, die auf gepackte Objekte referenzieren"
 
-#: builtin/pack-objects.c:3428
+#: builtin/pack-objects.c:3500
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
-#: builtin/pack-objects.c:3430
+#: builtin/pack-objects.c:3502
 msgid "pack loose unreachable objects"
 msgstr "nicht erreichbare lose Objekte packen"
 
-#: builtin/pack-objects.c:3432
+#: builtin/pack-objects.c:3504
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
-#: builtin/pack-objects.c:3435
+#: builtin/pack-objects.c:3507
 msgid "use the sparse reachability algorithm"
 msgstr "den \"sparse\" Algorithmus zur Bestimmung der Erreichbarkeit benutzen"
 
-#: builtin/pack-objects.c:3437
+#: builtin/pack-objects.c:3509
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
 
-#: builtin/pack-objects.c:3439
+#: builtin/pack-objects.c:3511
 msgid "create packs suitable for shallow fetches"
 msgstr ""
 "Pakete geeignet für Abholung mit unvollständiger Historie (shallow) erzeugen"
 
-#: builtin/pack-objects.c:3441
+#: builtin/pack-objects.c:3513
 msgid "ignore packs that have companion .keep file"
 msgstr "Pakete ignorieren, die .keep Dateien haben"
 
-#: builtin/pack-objects.c:3443
+#: builtin/pack-objects.c:3515
 msgid "ignore this pack"
 msgstr "dieses Paket ignorieren"
 
-#: builtin/pack-objects.c:3445
+#: builtin/pack-objects.c:3517
 msgid "pack compression level"
 msgstr "Komprimierungsgrad für Paketierung"
 
-#: builtin/pack-objects.c:3447
+#: builtin/pack-objects.c:3519
 msgid "do not hide commits by grafts"
 msgstr "keine künstlichen Vorgänger-Commits (\"grafts\") verbergen"
 
-#: builtin/pack-objects.c:3449
+#: builtin/pack-objects.c:3521
 msgid "use a bitmap index if available to speed up counting objects"
 msgstr ""
 "Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung benutzen"
 
-#: builtin/pack-objects.c:3451
+#: builtin/pack-objects.c:3523
 msgid "write a bitmap index together with the pack index"
 msgstr "Bitmap-Index zusammen mit Pack-Index schreiben"
 
-#: builtin/pack-objects.c:3455
+#: builtin/pack-objects.c:3527
 msgid "write a bitmap index if possible"
 msgstr "Bitmap-Index schreiben, wenn möglich"
 
-#: builtin/pack-objects.c:3459
+#: builtin/pack-objects.c:3531
 msgid "handling for missing objects"
 msgstr "Behandlung für fehlende Objekte"
 
-#: builtin/pack-objects.c:3462
+#: builtin/pack-objects.c:3534
 msgid "do not pack objects in promisor packfiles"
 msgstr ""
 "keine Objekte aus Packdateien von partiell geklonten Remote-Repositories "
 "packen"
 
-#: builtin/pack-objects.c:3464
+#: builtin/pack-objects.c:3536
 msgid "respect islands during delta compression"
 msgstr "Delta-Islands bei Delta-Kompression beachten"
 
-#: builtin/pack-objects.c:3493
+#: builtin/pack-objects.c:3538
+msgid "protocol"
+msgstr "Protokoll"
+
+#: builtin/pack-objects.c:3539
+msgid "exclude any configured uploadpack.blobpackfileuri with this protocol"
+msgstr ""
+"jegliche konfigurierte uploadpack.blobpackfileuri für dieses Protkoll "
+"ausschließen"
+
+#: builtin/pack-objects.c:3568
 #, c-format
 msgid "delta chain depth %d is too deep, forcing %d"
 msgstr "Tiefe für Verkettung von Unterschieden %d ist zu tief, erzwinge %d"
 
-#: builtin/pack-objects.c:3498
+#: builtin/pack-objects.c:3573
 #, c-format
 msgid "pack.deltaCacheLimit is too high, forcing %d"
 msgstr "pack.deltaCacheLimit ist zu hoch, erzwinge %d"
 
-#: builtin/pack-objects.c:3552
+#: builtin/pack-objects.c:3627
 msgid "--max-pack-size cannot be used to build a pack for transfer"
 msgstr ""
 "--max-pack-size kann nicht für die Erstellung eines Pakets für eine "
 "Übertragung\n"
 "benutzt werden."
 
-#: builtin/pack-objects.c:3554
+#: builtin/pack-objects.c:3629
 msgid "minimum pack size limit is 1 MiB"
 msgstr "Minimales Limit für die Paketgröße ist 1 MiB."
 
-#: builtin/pack-objects.c:3559
+#: builtin/pack-objects.c:3634
 msgid "--thin cannot be used to build an indexable pack"
 msgstr ""
 "--thin kann nicht benutzt werden, um ein indizierbares Paket zu erstellen."
 
-#: builtin/pack-objects.c:3562
+#: builtin/pack-objects.c:3637
 msgid "--keep-unreachable and --unpack-unreachable are incompatible"
 msgstr "--keep-unreachable und --unpack-unreachable sind inkompatibel"
 
-#: builtin/pack-objects.c:3568
+#: builtin/pack-objects.c:3643
 msgid "cannot use --filter without --stdout"
 msgstr "Kann --filter nicht ohne --stdout benutzen."
 
-#: builtin/pack-objects.c:3628
+#: builtin/pack-objects.c:3703
 msgid "Enumerating objects"
 msgstr "Objekte aufzählen"
 
-#: builtin/pack-objects.c:3658
+#: builtin/pack-objects.c:3734
 #, c-format
 msgid ""
 "Total %<PRIu32> (delta %<PRIu32>), reused %<PRIu32> (delta %<PRIu32>), pack-"
@@ -19292,7 +19482,7 @@
 msgid "git receive-pack <git-dir>"
 msgstr "git receive-pack <Git-Verzeichnis>"
 
-#: builtin/receive-pack.c:843
+#: builtin/receive-pack.c:844
 msgid ""
 "By default, updating the current branch in a non-bare repository\n"
 "is denied, because it will make the index and work tree inconsistent\n"
@@ -19324,7 +19514,7 @@
 "setzen Sie die Konfigurationsvariable 'receive.denyCurrentBranch' auf\n"
 "'refuse'."
 
-#: builtin/receive-pack.c:863
+#: builtin/receive-pack.c:864
 msgid ""
 "By default, deleting the current branch is denied, because the next\n"
 "'git clone' won't result in any file checked out, causing confusion.\n"
@@ -19345,11 +19535,11 @@
 "\n"
 "Um diese Meldung zu unterdrücken, setzen Sie die Variable auf 'refuse'."
 
-#: builtin/receive-pack.c:1960
+#: builtin/receive-pack.c:1970
 msgid "quiet"
 msgstr "weniger Ausgaben"
 
-#: builtin/receive-pack.c:1974
+#: builtin/receive-pack.c:1984
 msgid "You must specify a directory."
 msgstr "Sie müssen ein Repository angeben."
 
@@ -20931,6 +21121,14 @@
 msgid "cannot find commit %s (%s)"
 msgstr "kann Commit %s (%s) nicht finden"
 
+#: builtin/show-index.c:21
+msgid "hash-algorithm"
+msgstr "Hash-Algorithmus"
+
+#: builtin/show-index.c:31
+msgid "Unknown hash algorithm"
+msgstr "Unbekannter Hash-Algorithmus"
+
 #: builtin/show-ref.c:12
 msgid ""
 "git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
@@ -20986,55 +21184,61 @@
 #: builtin/sparse-checkout.c:64
 msgid "this worktree is not sparse (sparse-checkout file may not exist)"
 msgstr ""
-"Dieses Arbeitsverzeichnis ist nicht partiell (Datei für partieller Checkout "
-"existiert eventuell nicht)."
+"dieses Arbeitsverzeichnis ist nicht partiell (Datei für partieller Checkout "
+"existiert eventuell nicht)"
 
-#: builtin/sparse-checkout.c:212
+#: builtin/sparse-checkout.c:216
 msgid "failed to create directory for sparse-checkout file"
 msgstr ""
 "Fehler beim Erstellen eines Verzeichnisses für Datei eines partiellen "
 "Checkouts"
 
-#: builtin/sparse-checkout.c:253
+#: builtin/sparse-checkout.c:257
+msgid "unable to upgrade repository format to enable worktreeConfig"
+msgstr ""
+"Repository-Format konnte nicht erweitert werden, um worktreeConfig zu "
+"aktivieren"
+
+#: builtin/sparse-checkout.c:259
 msgid "failed to set extensions.worktreeConfig setting"
 msgstr "Einstellung für extensions.worktreeConfig konnte nicht gesetzt werden"
 
-#: builtin/sparse-checkout.c:270
+#: builtin/sparse-checkout.c:276
 msgid "git sparse-checkout init [--cone]"
 msgstr "git sparse-checkout init [--cone]"
 
-#: builtin/sparse-checkout.c:289
+#: builtin/sparse-checkout.c:295
 msgid "initialize the sparse-checkout in cone mode"
-msgstr "Initialisiere den partiellen Checkout im Cone-Modus"
+msgstr "initialisiere den partiellen Checkout im Cone-Modus"
 
-#: builtin/sparse-checkout.c:326
+#: builtin/sparse-checkout.c:332
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: builtin/sparse-checkout.c:383
+#: builtin/sparse-checkout.c:389
 #, c-format
 msgid "could not normalize path %s"
 msgstr "konnte Pfad '%s' nicht normalisieren"
 
-#: builtin/sparse-checkout.c:395
+#: builtin/sparse-checkout.c:401
 msgid "git sparse-checkout (set|add) (--stdin | <patterns>)"
 msgstr "git sparse-checkout (set|add) (--stdin | <Muster>)"
 
-#: builtin/sparse-checkout.c:420
+#: builtin/sparse-checkout.c:426
 #, c-format
 msgid "unable to unquote C-style string '%s'"
 msgstr "konnte Anführungszeichen von C-Style Zeichenkette '%s' nicht entfernen"
 
-#: builtin/sparse-checkout.c:474 builtin/sparse-checkout.c:498
+#: builtin/sparse-checkout.c:480 builtin/sparse-checkout.c:504
 msgid "unable to load existing sparse-checkout patterns"
 msgstr "konnte die existierenden Muster des partiellen Checkouts nicht laden"
 
-#: builtin/sparse-checkout.c:543
+#: builtin/sparse-checkout.c:549
 msgid "read patterns from standard in"
 msgstr "Muster von der Standard-Eingabe lesen"
 
-#: builtin/sparse-checkout.c:580
+#: builtin/sparse-checkout.c:586
 msgid "error while refreshing working directory"
 msgstr "Fehler während der Aktualisierung des Arbeitsverzeichnisses."
 
@@ -21757,12 +21961,38 @@
 msgid "git submodule--helper set-url [--quiet] <path> <newurl>"
 msgstr "git submodule--helper set-url [--quiet] <Pfad> <neue URL>"
 
-#: builtin/submodule--helper.c:2323 git.c:436 git.c:683
+#: builtin/submodule--helper.c:2294
+msgid "set the default tracking branch to master"
+msgstr "Standard-Tracking-Branch auf master setzen"
+
+#: builtin/submodule--helper.c:2296
+msgid "set the default tracking branch"
+msgstr "Standard-Tracking-Branch setzen"
+
+#: builtin/submodule--helper.c:2300
+msgid "git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"
+msgstr "git submodule--helper set-branch [-q|--quiet] (-d|--default) [<Pfad>]"
+
+#: builtin/submodule--helper.c:2301
+msgid ""
+"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"
+msgstr ""
+"git submodule--helper set-branch [-q|--quiet] (-b|--branch) <Branch> <Pfad>"
+
+#: builtin/submodule--helper.c:2308
+msgid "--branch or --default required"
+msgstr "Option --branch oder --default erforderlich"
+
+#: builtin/submodule--helper.c:2311
+msgid "--branch and --default are mutually exclusive"
+msgstr "--branch und --default schließen sich gegenseitig aus"
+
+#: builtin/submodule--helper.c:2367 git.c:436 git.c:683
 #, c-format
 msgid "%s doesn't support --super-prefix"
 msgstr "%s unterstützt kein --super-prefix"
 
-#: builtin/submodule--helper.c:2329
+#: builtin/submodule--helper.c:2373
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper"
@@ -22418,206 +22648,198 @@
 msgid "git worktree unlock <path>"
 msgstr "git worktree unlock <Pfad>"
 
-#: builtin/worktree.c:60 builtin/worktree.c:894
+#: builtin/worktree.c:60 builtin/worktree.c:972
 #, c-format
 msgid "failed to delete '%s'"
 msgstr "Fehler beim Löschen von '%s'"