Merge branch 'jk/completion-tests'

* jk/completion-tests:
  t9902: add completion tests for "odd" filenames
  t9902: add a few basic completion tests
diff --git a/.gitignore b/.gitignore
index 68fe464..a188a82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -194,6 +194,7 @@
 /test-run-command
 /test-sha1
 /test-sigchain
+/test-string-list
 /test-subprocess
 /test-svn-fe
 /common-cmds.h
diff --git a/.mailmap b/.mailmap
index 6303782..bcf4f87 100644
--- a/.mailmap
+++ b/.mailmap
@@ -18,6 +18,7 @@
 David S. Miller <davem@davemloft.net>
 Deskin Miller <deskinm@umich.edu>
 Dirk Süsserott <newsletter@dirk.my1.cc>
+Erik Faye-Lund <kusmabite@gmail.com> <kusmabite@googlemail.com>
 Fredrik Kuivinen <freku045@student.liu.se>
 H. Peter Anvin <hpa@bonde.sc.orionmulti.com>
 H. Peter Anvin <hpa@tazenda.sc.orionmulti.com>
@@ -26,6 +27,9 @@
 İsmail Dönmez <ismail@pardus.org.tr>
 Jay Soffian <jaysoffian+git@gmail.com>
 Joachim Berdal Haga <cjhaga@fys.uio.no>
+Johannes Sixt <j6t@kdbg.org> <johannes.sixt@telecom.at>
+Johannes Sixt <j6t@kdbg.org> <j.sixt@viscovery.net>
+Johannes Sixt <j6t@kdbg.org> <J.Sixt@eudaptics.com>
 Jon Loeliger <jdl@freescale.com>
 Jon Seymour <jon@blackcubes.dyndns.org>
 Jonathan Nieder <jrnieder@uchicago.edu>
@@ -43,6 +47,7 @@
 Li Hong <leehong@pku.edu.cn>
 Lukas Sandström <lukass@etek.chalmers.se>
 Martin Langhoff <martin@laptop.org>
+Martin von Zweigbergk <martinvonz@gmail.com> <martin.von.zweigbergk@gmail.com>
 Michael Coleman <tutufan@gmail.com>
 Michael J Gruber <git@drmicha.warpmail.net> <michaeljgruber+gmane@fastmail.fm>
 Michael W. Olson <mwolson@gnu.org>
@@ -51,7 +56,10 @@
 Nanako Shiraishi <nanako3@lavabit.com>
 Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
 <nico@fluxnic.net> <nico@cam.org>
+Peter Krefting <peter@softwolves.pp.se> <peter@svarten.intern.softwolves.pp.se>
+Peter Krefting <peter@softwolves.pp.se> <peter@softwolves.pp.se>
 Philippe Bruhat <book@cpan.org>
+Ralf Thielow <ralf.thielow@gmail.com> <ralf.thielow@googlemail.com>
 Ramsay Allan Jones <ramsay@ramsay1.demon.co.uk>
 René Scharfe <rene.scharfe@lsrfire.ath.cx>
 Robert Fitzsimons <robfitz@273k.net>
@@ -61,6 +69,7 @@
 Shawn O. Pearce <spearce@spearce.org>
 Steven Grimm <koreth@midwinter.com>
 Theodore Ts'o <tytso@mit.edu>
+Thomas Rast <trast@inf.ethz.ch> <trast@student.ethz.ch>
 Tony Luck <tony.luck@intel.com>
 Uwe Kleine-König <Uwe_Zeisberger@digi.com>
 Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
diff --git a/Documentation/Makefile b/Documentation/Makefile
index cf5916f..267dfe1 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -44,9 +44,10 @@
 man7dir=$(mandir)/man7
 # DESTDIR=
 
-ASCIIDOC=asciidoc
+ASCIIDOC = asciidoc
 ASCIIDOC_EXTRA =
 MANPAGE_XSL = manpage-normal.xsl
+XMLTO = xmlto
 XMLTO_EXTRA =
 INSTALL?=install
 RM ?= rm -f
@@ -245,7 +246,7 @@
 
 %.1 %.5 %.7 : %.xml manpage-base-url.xsl
 	$(QUIET_XMLTO)$(RM) $@ && \
-	xmlto -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
+	$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
 
 %.xml : %.txt
 	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
diff --git a/Documentation/RelNotes/1.7.12.2.txt b/Documentation/RelNotes/1.7.12.2.txt
index 93c7b34..6925574 100644
--- a/Documentation/RelNotes/1.7.12.2.txt
+++ b/Documentation/RelNotes/1.7.12.2.txt
@@ -4,6 +4,9 @@
 Fixes since v1.7.12.1
 ---------------------
 
+ * When "git am" is fed an input that has multiple "Content-type: ..."
+   header, it did not grok charset= attribute correctly.
+
  * Even during a conflicted merge, "git blame $path" always meant to
    blame uncommitted changes to the "working tree" version; make it
    more useful by showing cleanly merged parts as coming from the other
@@ -24,6 +27,11 @@
    is not their language, mildly irritating others. Localization to
    the line has been disabled for now.
 
+ * "git log --all-match --grep=A --grep=B" ought to show commits that
+   mention both A and B, but when these three options are used with
+   --author or --committer, it showed commits that mention either A or
+   B (or both) instead.
+
  * The subcommand to remove the definition of a remote in "git remote"
    was named "rm" even though all other subcommands were spelled out.
    Introduce "git remote remove" to remove confusion, and keep "rm" as
diff --git a/Documentation/RelNotes/1.8.0.txt b/Documentation/RelNotes/1.8.0.txt
new file mode 100644
index 0000000..e183df6
--- /dev/null
+++ b/Documentation/RelNotes/1.8.0.txt
@@ -0,0 +1,230 @@
+Git v1.8.0 Release Notes
+========================
+
+Backward compatibility notes
+----------------------------
+
+In the next major release, we will change the behaviour of the "git
+push" command.  When "git push [$there]" does not say what to push, we
+have used the traditional "matching" semantics (all your branches were
+sent to the remote as long as there already are branches of the same
+name over there).  We will use the "simple" semantics, that pushes the
+current branch to the branch with the same name only when the current
+branch is set to integrate with that remote branch.  There is a user
+preference configuration variable "push.default" to change this, and
+"git push" will warn about the upcoming change until you set this
+variable.
+
+"git branch --set-upstream" is deprecated and may be removed in a
+relatively distant future.  "git branch [-u|--set-upstream-to]" has
+been introduced with a saner order of arguments.
+
+
+Updates since v1.7.12
+---------------------
+
+UI, Workflows & Features
+
+ * A credential helper for Win32 to allow access to the keychain of
+   the logged-in user has been added.
+
+ * An initial port to HP NonStop.
+
+ * A credential helper to allow access to the Gnome keyring has been
+   added.
+
+ * When "git am" sanitizes the Subject: line, we strip the prefix from
+   "Re: subject" and also from a less common "re: subject", but left
+   even less common "RE: subject" intact.
+
+ * It was tempting to say "git branch --set-upstream origin/master",
+   but that tells Git to arrange the local branch "origin/master" to
+   integrate with the currently checked out branch, which is highly
+   unlikely what the user meant.  The option is deprecated; use the
+   new "--set-upstream-to" (with a short-and-sweet "-u") option
+   instead.
+
+ * "git cherry-pick" learned the "--allow-empty-message" option to
+   allow it to replay a commit without any log message.
+
+ * After "git cherry-pick -s" gave control back to the user asking
+   help to resolve conflicts, concluding "git commit" used to need to
+   be run with "-s" if the user wants to sign it off; now the command
+   leaves the sign-off line in the log template.
+
+ * "git daemon" learned the "--access-hook" option to allow an
+   external command to decline service based on the client address,
+   repository path, etc.
+
+ * "git difftool --dir-diff" learned to use symbolic links to prepare
+   temporary copy of the working tree when available.
+
+ * "git grep" learned to use a non-standard pattern type by default if
+   a configuration variable tells it to.
+
+ * "git merge-base" learned "--is-ancestor A B" option to tell if A is
+   an ancestor of B.  The result is indicated by its exit status code.
+
+ * The "-Xours" backend option to "git merge -s recursive" now takes
+   effect even on binary files.
+
+ * "git rebase -i" learned the "--edit-todo" option to open an editor
+   to edit the insn sheet.
+
+
+Foreign Interface
+
+ * "git svn" has been updated to work with SVN 1.7.
+
+ * "git p4" learned "--conflicts" option to specify what to do when
+   encountering a conflict during "p4 submit".
+
+
+Performance, Internal Implementation, etc. (please report possible regressions)
+
+ * Git ships with a fall-back regexp implementation for platforms with
+   buggy regexp library, but it was easy for people to keep using their
+   platform regexp.  A new test has been added to check this.
+
+ * The "check-docs" build target has been updated and greatly
+   simplified.
+
+ * The test suite is run under MALLOC_CHECK_ when running with glibc
+   that supports the feature.
+
+ * The documentation in the TeXinfo format was using indented output
+   for materials meant to be examples that are better typeset in
+   monospace.
+
+ * Compatibility wrapper around some mkdir(2) implementations that
+   reject parameter with trailing slash has been introduced.
+
+ * Compatibility wrapper for systems that lack usable setitimer() has
+   been added.
+
+ * The option parsing of "git checkout" had error checking, dwim and
+   defaulting missing options, all mixed in the code, and issuing an
+   appropriate error message with useful context was getting harder.
+   The code has been reorganized to allow giving a proper diagnosis
+   when the user says "git checkout -b -t foo bar" (e.g. "-t" is not a
+   good name for a branch).
+
+ * Many internal uses of "git merge-base" equivalent were only to see
+   if one commit fast-forwards to the other, which did not need the
+   full set of merge bases to be computed. They have been updated to
+   use less expensive checks.
+
+ * The heuristics to detect and silently convert latin1 to utf8 when
+   we were told to use utf-8 in the log message has been transplanted
+   from "mailinfo" to "commit" and "commit-tree".
+
+ * Messages given by "git <subcommand> -h" from many subcommands have
+   been marked for translation.
+
+
+Also contains minor documentation updates and code clean-ups.
+
+
+Fixes since v1.7.12
+-------------------
+
+Unless otherwise noted, all the fixes since v1.7.12 in the
+maintenance track are contained in this release (see release notes
+to them for details).
+
+ * The attribute system may be asked for a path that itself or its
+   leading directories no longer exists in the working tree, and it is
+   fine if we cannot open .gitattribute file in such a case.  Failure
+   to open per-directory .gitattributes with error status other than
+   ENOENT and ENOTDIR should be diagnosed, but it wasn't.
+
+ * When looking for $HOME/.gitconfig etc., it is OK if we cannot read
+   them because they do not exist, but we did not diagnose existing
+   files that we cannot read.
+
+ * When "git am" is fed an input that has multiple "Content-type: ..."
+   header, it did not grok charset= attribute correctly.
+
+ * "git blame MAKEFILE" run in a history that has "Makefile" but not
+   "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got
+   confused on a case insensitive filesystem and failed to do so.
+
+ * Even during a conflicted merge, "git blame $path" always meant to
+   blame uncommitted changes to the "working tree" version; make it
+   more useful by showing cleanly merged parts as coming from the other
+   branch that is being merged.
+
+ * Output from "git branch -v" contains "(no branch)" that could be
+   localized, but the code to align it along with the names of
+   branches were counting in bytes, not in display columns.
+
+ * "git cherry-pick A C B" used to replay changes in A and then B and
+   then C if these three commits had committer timestamps in that
+   order, which is not what the user who said "A C B" naturally
+   expects.
+
+ * Documentation talked about "first line of commit log" when it meant
+   the title of the commit.  The description was clarified by defining
+   how the title is decided and rewording the casual mention of "first
+   line" to "title".
+
+ * "git cvsimport" did not thoroughly cleanse tag names that it
+   inferred from the names of the tags it obtained from CVS, which
+   caused "git tag" to barf and stop the import in the middle.
+
+ * Earlier we made the diffstat summary line that shows the number of
+   lines added/deleted localizable, but it was found irritating having
+   to see them in various languages on a list whose discussion language
+   is English.
+
+ * "git fetch --all", when passed "--no-tags", did not honor the
+   "--no-tags" option while fetching from individual remotes (the same
+   issue existed with "--tags", but combination "--all --tags" makes
+   much less sense than "--all --no-tags").
+
+ * "git fetch" over http had an old workaround for an unlikely server
+   misconfiguration; it turns out that this hurts debuggability of the
+   configuration in general, and has been reverted.
+   (merge 6ac964a sp/maint-http-info-refs-no-retry later to maint).
+
+ * "git fetch" over http advertised that it supports "deflate", which
+   is much less common, and did not advertise more common "gzip" on
+   its Accept-Encoding header.
+   (merge aa90b96 sp/maint-http-enable-gzip later to maint).
+
+ * After "gitk" showed the contents of a tag, neither "Reread
+   references" nor "Reload" did not update what is shown as the
+   contents of it, when the user overwrote the tag with "git tag -f".
+
+ * "git log --all-match --grep=A --grep=B" ought to show commits that
+   mention both A and B, but when these three options are used with
+   --author or --committer, it showed commits that mention either A or
+   B (or both) instead.
+
+ * "git p4", when "--use-client-spec" and "--detect-branches" are used
+   together, misdetected branches.
+
+ * When you misspell the command name you give to the "exec" action in
+   the "git rebase -i" insn sheet, you are told that 'rebase' is not a
+   git subcommand from "git rebase --continue".
+
+ * The subcommand in "git remote" to remove a defined remote was
+   "rm" and the command did not take a fully-spelled "remove".
+
+ * The interactive prompt "git send-email" gives was error prone. It
+   asked "What e-mail address do you want to use?" with the address it
+   guessed (correctly) the user would want to use in its prompt,
+   tempting the user to say "y". But the response was taken as "No,
+   please use 'y' as the e-mail address instead", which is most
+   certainly not what the user meant.
+
+ * "git show --format='%ci'" did not give timestamp correctly for
+   commits created without human readable name on "committer" line.
+
+ * "git show --quiet" ought to be a synonym for "git show -s", but
+   wasn't.
+
+ * "git submodule frotz" was not diagnosed as "frotz" being an unknown
+   subcommand to "git submodule"; the user instead got a complaint
+   that "git submodule status" was run with an unknown path "frotz".
+   (merge af9c9f9 rr/maint-submodule-unknown-cmd later to maint).
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 122e3c4..11f320b 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1211,8 +1211,16 @@
 grep.lineNumber::
 	If set to true, enable '-n' option by default.
 
+grep.patternType::
+	Set the default matching behavior. Using a value of 'basic', 'extended',
+	'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
+	'--fixed-strings', or '--perl-regexp' option accordingly, while the
+	value 'default' will return to the default matching behavior.
+
 grep.extendedRegexp::
-	If set to true, enable '--extended-regexp' option by default.
+	If set to true, enable '--extended-regexp' option by default. This
+	option is ignored when the 'grep.patternType' option is set to a value
+	other than 'default'.
 
 gpg.program::
 	Use this custom program instead of "gpg" found on $PATH when
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 39d326a..b4d6476 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -10,7 +10,8 @@
 --depth=<depth>::
 	Deepen the history of a 'shallow' repository created by
 	`git clone` with `--depth=<depth>` option (see linkgit:git-clone[1])
-	by the specified number of commits.
+	to the specified number of commits from the tip of each remote
+	branch history. Tags for the deepened commits are not fetched.
 
 ifndef::git-pull[]
 --dry-run::
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index 9c1d395..fd9e36b 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -155,7 +155,7 @@
 The optional configuration variable `core.excludesfile` indicates a path to a
 file containing patterns of file names to exclude from git-add, similar to
 $GIT_DIR/info/exclude.  Patterns in the exclude file are used in addition to
-those in info/exclude.  See linkgit:gitrepository-layout[5].
+those in info/exclude.  See linkgit:gitignore[5].
 
 
 EXAMPLES
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index 7ee9236..e44173f 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -20,6 +20,12 @@
 
 The command can also limit the range of lines annotated.
 
+The origin of lines is automatically followed across whole-file
+renames (currently there is no option to turn the rename-following
+off). To follow lines moved from one file to another, or to follow
+lines that were copied and pasted from another file, etc., see the
+`-C` and `-M` options.
+
 The report does not tell you anything about lines which have been deleted or
 replaced; you need to use a tool such as 'git diff' or the "pickaxe"
 interface briefly mentioned in the following paragraph.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 47235be..45a225e 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -13,6 +13,8 @@
 	[--column[=<options>] | --no-column]
 	[(--merged | --no-merged | --contains) [<commit>]] [<pattern>...]
 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
+'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
+'git branch' --unset-upstream [<branchname>]
 'git branch' (-m | -M) [<oldbranch>] <newbranch>
 'git branch' (-d | -D) [-r] <branchname>...
 'git branch' --edit-description [<branchname>]
@@ -48,7 +50,7 @@
 the remote-tracking branch. This behavior may be changed via the global
 `branch.autosetupmerge` configuration flag. That setting can be
 overridden by using the `--track` and `--no-track` options, and
-changed later using `git branch --set-upstream`.
+changed later using `git branch --set-upstream-to`.
 
 With a `-m` or `-M` option, <oldbranch> will be renamed to <newbranch>.
 If <oldbranch> had a corresponding reflog, it is renamed to match
@@ -129,11 +131,13 @@
 	use `git branch --list <pattern>` to list matching branches.
 
 -v::
+-vv::
 --verbose::
 	When in list mode,
 	show sha1 and commit subject line for each head, along with
 	relationship to upstream branch (if any). If given twice, print
-	the name of the upstream branch, as well.
+	the name of the upstream branch, as well (see also `git remote
+	show <remote>`).
 
 -q::
 --quiet::
@@ -173,6 +177,16 @@
 	like `--track` would when creating the branch, except that where
 	branch points to is not changed.
 
+-u <upstream>::
+--set-upstream-to=<upstream>::
+	Set up <branchname>'s tracking information so <upstream> is
+	considered <branchname>'s upstream branch. If no <branchname>
+	is specified, then it defaults to the current branch.
+
+--unset-upstream::
+	Remove the upstream information for <branchname>. If no branch
+	is specified it defaults to the current branch.
+
 --edit-description::
 	Open an editor and edit the text to explain what the branch is
 	for, to be used by various other commands (e.g. `request-pull`).
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index 0e170a5..c205d23 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -118,6 +118,11 @@
 	previous commit are dropped.  To force the inclusion of those commits
 	use `--keep-redundant-commits`.
 
+--allow-empty-message::
+	By default, cherry-picking a commit with an empty message will fail.
+	This option overrides that behaviour, allowing commits with empty
+	messages to be cherry picked.
+
 --keep-redundant-commits::
 	If a commit being cherry picked duplicates a commit already in the
 	current history, it will become empty.  By default these
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 79fb984..9f42c0d 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -63,6 +63,10 @@
 	Remove only files ignored by git.  This may be useful to rebuild
 	everything from scratch, but keep manually created files.
 
+SEE ALSO
+--------
+linkgit:gitignore[5]
+
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt
index c1ddd4c..6d98ef3 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -29,7 +29,8 @@
 After the clone, a plain `git fetch` without arguments will update
 all the remote-tracking branches, and a `git pull` without
 arguments will in addition merge the remote master branch into the
-current master branch, if any.
+current master branch, if any (this is untrue when "--single-branch"
+is given; see below).
 
 This default configuration is achieved by creating references to
 the remote branch heads under `refs/remotes/origin` and
@@ -152,9 +153,10 @@
 -b <name>::
 	Instead of pointing the newly created HEAD to the branch pointed
 	to by the cloned repository's HEAD, point to `<name>` branch
-	instead. `--branch` can also take tags and treat them like
-	detached HEAD. In a non-bare repository, this is the branch
-	that will be checked out.
+	instead. In a non-bare repository, this is the branch that will
+	be checked out.
+	`--branch` can also take tags and detaches the HEAD at that commit
+	in the resulting repository.
 
 --upload-pack <upload-pack>::
 -u <upload-pack>::
@@ -193,6 +195,11 @@
 	clone with the `--depth` option, this is the default, unless
 	`--no-single-branch` is given to fetch the histories near the
 	tips of all branches.
+	Further fetches into the resulting repository will only update the
+	remote tracking branch for the branch this option was used for the
+	initial cloning.  If the HEAD at the remote did not point at any
+	branch when `--single-branch` clone was made, no remote tracking
+	branch is created.
 
 --recursive::
 --recurse-submodules::
diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt
index e8f7577..7e5098a 100644
--- a/Documentation/git-daemon.txt
+++ b/Documentation/git-daemon.txt
@@ -16,6 +16,7 @@
 	     [--reuseaddr] [--detach] [--pid-file=<file>]
 	     [--enable=<service>] [--disable=<service>]
 	     [--allow-override=<service>] [--forbid-override=<service>]
+	     [--access-hook=<path>]
 	     [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>] [--user=<user> [--group=<group>]]
 	     [<directory>...]
 
@@ -171,6 +172,21 @@
 	errors are not enabled, all errors report "access denied" to the
 	client. The default is --no-informative-errors.
 
+--access-hook=<path>::
+	Every time a client connects, first run an external command
+	specified by the <path> with service name (e.g. "upload-pack"),
+	path to the repository, hostname (%H), canonical hostname
+	(%CH), ip address (%IP), and tcp port (%P) as its command line
+	arguments. The external command can decide to decline the
+	service by exiting with a non-zero status (or to allow it by
+	exiting with a zero status).  It can also look at the $REMOTE_ADDR
+	and $REMOTE_PORT environment variables to learn about the
+	requestor when making this decision.
++
+The external command can optionally write a single line to its
+standard output to be sent to the requestor as an error message when
+it declines the service.
+
 <directory>::
 	A directory to add to the whitelist of allowed directories. Unless
 	--strict-paths is specified this will also include subdirectories
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index 31fc2e3..73ca702 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -69,6 +69,14 @@
 --tool-help::
 	Print a list of diff tools that may be used with `--tool`.
 
+--symlinks::
+--no-symlinks::
+	'git difftool''s default behavior is create symlinks to the
+	working tree when run in `--dir-diff` mode.
++
+	Specifying `--no-symlinks` instructs 'git difftool' to create
+	copies instead.  `--no-symlinks` is the default on Windows.
+
 -x <command>::
 --extcmd=<command>::
 	Specify a custom command for viewing diffs.
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index 3bec036..cfecf84 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -42,8 +42,16 @@
 grep.lineNumber::
 	If set to true, enable '-n' option by default.
 
+grep.patternType::
+	Set the default matching behavior. Using a value of 'basic', 'extended',
+	'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
+	'--fixed-strings', or '--perl-regexp' option accordingly, while the
+	value 'default' will return to the default matching behavior.
+
 grep.extendedRegexp::
-	If set to true, enable '--extended-regexp' option by default.
+	If set to true, enable '--extended-regexp' option by default. This
+	option is ignored when the 'grep.patternType' option is set to a value
+	other than 'default'.
 
 
 OPTIONS
diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt
index b295bf8..87842e3 100644
--- a/Documentation/git-merge-base.txt
+++ b/Documentation/git-merge-base.txt
@@ -11,6 +11,7 @@
 [verse]
 'git merge-base' [-a|--all] <commit> <commit>...
 'git merge-base' [-a|--all] --octopus <commit>...
+'git merge-base' --is-ancestor <commit> <commit>
 'git merge-base' --independent <commit>...
 
 DESCRIPTION
@@ -50,6 +51,12 @@
 	from any other.  This mimics the behavior of 'git show-branch
 	--independent'.
 
+--is-ancestor::
+	Check if the first <commit> is an ancestor of the second <commit>,
+	and exit with status 0 if true, or with status 1 if not.
+	Errors are signaled by a non-zero status that is not 1.
+
+
 OPTIONS
 -------
 -a::
@@ -110,6 +117,27 @@
 the other (both are 'best' merge bases).  When the `--all` option is not given,
 it is unspecified which best one is output.
 
+A common idiom to check "fast-forward-ness" between two commits A
+and B is (or at least used to be) to compute the merge base between
+A and B, and check if it is the same as A, in which case, A is an
+ancestor of B.  You will see this idiom used often in older scripts.
+
+	A=$(git rev-parse --verify A)
+	if test "$A" = "$(git merge-base A B)"
+	then
+		... A is an ancestor of B ...
+	fi
+
+In modern git, you can say this in a more direct way:
+
+	if git merge-base --is-ancestor A B
+	then
+		... A is an ancestor of B ...
+	fi
+
+instead.
+
+
 See also
 --------
 linkgit:git-rev-list[1],
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index d7207bd..6b563c5 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -64,6 +64,9 @@
 Otherwise, 'git mergetool' will prompt the user to indicate the
 success of the resolution after the custom tool has exited.
 
+--tool-help::
+	Print a list of merge tools that may be used with `--tool`.
+
 -y::
 --no-prompt::
 	Don't prompt before each invocation of the merge resolution
diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt
index 8228f33..beff622 100644
--- a/Documentation/git-p4.txt
+++ b/Documentation/git-p4.txt
@@ -163,7 +163,7 @@
 --git-dir <dir>::
 	Set the 'GIT_DIR' environment variable.  See linkgit:git[1].
 
---verbose::
+--verbose, -v::
 	Provide more progress information.
 
 Sync options
@@ -269,6 +269,24 @@
 	Export tags from git as p4 labels. Tags found in git are applied
 	to the perforce working directory.
 
+--dry-run, -n::
+	Show just what commits would be submitted to p4; do not change
+	state in git or p4.
+
+--prepare-p4-only::
+	Apply a commit to the p4 workspace, opening, adding and deleting
+	files in p4 as for a normal submit operation.  Do not issue the
+	final "p4 submit", but instead print a message about how to
+	submit manually or revert.  This option always stops after the
+	first (oldest) commit.  Git tags are not exported to p4.
+
+--conflict=(ask|skip|quit)::
+	Conflicts can occur when applying a commit to p4.  When this
+	happens, the default behavior ("ask") is to prompt whether to
+	skip this commit and continue, or quit.  This option can be used
+	to bypass the prompt, causing conflicting commits to be automatically
+	skipped, or to quit trying to apply commits, without prompting.
+
 Rebase options
 ~~~~~~~~~~~~~~
 These options can be used to modify 'git p4 rebase' behavior.
@@ -519,6 +537,10 @@
 	Only p4 labels matching this regular expression will be exported. The
 	default value is '[a-zA-Z0-9_\-.]+$'.
 
+git-p4.conflict::
+	Specify submit behavior when a conflict with p4 is found, as per
+	--conflict.  The default behavior is 'ask'.
+
 IMPLEMENTATION DETAILS
 ----------------------
 * Changesets from p4 are imported using git fast-import.
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index fd535b0..da067ec 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -12,7 +12,7 @@
 	[<upstream>] [<branch>]
 'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
 	--root [<branch>]
-'git rebase' --continue | --skip | --abort
+'git rebase' --continue | --skip | --abort | --edit-todo
 
 DESCRIPTION
 -----------
@@ -245,6 +245,9 @@
 --skip::
 	Restart the rebasing process by skipping the current patch.
 
+--edit-todo::
+	Edit the todo list during an interactive rebase.
+
 -m::
 --merge::
 	Use merging strategies to rebase.  When the recursive (default) merge
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 2de7bf0..b4683bb 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -112,7 +112,6 @@
 	initialized, `+` if the currently checked out submodule commit
 	does not match the SHA-1 found in the index of the containing
 	repository and `U` if the submodule has merge conflicts.
-	This command is the default command for 'git submodule'.
 +
 If `--recursive` is specified, this command will recurse into nested
 submodules, and show their status as well.
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 6710cb0..48bd04e 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,9 +43,10 @@
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
-* link:v1.7.12.1/git.html[documentation for release 1.7.12.1]
+* link:v1.7.12.2/git.html[documentation for release 1.7.12.2]
 
 * release notes for
+  link:RelNotes/1.7.12.2.txt[1.7.12.2],
   link:RelNotes/1.7.12.1.txt[1.7.12.1],
   link:RelNotes/1.7.12.txt[1.7.12].
 
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index e16f3e1..99ed04d 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -511,6 +511,8 @@
 attribute mechanism, via `.gitattributes`).  The following built in
 patterns are available:
 
+- `ada` suitable for source code in the Ada language.
+
 - `bibtex` suitable for files with BibTeX coded references.
 
 - `cpp` suitable for source code in the C and C++ languages.
@@ -927,7 +929,7 @@
 macro attribute "binary" is equivalent to:
 
 ------------
-[attr]binary -diff -text
+[attr]binary -diff -merge -text
 ------------
 
 
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index c1f692a..96639e0 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -41,18 +41,24 @@
    variable 'core.excludesfile'.
 
 Which file to place a pattern in depends on how the pattern is meant to
-be used. Patterns which should be version-controlled and distributed to
-other repositories via clone (i.e., files that all developers will want
-to ignore) should go into a `.gitignore` file. Patterns which are
-specific to a particular repository but which do not need to be shared
-with other related repositories (e.g., auxiliary files that live inside
-the repository but are specific to one user's workflow) should go into
-the `$GIT_DIR/info/exclude` file.  Patterns which a user wants git to
-ignore in all situations (e.g., backup or temporary files generated by
-the user's editor of choice) generally go into a file specified by
-`core.excludesfile` in the user's `~/.gitconfig`. Its default value is
-$XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty,
-$HOME/.config/git/ignore is used instead.
+be used.
+
+ * Patterns which should be version-controlled and distributed to
+   other repositories via clone (i.e., files that all developers will want
+   to ignore) should go into a `.gitignore` file.
+
+ * Patterns which are
+   specific to a particular repository but which do not need to be shared
+   with other related repositories (e.g., auxiliary files that live inside
+   the repository but are specific to one user's workflow) should go into
+   the `$GIT_DIR/info/exclude` file.
+
+ * Patterns which a user wants git to
+   ignore in all situations (e.g., backup or temporary files generated by
+   the user's editor of choice) generally go into a file specified by
+   `core.excludesfile` in the user's `~/.gitconfig`. Its default value is
+   $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or
+   empty, $HOME/.config/git/ignore is used instead.
 
 The underlying git plumbing tools, such as
 'git ls-files' and 'git read-tree', read
diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt
index 595a3cf..66db802 100644
--- a/Documentation/merge-strategies.txt
+++ b/Documentation/merge-strategies.txt
@@ -32,13 +32,14 @@
 	This option forces conflicting hunks to be auto-resolved cleanly by
 	favoring 'our' version.  Changes from the other tree that do not
 	conflict with our side are reflected to the merge result.
+	For a binary file, the entire contents are taken from our side.
 +
 This should not be confused with the 'ours' merge strategy, which does not
 even look at what the other tree contains at all.  It discards everything
 the other tree did, declaring 'our' history contains all that happened in it.
 
 theirs;;
-	This is opposite of 'ours'.
+	This is the opposite of 'ours'.
 
 patience;;
 	With this option, 'merge-recursive' spends a little extra time
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 918c110..1fc2a18 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -3,8 +3,15 @@
 
 Besides specifying a range of commits that should be listed using the
 special notations explained in the description, additional commit
-limiting may be applied. Note that they are applied before commit
-ordering and formatting options, such as '--reverse'.
+limiting may be applied.
+
+Using more options generally further limits the output (e.g.
+`--since=<date1>` limits to commits newer than `<date1>`, and using it
+with `--grep=<pattern>` further limits to commits whose log message
+has a line that matches `<pattern>`), unless otherwise noted.
+
+Note that these are applied before commit
+ordering and formatting options, such as `--reverse`.
 
 --
 
@@ -39,16 +46,22 @@
 --committer=<pattern>::
 
 	Limit the commits output to ones with author/committer
-	header lines that match the specified pattern (regular expression).
+	header lines that match the specified pattern (regular
+	expression).  With more than one `--author=<pattern>`,
+	commits whose author matches any of the given patterns are
+	chosen (similarly for multiple `--committer=<pattern>`).
 
 --grep=<pattern>::
 
 	Limit the commits output to ones with log message that
-	matches the specified pattern (regular expression).
+	matches the specified pattern (regular expression).  With
+	more than one `--grep=<pattern>`, commits whose message
+	matches any of the given patterns are chosen (but see
+	`--all-match`).
 
 --all-match::
 	Limit the commits output to ones that match all given --grep,
-	--author and --committer instead of ones that match at least one.
+	instead of ones that match at least one.
 
 -i::
 --regexp-ignore-case::
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 69d996b..991fcd8 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -55,6 +55,8 @@
 +
 Note that any of the 'refs/*' cases above may come either from
 the '$GIT_DIR/refs' directory or from the '$GIT_DIR/packed-refs' file.
+While the ref name encoding is unspecified, UTF-8 is prefered as
+some output processing may assume ref names in UTF-8.
 
 '<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}'::
   A ref followed by the suffix '@' with a date specification
diff --git a/Documentation/technical/api-sha1-array.txt b/Documentation/technical/api-sha1-array.txt
index 4a4bae8..45d1c51 100644
--- a/Documentation/technical/api-sha1-array.txt
+++ b/Documentation/technical/api-sha1-array.txt
@@ -25,9 +25,6 @@
 	the array (but note that some operations below may lose this
 	ordering).
 
-`sha1_array_sort`::
-	Sort the elements in the array.
-
 `sha1_array_lookup`::
 	Perform a binary search of the array for a specific sha1.
 	If found, returns the offset (in number of elements) of the
diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt
index 5a0c14f..94d7a2b 100644
--- a/Documentation/technical/api-string-list.txt
+++ b/Documentation/technical/api-string-list.txt
@@ -1,8 +1,9 @@
 string-list API
 ===============
 
-The string_list API offers a data structure and functions to handle sorted
-and unsorted string lists.
+The string_list API offers a data structure and functions to handle
+sorted and unsorted string lists.  A "sorted" list is one whose
+entries are sorted by string value in `strcmp()` order.
 
 The 'string_list' struct used to be called 'path_list', but was renamed
 because it is not specific to paths.
@@ -20,8 +21,9 @@
 member (you need this if you add things later) and you should set the
 `nr` and `alloc` members in that case, too.
 
-. Adds new items to the list, using `string_list_append` or
-  `string_list_insert`.
+. Adds new items to the list, using `string_list_append`,
+  `string_list_append_nodup`, `string_list_insert`,
+  `string_list_split`, and/or `string_list_split_in_place`.
 
 . Can check if a string is in the list using `string_list_has_string` or
   `unsorted_string_list_has_string` and get it from the list using
@@ -29,18 +31,23 @@
 
 . Can sort an unsorted list using `sort_string_list`.
 
+. Can remove duplicate items from a sorted list using
+  `string_list_remove_duplicates`.
+
 . Can remove individual items of an unsorted list using
   `unsorted_string_list_delete_item`.
 
+. Can remove items not matching a criterion from a sorted or unsorted
+  list using `filter_string_list`.
+
 . Finally it should free the list using `string_list_clear`.
 
 Example:
 
 ----
-struct string_list list;
+struct string_list list = STRING_LIST_INIT_NODUP;
 int i;
 
-memset(&list, 0, sizeof(struct string_list));
 string_list_append(&list, "foo");
 string_list_append(&list, "bar");
 for (i = 0; i < list.nr; i++)
@@ -60,6 +67,22 @@
 
 * General ones (works with sorted and unsorted lists as well)
 
+`filter_string_list`::
+
+	Apply a function to each item in a list, retaining only the
+	items for which the function returns true.  If free_util is
+	true, call free() on the util members of any items that have
+	to be deleted.  Preserve the order of the items that are
+	retained.
+
+`string_list_longest_prefix`::
+
+	Return the longest string within a string_list that is a
+	prefix (in the sense of prefixcmp()) of the specified string,
+	or NULL if no such prefix exists.  This function does not
+	require the string_list to be sorted (it does a linear
+	search).
+
 `print_string_list`::
 
 	Dump a string_list to stdout, useful mainly for debugging purposes. It
@@ -96,15 +119,32 @@
 	Look up a given string in the string_list, returning the containing
 	string_list_item. If the string is not found, NULL is returned.
 
+`string_list_remove_duplicates`::
+
+	Remove all but the first of consecutive entries that have the
+	same string value.  If free_util is true, call free() on the
+	util members of any items that have to be deleted.
+
 * Functions for unsorted lists only
 
 `string_list_append`::
 
-	Append a new string to the end of the string_list.
+	Append a new string to the end of the string_list.  If
+	`strdup_string` is set, then the string argument is copied;
+	otherwise the new `string_list_entry` refers to the input
+	string.
+
+`string_list_append_nodup`::
+
+	Append a new string to the end of the string_list.  The new
+	`string_list_entry` always refers to the input string, even if
+	`strdup_string` is set.  This function can be used to hand
+	ownership of a malloc()ed string to a `string_list` that has
+	`strdup_string` set.
 
 `sort_string_list`::
 
-	Make an unsorted list sorted.
+	Sort the list's entries by string value in `strcmp()` order.
 
 `unsorted_string_list_has_string`::
 
@@ -124,6 +164,25 @@
 	is set. The third parameter controls if the `util` pointer of the
 	items should be freed or not.
 
+`string_list_split`::
+`string_list_split_in_place`::
+
+	Split a string into substrings on a delimiter character and
+	append the substrings to a `string_list`.  If `maxsplit` is
+	non-negative, then split at most `maxsplit` times.  Return the
+	number of substrings appended to the list.
++
+`string_list_split` requires a `string_list` that has `strdup_strings`
+set to true; it leaves the input string untouched and makes copies of
+the substrings in newly-allocated memory.
+`string_list_split_in_place` requires a `string_list` that has
+`strdup_strings` set to false; it splits the input string in place,
+overwriting the delimiter characters with NULs and creating new
+string_list_items that point into the original string (the original
+string must therefore not be modified or freed while the `string_list`
+is in use).
+
+
 Data structures
 ---------------
 
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index c4220a0..d2d2d69 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.7.12.1
+DEF_VER=v1.7.12.GIT
 
 LF='
 '
diff --git a/Makefile b/Makefile
index 26b697d..8413606 100644
--- a/Makefile
+++ b/Makefile
@@ -90,6 +90,8 @@
 #
 # Define NO_MKDTEMP if you don't have mkdtemp in the C library.
 #
+# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
+#
 # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
 #
 # Define NO_STRTOK_R if you don't have strtok_r in the C library.
@@ -143,6 +145,12 @@
 #
 # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
 #
+# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
+#
+# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
+#
+# Define NO_UINTMAX_T if you don't have uintmax_t.
+#
 # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
 # Patrick Mauritz).
 #
@@ -152,11 +160,21 @@
 #
 # Define NO_MMAP if you want to avoid mmap.
 #
+# Define NO_SYS_POLL_H if you don't have sys/poll.h.
+#
+# Define NO_POLL if you do not have or don't want to use poll().
+# This also implies NO_SYS_POLL_H.
+#
 # Define NO_PTHREADS if you do not have or do not want to use Pthreads.
 #
 # Define NO_PREAD if you have a problem with pread() system call (e.g.
 # cygwin1.dll before v1.5.22).
 #
+# Define NO_SETITIMER if you don't have setitimer()
+#
+# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
+# This also implies NO_SETITIMER
+#
 # Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
 # thread-safe. (e.g. compat/pread.c or cygwin)
 #
@@ -502,6 +520,7 @@
 TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
 TEST_PROGRAMS_NEED_X += test-sha1
 TEST_PROGRAMS_NEED_X += test-sigchain
+TEST_PROGRAMS_NEED_X += test-string-list
 TEST_PROGRAMS_NEED_X += test-subprocess
 TEST_PROGRAMS_NEED_X += test-svn-fe
 
@@ -596,10 +615,10 @@
 LIB_H += compat/cygwin.h
 LIB_H += compat/mingw.h
 LIB_H += compat/obstack.h
+LIB_H += compat/poll/poll.h
 LIB_H += compat/precompose_utf8.h
 LIB_H += compat/terminal.h
 LIB_H += compat/win32/dirent.h
-LIB_H += compat/win32/poll.h
 LIB_H += compat/win32/pthread.h
 LIB_H += compat/win32/syslog.h
 LIB_H += connected.h
@@ -1217,7 +1236,7 @@
 	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
-	NO_SYS_POLL_H = YesPlease
+	NO_POLL = YesPlease
 	NO_SYMLINK_HEAD = YesPlease
 	NO_IPV6 = YesPlease
 	NO_UNIX_SOCKETS = YesPlease
@@ -1258,7 +1277,7 @@
 	BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
 	COMPAT_OBJS = compat/msvc.o compat/winansi.o \
 		compat/win32/pthread.o compat/win32/syslog.o \
-		compat/win32/poll.o compat/win32/dirent.o
+		compat/win32/dirent.o
 	COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
 	BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
 	EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
@@ -1308,12 +1327,67 @@
 	NO_CURL =
 	NO_EXPAT =
 endif
+ifeq ($(uname_S),NONSTOP_KERNEL)
+	# Needs some C99 features, "inline" is just one of them.
+	# INLINE='' would just replace one set of warnings with another and
+	# still not compile in c89 mode, due to non-const array initializations.
+	CC = cc -c99
+	# Disable all optimization, seems to result in bad code, with -O or -O2
+	# or even -O1 (default), /usr/local/libexec/git-core/git-pack-objects
+	# abends on "git push". Needs more investigation.
+	CFLAGS = -g -O0
+	# We'd want it to be here.
+	prefix = /usr/local
+	# Our's are in ${prefix}/bin (perl might also be in /usr/bin/perl).
+	PERL_PATH = ${prefix}/bin/perl
+	PYTHON_PATH = ${prefix}/bin/python
+
+	# As detected by './configure'.
+	# Missdetected, hence commented out, see below.
+	#NO_CURL = YesPlease
+	# Added manually, see above.
+	NEEDS_SSL_WITH_CURL = YesPlease
+	HAVE_LIBCHARSET_H = YesPlease
+	NEEDS_LIBICONV = YesPlease
+	NEEDS_LIBINTL_BEFORE_LIBICONV = YesPlease
+	NO_SYS_SELECT_H = UnfortunatelyYes
+	NO_D_TYPE_IN_DIRENT = YesPlease
+	NO_HSTRERROR = YesPlease
+	NO_STRCASESTR = YesPlease
+	NO_FNMATCH_CASEFOLD = YesPlease
+	NO_MEMMEM = YesPlease
+	NO_STRLCPY = YesPlease
+	NO_SETENV = YesPlease
+	NO_UNSETENV = YesPlease
+	NO_MKDTEMP = YesPlease
+	NO_MKSTEMPS = YesPlease
+	# Currently libiconv-1.9.1.
+	OLD_ICONV = UnfortunatelyYes
+	NO_REGEX = YesPlease
+	NO_PTHREADS = UnfortunatelyYes
+
+	# Not detected (nor checked for) by './configure'.
+	# We don't have SA_RESTART on NonStop, unfortunalety.
+	COMPAT_CFLAGS += -DSA_RESTART=0
+	# Apparently needed in compat/fnmatch/fnmatch.c.
+	COMPAT_CFLAGS += -DHAVE_STRING_H=1
+	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
+	NO_NSEC = YesPlease
+	NO_PREAD = YesPlease
+	NO_MMAP = YesPlease
+	NO_POLL = YesPlease
+	NO_INTPTR_T = UnfortunatelyYes
+	# Bug report 10-120822-4477 submitted to HP NonStop development.
+	MKDIR_WO_TRAILING_SLASH = YesPlease
+	# RFE 10-120912-4693 submitted to HP NonStop development.
+	NO_SETITIMER = UnfortunatelyYes
+endif
 ifneq (,$(findstring MINGW,$(uname_S)))
 	pathsep = ;
 	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
-	NO_SYS_POLL_H = YesPlease
+	NO_POLL = YesPlease
 	NO_SYMLINK_HEAD = YesPlease
 	NO_UNIX_SOCKETS = YesPlease
 	NO_SETENV = YesPlease
@@ -1348,7 +1422,7 @@
 	COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
 	COMPAT_OBJS += compat/mingw.o compat/winansi.o \
 		compat/win32/pthread.o compat/win32/syslog.o \
-		compat/win32/poll.o compat/win32/dirent.o
+		compat/win32/dirent.o
 	EXTLIBS += -lws2_32
 	PTHREAD_LIBS =
 	X = .exe
@@ -1544,6 +1618,9 @@
 	else
 		ICONV_LINK =
 	endif
+	ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
+		ICONV_LINK += -lintl
+	endif
 	EXTLIBS += $(ICONV_LINK) -liconv
 endif
 ifdef NEEDS_LIBGEN
@@ -1602,6 +1679,11 @@
 	BASIC_CFLAGS += -DNO_GETTEXT
 	USE_GETTEXT_SCHEME ?= fallthrough
 endif
+ifdef NO_POLL
+	NO_SYS_POLL_H = YesPlease
+	COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
+	COMPAT_OBJS += compat/poll/poll.o
+endif
 ifdef NO_STRCASESTR
 	COMPAT_CFLAGS += -DNO_STRCASESTR
 	COMPAT_OBJS += compat/strcasestr.o
@@ -1640,6 +1722,10 @@
 	COMPAT_CFLAGS += -DNO_MKDTEMP
 	COMPAT_OBJS += compat/mkdtemp.o
 endif
+ifdef MKDIR_WO_TRAILING_SLASH
+	COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
+	COMPAT_OBJS += compat/mkdir.o
+endif
 ifdef NO_MKSTEMPS
 	COMPAT_CFLAGS += -DNO_MKSTEMPS
 endif
@@ -1671,6 +1757,13 @@
 ifdef OBJECT_CREATION_USES_RENAMES
 	COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
 endif
+ifdef NO_STRUCT_ITIMERVAL
+	COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
+	NO_SETITIMER=YesPlease
+endif
+ifdef NO_SETITIMER
+	COMPAT_CFLAGS += -DNO_SETITIMER
+endif
 ifdef NO_PREAD
 	COMPAT_CFLAGS += -DNO_PREAD
 	COMPAT_OBJS += compat/pread.o
@@ -1688,6 +1781,9 @@
 ifdef NO_IPV6
 	BASIC_CFLAGS += -DNO_IPV6
 endif
+ifdef NO_INTPTR_T
+	COMPAT_CFLAGS += -DNO_INTPTR_T
+endif
 ifdef NO_UINTMAX_T
 	BASIC_CFLAGS += -Duintmax_t=uint32_t
 endif
diff --git a/RelNotes b/RelNotes
index 8ee12bf..2484b38 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.7.12.2.txt
\ No newline at end of file
+Documentation/RelNotes/1.8.0.txt
\ No newline at end of file
diff --git a/abspath.c b/abspath.c
index f04ac18..05f2d79 100644
--- a/abspath.c
+++ b/abspath.c
@@ -35,6 +35,9 @@
 	if (path == buf || path == next_buf)
 		return path;
 
+	if (!*path)
+		die("The empty string is not a valid path");
+
 	if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
 		die ("Too long path: %.*s", 60, path);
 
@@ -42,8 +45,8 @@
 		if (!is_directory(buf)) {
 			char *last_slash = find_last_dir_sep(buf);
 			if (last_slash) {
-				*last_slash = '\0';
 				last_elem = xstrdup(last_slash + 1);
+				last_slash[1] = '\0';
 			} else {
 				last_elem = xstrdup(buf);
 				*buf = '\0';
@@ -123,7 +126,9 @@
 {
 	static char buf[PATH_MAX + 1];
 
-	if (is_absolute_path(path)) {
+	if (!*path) {
+		die("The empty string is not a valid path");
+	} else if (is_absolute_path(path)) {
 		if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
 			die("Too long path: %.*s", 60, path);
 	} else {
diff --git a/archive-zip.c b/archive-zip.c
index f5af81f..55f66b4 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -4,6 +4,7 @@
 #include "cache.h"
 #include "archive.h"
 #include "streaming.h"
+#include "utf8.h"
 
 static int zip_date;
 static int zip_time;
@@ -16,7 +17,8 @@
 static unsigned int zip_dir_entries;
 
 #define ZIP_DIRECTORY_MIN_SIZE	(1024 * 1024)
-#define ZIP_STREAM (8)
+#define ZIP_STREAM	(1 <<  3)
+#define ZIP_UTF8	(1 << 11)
 
 struct zip_local_header {
 	unsigned char magic[4];
@@ -74,6 +76,14 @@
 	unsigned char _end[1];
 };
 
+struct zip_extra_mtime {
+	unsigned char magic[2];
+	unsigned char extra_size[2];
+	unsigned char flags[1];
+	unsigned char mtime[4];
+	unsigned char _end[1];
+};
+
 /*
  * On ARM, padding is added at the end of the struct, so a simple
  * sizeof(struct ...) reports two bytes more than the payload size
@@ -83,6 +93,9 @@
 #define ZIP_DATA_DESC_SIZE	offsetof(struct zip_data_desc, _end)
 #define ZIP_DIR_HEADER_SIZE	offsetof(struct zip_dir_header, _end)
 #define ZIP_DIR_TRAILER_SIZE	offsetof(struct zip_dir_trailer, _end)
+#define ZIP_EXTRA_MTIME_SIZE	offsetof(struct zip_extra_mtime, _end)
+#define ZIP_EXTRA_MTIME_PAYLOAD_SIZE \
+	(ZIP_EXTRA_MTIME_SIZE - offsetof(struct zip_extra_mtime, flags))
 
 static void copy_le16(unsigned char *dest, unsigned int n)
 {
@@ -164,6 +177,17 @@
 	copy_le32(header->size, size);
 }
 
+static int has_only_ascii(const char *s)
+{
+	for (;;) {
+		int c = *s++;
+		if (c == '\0')
+			return 1;
+		if (!isascii(c))
+			return 0;
+	}
+}
+
 #define STREAM_BUFFER_SIZE (1024 * 16)
 
 static int write_zip_entry(struct archiver_args *args,
@@ -173,6 +197,7 @@
 {
 	struct zip_local_header header;
 	struct zip_dir_header dirent;
+	struct zip_extra_mtime extra;
 	unsigned long attr2;
 	unsigned long compressed_size;
 	unsigned long crc;
@@ -187,6 +212,13 @@
 
 	crc = crc32(0, NULL, 0);
 
+	if (!has_only_ascii(path)) {
+		if (is_utf8(path))
+			flags |= ZIP_UTF8;
+		else
+			warning("Path is not valid UTF-8: %s", path);
+	}
+
 	if (pathlen > 0xffff) {
 		return error("path too long (%d chars, SHA1: %s): %s",
 				(int)pathlen, sha1_to_hex(sha1), path);
@@ -246,8 +278,13 @@
 		}
 	}
 
+	copy_le16(extra.magic, 0x5455);
+	copy_le16(extra.extra_size, ZIP_EXTRA_MTIME_PAYLOAD_SIZE);
+	extra.flags[0] = 1;	/* just mtime */
+	copy_le32(extra.mtime, args->time);
+
 	/* make sure we have enough free space in the dictionary */
-	direntsize = ZIP_DIR_HEADER_SIZE + pathlen;
+	direntsize = ZIP_DIR_HEADER_SIZE + pathlen + ZIP_EXTRA_MTIME_SIZE;
 	while (zip_dir_size < zip_dir_offset + direntsize) {
 		zip_dir_size += ZIP_DIRECTORY_MIN_SIZE;
 		zip_dir = xrealloc(zip_dir, zip_dir_size);
@@ -263,7 +300,7 @@
 	copy_le16(dirent.mdate, zip_date);
 	set_zip_dir_data_desc(&dirent, size, compressed_size, crc);
 	copy_le16(dirent.filename_length, pathlen);
-	copy_le16(dirent.extra_length, 0);
+	copy_le16(dirent.extra_length, ZIP_EXTRA_MTIME_SIZE);
 	copy_le16(dirent.comment_length, 0);
 	copy_le16(dirent.disk, 0);
 	copy_le16(dirent.attr1, 0);
@@ -281,11 +318,13 @@
 	else
 		set_zip_header_data_desc(&header, size, compressed_size, crc);
 	copy_le16(header.filename_length, pathlen);
-	copy_le16(header.extra_length, 0);
+	copy_le16(header.extra_length, ZIP_EXTRA_MTIME_SIZE);
 	write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE);
 	zip_offset += ZIP_LOCAL_HEADER_SIZE;
 	write_or_die(1, path, pathlen);
 	zip_offset += pathlen;
+	write_or_die(1, &extra, ZIP_EXTRA_MTIME_SIZE);
+	zip_offset += ZIP_EXTRA_MTIME_SIZE;
 	if (stream && method == 0) {
 		unsigned char buf[STREAM_BUFFER_SIZE];
 		ssize_t readlen;
@@ -382,6 +421,8 @@
 	zip_dir_offset += ZIP_DIR_HEADER_SIZE;
 	memcpy(zip_dir + zip_dir_offset, path, pathlen);
 	zip_dir_offset += pathlen;
+	memcpy(zip_dir + zip_dir_offset, &extra, ZIP_EXTRA_MTIME_SIZE);
+	zip_dir_offset += ZIP_EXTRA_MTIME_SIZE;
 	zip_dir_entries++;
 
 	return 0;
diff --git a/archive.c b/archive.c
index a484433..4666404 100644
--- a/archive.c
+++ b/archive.c
@@ -7,10 +7,10 @@
 #include "unpack-trees.h"
 
 static char const * const archive_usage[] = {
-	"git archive [options] <tree-ish> [<path>...]",
-	"git archive --list",
-	"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]",
-	"git archive --remote <repo> [--exec <cmd>] --list",
+	N_("git archive [options] <tree-ish> [<path>...]"),
+	N_("git archive --list"),
+	N_("git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"),
+	N_("git archive --remote <repo> [--exec <cmd>] --list"),
 	NULL
 };
 
@@ -319,16 +319,16 @@
 	int worktree_attributes = 0;
 	struct option opts[] = {
 		OPT_GROUP(""),
-		OPT_STRING(0, "format", &format, "fmt", "archive format"),
-		OPT_STRING(0, "prefix", &base, "prefix",
-			"prepend prefix to each pathname in the archive"),
-		OPT_STRING('o', "output", &output, "file",
-			"write the archive to this file"),
+		OPT_STRING(0, "format", &format, N_("fmt"), N_("archive format")),
+		OPT_STRING(0, "prefix", &base, N_("prefix"),
+			N_("prepend prefix to each pathname in the archive")),
+		OPT_STRING('o', "output", &output, N_("file"),
+			N_("write the archive to this file")),
 		OPT_BOOL(0, "worktree-attributes", &worktree_attributes,
-			"read .gitattributes in working directory"),
-		OPT__VERBOSE(&verbose, "report archived files on stderr"),
-		OPT__COMPR('0', &compression_level, "store only", 0),
-		OPT__COMPR('1', &compression_level, "compress faster", 1),
+			N_("read .gitattributes in working directory")),
+		OPT__VERBOSE(&verbose, N_("report archived files on stderr")),
+		OPT__COMPR('0', &compression_level, N_("store only"), 0),
+		OPT__COMPR('1', &compression_level, N_("compress faster"), 1),
 		OPT__COMPR_HIDDEN('2', &compression_level, 2),
 		OPT__COMPR_HIDDEN('3', &compression_level, 3),
 		OPT__COMPR_HIDDEN('4', &compression_level, 4),
@@ -336,15 +336,15 @@
 		OPT__COMPR_HIDDEN('6', &compression_level, 6),
 		OPT__COMPR_HIDDEN('7', &compression_level, 7),
 		OPT__COMPR_HIDDEN('8', &compression_level, 8),
-		OPT__COMPR('9', &compression_level, "compress better", 9),
+		OPT__COMPR('9', &compression_level, N_("compress better"), 9),
 		OPT_GROUP(""),
 		OPT_BOOL('l', "list", &list,
-			"list supported archive formats"),
+			N_("list supported archive formats")),
 		OPT_GROUP(""),
-		OPT_STRING(0, "remote", &remote, "repo",
-			"retrieve the archive from remote repository <repo>"),
-		OPT_STRING(0, "exec", &exec, "cmd",
-			"path to the remote git-upload-archive command"),
+		OPT_STRING(0, "remote", &remote, N_("repo"),
+			N_("retrieve the archive from remote repository <repo>")),
+		OPT_STRING(0, "exec", &exec, N_("command"),
+			N_("path to the remote git-upload-archive command")),
 		OPT_END()
 	};
 
diff --git a/attr.c b/attr.c
index 056d702..887a9ae 100644
--- a/attr.c
+++ b/attr.c
@@ -306,7 +306,7 @@
 }
 
 static const char *builtin_attr[] = {
-	"[attr]binary -diff -text",
+	"[attr]binary -diff -merge -text",
 	NULL,
 };
 
diff --git a/bisect.c b/bisect.c
index 48acf73..1aad49b 100644
--- a/bisect.c
+++ b/bisect.c
@@ -833,7 +833,7 @@
  */
 static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
 {
-	char *filename = xstrdup(git_path("BISECT_ANCESTORS_OK"));
+	char *filename = git_pathdup("BISECT_ANCESTORS_OK");
 	struct stat st;
 	int fd;
 
diff --git a/builtin.h b/builtin.h
index 8e37752..95116b8 100644
--- a/builtin.h
+++ b/builtin.h
@@ -21,7 +21,6 @@
 
 extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
 			 struct fmt_merge_msg_opts *);
-extern void commit_notes(struct notes_tree *t, const char *msg);
 
 struct notes_rewrite_cfg {
 	struct notes_tree **trees;
@@ -33,7 +32,6 @@
 	int mode_from_env;
 };
 
-combine_notes_fn parse_combine_notes_fn(const char *v);
 struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd);
 int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
 			  const unsigned char *from_obj, const unsigned char *to_obj);
diff --git a/builtin/add.c b/builtin/add.c
index 89dce56..e664100 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -16,7 +16,7 @@
 #include "bulk-checkin.h"
 
 static const char * const builtin_add_usage[] = {
-	"git add [options] [--] <filepattern>...",
+	N_("git add [options] [--] <filepattern>..."),
 	NULL
 };
 static int patch_interactive, add_interactive, edit_interactive;
@@ -260,7 +260,7 @@
 
 static int edit_patch(int argc, const char **argv, const char *prefix)
 {
-	char *file = xstrdup(git_path("ADD_EDIT.patch"));
+	char *file = git_pathdup("ADD_EDIT.patch");
 	const char *apply_argv[] = { "apply", "--recount", "--cached",
 		NULL, NULL };
 	struct child_process child;
@@ -303,6 +303,7 @@
 		die (_("Could not apply '%s'"), file);
 
 	unlink(file);
+	free(file);
 	return 0;
 }
 
@@ -315,19 +316,19 @@
 static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0;
 
 static struct option builtin_add_options[] = {
-	OPT__DRY_RUN(&show_only, "dry run"),
-	OPT__VERBOSE(&verbose, "be verbose"),
+	OPT__DRY_RUN(&show_only, N_("dry run")),
+	OPT__VERBOSE(&verbose, N_("be verbose")),
 	OPT_GROUP(""),
-	OPT_BOOLEAN('i', "interactive", &add_interactive, "interactive picking"),
-	OPT_BOOLEAN('p', "patch", &patch_interactive, "select hunks interactively"),
-	OPT_BOOLEAN('e', "edit", &edit_interactive, "edit current diff and apply"),
-	OPT__FORCE(&ignored_too, "allow adding otherwise ignored files"),
-	OPT_BOOLEAN('u', "update", &take_worktree_changes, "update tracked files"),
-	OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, "record only the fact that the path will be added later"),
-	OPT_BOOLEAN('A', "all", &addremove, "add changes from all tracked and untracked files"),
-	OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"),
-	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"),
-	OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, "check if - even missing - files are ignored in dry run"),
+	OPT_BOOLEAN('i', "interactive", &add_interactive, N_("interactive picking")),
+	OPT_BOOLEAN('p', "patch", &patch_interactive, N_("select hunks interactively")),
+	OPT_BOOLEAN('e', "edit", &edit_interactive, N_("edit current diff and apply")),
+	OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files")),
+	OPT_BOOLEAN('u', "update", &take_worktree_changes, N_("update tracked files")),
+	OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
+	OPT_BOOLEAN('A', "all", &addremove, N_("add changes from all tracked and untracked files")),
+	OPT_BOOLEAN( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
+	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
+	OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
 	OPT_END(),
 };
 
diff --git a/builtin/apply.c b/builtin/apply.c
index ca8695a..156b3ce 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -4314,7 +4314,7 @@
 		OPT_NOOP_NOARG(0, "allow-binary-replacement"),
 		OPT_NOOP_NOARG(0, "binary"),
 		OPT_BOOLEAN(0, "numstat", &numstat,
-			N_("shows number of added and deleted lines in decimal notation")),
+			N_("show number of added and deleted lines in decimal notation")),
 		OPT_BOOLEAN(0, "summary", &summary,
 			N_("instead of applying the patch, output a summary for the input")),
 		OPT_BOOLEAN(0, "check", &check,
diff --git a/builtin/archive.c b/builtin/archive.c
index 931956d..9a1cfd3 100644
--- a/builtin/archive.c
+++ b/builtin/archive.c
@@ -88,12 +88,12 @@
 	const char *output = NULL;
 	const char *remote = NULL;
 	struct option local_opts[] = {
-		OPT_STRING('o', "output", &output, "file",
-			"write the archive to this file"),
-		OPT_STRING(0, "remote", &remote, "repo",
-			"retrieve the archive from remote repository <repo>"),
-		OPT_STRING(0, "exec", &exec, "cmd",
-			"path to the remote git-upload-archive command"),
+		OPT_STRING('o', "output", &output, N_("file"),
+			N_("write the archive to this file")),
+		OPT_STRING(0, "remote", &remote, N_("repo"),
+			N_("retrieve the archive from remote repository <repo>")),
+		OPT_STRING(0, "exec", &exec, N_("command"),
+			N_("path to the remote git-upload-archive command")),
 		OPT_END()
 	};
 
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index 8d325a5..e3884e3 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -4,7 +4,7 @@
 #include "bisect.h"
 
 static const char * const git_bisect_helper_usage[] = {
-	"git bisect--helper --next-all [--no-checkout]",
+	N_("git bisect--helper --next-all [--no-checkout]"),
 	NULL
 };
 
@@ -14,9 +14,9 @@
 	int no_checkout = 0;
 	struct option options[] = {
 		OPT_BOOLEAN(0, "next-all", &next_all,
-			    "perform 'git bisect next'"),
+			    N_("perform 'git bisect next'")),
 		OPT_BOOLEAN(0, "no-checkout", &no_checkout,
-			    "update BISECT_HEAD instead of checking out the current commit"),
+			    N_("update BISECT_HEAD instead of checking out the current commit")),
 		OPT_END()
 	};
 
diff --git a/builtin/blame.c b/builtin/blame.c
index 409eb42..c27ef21 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -22,12 +22,12 @@
 #include "utf8.h"
 #include "userdiff.h"
 
-static char blame_usage[] = "git blame [options] [rev-opts] [rev] [--] file";
+static char blame_usage[] = N_("git blame [options] [rev-opts] [rev] [--] file");
 
 static const char *blame_opt_usage[] = {
 	blame_usage,
 	"",
-	"[rev-opts] are documented in git-rev-list(1)",
+	N_("[rev-opts] are documented in git-rev-list(1)"),
 	NULL
 };
 
@@ -2370,27 +2370,27 @@
 	static const char *revs_file = NULL;
 	static const char *contents_from = NULL;
 	static const struct option options[] = {
-		OPT_BOOLEAN(0, "incremental", &incremental, "Show blame entries as we find them, incrementally"),
-		OPT_BOOLEAN('b', NULL, &blank_boundary, "Show blank SHA-1 for boundary commits (Default: off)"),
-		OPT_BOOLEAN(0, "root", &show_root, "Do not treat root commits as boundaries (Default: off)"),
-		OPT_BOOLEAN(0, "show-stats", &show_stats, "Show work cost statistics"),
-		OPT_BIT(0, "score-debug", &output_option, "Show output score for blame entries", OUTPUT_SHOW_SCORE),
-		OPT_BIT('f', "show-name", &output_option, "Show original filename (Default: auto)", OUTPUT_SHOW_NAME),
-		OPT_BIT('n', "show-number", &output_option, "Show original linenumber (Default: off)", OUTPUT_SHOW_NUMBER),
-		OPT_BIT('p', "porcelain", &output_option, "Show in a format designed for machine consumption", OUTPUT_PORCELAIN),
-		OPT_BIT(0, "line-porcelain", &output_option, "Show porcelain format with per-line commit information", OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN),
-		OPT_BIT('c', NULL, &output_option, "Use the same output mode as git-annotate (Default: off)", OUTPUT_ANNOTATE_COMPAT),
-		OPT_BIT('t', NULL, &output_option, "Show raw timestamp (Default: off)", OUTPUT_RAW_TIMESTAMP),
-		OPT_BIT('l', NULL, &output_option, "Show long commit SHA1 (Default: off)", OUTPUT_LONG_OBJECT_NAME),
-		OPT_BIT('s', NULL, &output_option, "Suppress author name and timestamp (Default: off)", OUTPUT_NO_AUTHOR),
-		OPT_BIT('e', "show-email", &output_option, "Show author email instead of name (Default: off)", OUTPUT_SHOW_EMAIL),
-		OPT_BIT('w', NULL, &xdl_opts, "Ignore whitespace differences", XDF_IGNORE_WHITESPACE),
-		OPT_BIT(0, "minimal", &xdl_opts, "Spend extra cycles to find better match", XDF_NEED_MINIMAL),
-		OPT_STRING('S', NULL, &revs_file, "file", "Use revisions from <file> instead of calling git-rev-list"),
-		OPT_STRING(0, "contents", &contents_from, "file", "Use <file>'s contents as the final image"),
-		{ OPTION_CALLBACK, 'C', NULL, &opt, "score", "Find line copies within and across files", PARSE_OPT_OPTARG, blame_copy_callback },
-		{ OPTION_CALLBACK, 'M', NULL, &opt, "score", "Find line movements within and across files", PARSE_OPT_OPTARG, blame_move_callback },
-		OPT_CALLBACK('L', NULL, &bottomtop, "n,m", "Process only line range n,m, counting from 1", blame_bottomtop_callback),
+		OPT_BOOLEAN(0, "incremental", &incremental, N_("Show blame entries as we find them, incrementally")),
+		OPT_BOOLEAN('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")),
+		OPT_BOOLEAN(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")),
+		OPT_BOOLEAN(0, "show-stats", &show_stats, N_("Show work cost statistics")),
+		OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE),
+		OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME),
+		OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER),
+		OPT_BIT('p', "porcelain", &output_option, N_("Show in a format designed for machine consumption"), OUTPUT_PORCELAIN),
+		OPT_BIT(0, "line-porcelain", &output_option, N_("Show porcelain format with per-line commit information"), OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN),
+		OPT_BIT('c', NULL, &output_option, N_("Use the same output mode as git-annotate (Default: off)"), OUTPUT_ANNOTATE_COMPAT),
+		OPT_BIT('t', NULL, &output_option, N_("Show raw timestamp (Default: off)"), OUTPUT_RAW_TIMESTAMP),
+		OPT_BIT('l', NULL, &output_option, N_("Show long commit SHA1 (Default: off)"), OUTPUT_LONG_OBJECT_NAME),
+		OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR),
+		OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL),
+		OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE),
+		OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
+		OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
+		OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")),
+		{ OPTION_CALLBACK, 'C', NULL, &opt, N_("score"), N_("Find line copies within and across files"), PARSE_OPT_OPTARG, blame_copy_callback },
+		{ OPTION_CALLBACK, 'M', NULL, &opt, N_("score"), N_("Find line movements within and across files"), PARSE_OPT_OPTARG, blame_move_callback },
+		OPT_CALLBACK('L', NULL, &bottomtop, N_("n,m"), N_("Process only line range n,m, counting from 1"), blame_bottomtop_callback),
 		OPT__ABBREV(&abbrev),
 		OPT_END()
 	};
diff --git a/builtin/branch.c b/builtin/branch.c
index 0e060f2..ffd2684 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -17,12 +17,13 @@
 #include "revision.h"
 #include "string-list.h"
 #include "column.h"
+#include "utf8.h"
 
 static const char * const builtin_branch_usage[] = {
-	"git branch [options] [-r | -a] [--merged | --no-merged]",
-	"git branch [options] [-l] [-f] <branchname> [<start-point>]",
-	"git branch [options] [-r] (-d | -D) <branchname>...",
-	"git branch [options] (-m | -M) [<oldbranch>] <newbranch>",
+	N_("git branch [options] [-r | -a] [--merged | --no-merged]"),
+	N_("git branch [options] [-l] [-f] <branchname> [<start-point>]"),
+	N_("git branch [options] [-r] (-d | -D) <branchname>..."),
+	N_("git branch [options] (-m | -M) [<oldbranch>] <newbranch>"),
 	NULL
 };
 
@@ -129,7 +130,7 @@
 	if (!reference_rev)
 		reference_rev = head_rev;
 
-	merged = in_merge_bases(rev, &reference_rev, 1);
+	merged = in_merge_bases(rev, reference_rev);
 
 	/*
 	 * After the safety valve is fully redefined to "check with
@@ -139,7 +140,7 @@
 	 * a gentle reminder is in order.
 	 */
 	if ((head_rev != reference_rev) &&
-	    in_merge_bases(rev, &head_rev, 1) != merged) {
+	    in_merge_bases(rev, head_rev) != merged) {
 		if (merged)
 			warning(_("deleting branch '%s' that has been merged to\n"
 				"         '%s', but not yet merged to HEAD."),
@@ -196,7 +197,7 @@
 
 		free(name);
 
-		name = xstrdup(mkpath(fmt, bname.buf));
+		name = mkpathdup(fmt, bname.buf);
 		if (read_ref(name, sha1)) {
 			error(remote_branch
 			      ? _("remote branch '%s' not found.")
@@ -249,7 +250,7 @@
 struct ref_item {
 	char *name;
 	char *dest;
-	unsigned int kind, len;
+	unsigned int kind, width;
 	struct commit *commit;
 };
 
@@ -354,14 +355,14 @@
 	newitem->name = xstrdup(refname);
 	newitem->kind = kind;
 	newitem->commit = commit;
-	newitem->len = strlen(refname);
+	newitem->width = utf8_strwidth(refname);
 	newitem->dest = resolve_symref(orig_refname, prefix);
 	/* adjust for "remotes/" */
 	if (newitem->kind == REF_REMOTE_BRANCH &&
 	    ref_list->kinds != REF_REMOTE_BRANCH)
-		newitem->len += 8;
-	if (newitem->len > ref_list->maxwidth)
-		ref_list->maxwidth = newitem->len;
+		newitem->width += 8;
+	if (newitem->width > ref_list->maxwidth)
+		ref_list->maxwidth = newitem->width;
 
 	return 0;
 }
@@ -490,11 +491,12 @@
 	}
 
 	strbuf_addf(&name, "%s%s", prefix, item->name);
-	if (verbose)
+	if (verbose) {
+		int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
 		strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
-			    maxwidth, name.buf,
+			    maxwidth + utf8_compensation, name.buf,
 			    branch_get_color(BRANCH_COLOR_RESET));
-	else
+	} else
 		strbuf_addf(&out, "%c %s%s%s", c, branch_get_color(color),
 			    name.buf, branch_get_color(BRANCH_COLOR_RESET));
 
@@ -519,8 +521,8 @@
 	for (i = 0; i < refs->index; i++) {
 		if (!matches_merge_filter(refs->list[i].commit))
 			continue;
-		if (refs->list[i].len > w)
-			w = refs->list[i].len;
+		if (refs->list[i].width > w)
+			w = refs->list[i].width;
 	}
 	return w;
 }
@@ -533,12 +535,12 @@
 	if (head_commit && is_descendant_of(head_commit, ref_list->with_commit)) {
 		struct ref_item item;
 		item.name = xstrdup(_("(no branch)"));
-		item.len = strlen(item.name);
+		item.width = utf8_strwidth(item.name);
 		item.kind = REF_LOCAL_BRANCH;
 		item.dest = NULL;
 		item.commit = head_commit;
-		if (item.len > ref_list->maxwidth)
-			ref_list->maxwidth = item.len;
+		if (item.width > ref_list->maxwidth)
+			ref_list->maxwidth = item.width;
 		print_ref_item(&item, ref_list->maxwidth, ref_list->verbose, ref_list->abbrev, 1, "");
 		free(item.name);
 	}
@@ -712,62 +714,65 @@
 	int delete = 0, rename = 0, force_create = 0, list = 0;
 	int verbose = 0, abbrev = -1, detached = 0;
 	int reflog = 0, edit_description = 0;
-	int quiet = 0;
+	int quiet = 0, unset_upstream = 0;
+	const char *new_upstream = NULL;
 	enum branch_track track;
 	int kinds = REF_LOCAL_BRANCH;
 	struct commit_list *with_commit = NULL;
 
 	struct option options[] = {
-		OPT_GROUP("Generic options"),
+		OPT_GROUP(N_("Generic options")),
 		OPT__VERBOSE(&verbose,
-			"show hash and subject, give twice for upstream branch"),
-		OPT__QUIET(&quiet, "suppress informational messages"),
-		OPT_SET_INT('t', "track",  &track, "set up tracking mode (see git-pull(1))",
+			N_("show hash and subject, give twice for upstream branch")),
+		OPT__QUIET(&quiet, N_("suppress informational messages")),
+		OPT_SET_INT('t', "track",  &track, N_("set up tracking mode (see git-pull(1))"),
 			BRANCH_TRACK_EXPLICIT),
-		OPT_SET_INT( 0, "set-upstream",  &track, "change upstream info",
+		OPT_SET_INT( 0, "set-upstream",  &track, N_("change upstream info"),
 			BRANCH_TRACK_OVERRIDE),
-		OPT__COLOR(&branch_use_color, "use colored output"),
-		OPT_SET_INT('r', "remotes",     &kinds, "act on remote-tracking branches",
+		OPT_STRING('u', "set-upstream-to", &new_upstream, "upstream", "change the upstream info"),
+		OPT_BOOLEAN(0, "unset-upstream", &unset_upstream, "Unset the upstream info"),
+		OPT__COLOR(&branch_use_color, N_("use colored output")),
+		OPT_SET_INT('r', "remotes",     &kinds, N_("act on remote-tracking branches"),
 			REF_REMOTE_BRANCH),
 		{
-			OPTION_CALLBACK, 0, "contains", &with_commit, "commit",
-			"print only branches that contain the commit",
+			OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
+			N_("print only branches that contain the commit"),
 			PARSE_OPT_LASTARG_DEFAULT,
 			parse_opt_with_commit, (intptr_t)"HEAD",
 		},
 		{
-			OPTION_CALLBACK, 0, "with", &with_commit, "commit",
-			"print only branches that contain the commit",
+			OPTION_CALLBACK, 0, "with", &with_commit, N_("commit"),
+			N_("print only branches that contain the commit"),
 			PARSE_OPT_HIDDEN | PARSE_OPT_LASTARG_DEFAULT,
 			parse_opt_with_commit, (intptr_t) "HEAD",
 		},
 		OPT__ABBREV(&abbrev),
 
-		OPT_GROUP("Specific git-branch actions:"),
-		OPT_SET_INT('a', "all", &kinds, "list both remote-tracking and local branches",
+		OPT_GROUP(N_("Specific git-branch actions:")),
+		OPT_SET_INT('a', "all", &kinds, N_("list both remote-tracking and local branches"),
 			REF_REMOTE_BRANCH | REF_LOCAL_BRANCH),
-		OPT_BIT('d', "delete", &delete, "delete fully merged branch", 1),
-		OPT_BIT('D', NULL, &delete, "delete branch (even if not merged)", 2),
-		OPT_BIT('m', "move", &rename, "move/rename a branch and its reflog", 1),
-		OPT_BIT('M', NULL, &rename, "move/rename a branch, even if target exists", 2),
-		OPT_BOOLEAN(0, "list", &list, "list branch names"),
-		OPT_BOOLEAN('l', "create-reflog", &reflog, "create the branch's reflog"),
+		OPT_BIT('d', "delete", &delete, N_("delete fully merged branch"), 1),
+		OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2),
+		OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1),
+		OPT_BIT('M', NULL, &rename, N_("move/rename a branch, even if target exists"), 2),
+		OPT_BOOLEAN(0, "list", &list, N_("list branch names")),
+		OPT_BOOLEAN('l', "create-reflog", &reflog, N_("create the branch's reflog")),
 		OPT_BOOLEAN(0, "edit-description", &edit_description,
-			    "edit the description for the branch"),
-		OPT__FORCE(&force_create, "force creation (when already exists)"),
+			    N_("edit the description for the branch")),
+		OPT__FORCE(&force_create, N_("force creation (when already exists)")),
 		{
 			OPTION_CALLBACK, 0, "no-merged", &merge_filter_ref,
-			"commit", "print only not merged branches",
+			N_("commit"), N_("print only not merged branches"),
 			PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG,
 			opt_parse_merge_filter, (intptr_t) "HEAD",
 		},
 		{
 			OPTION_CALLBACK, 0, "merged", &merge_filter_ref,
-			"commit", "print only merged branches",
+			N_("commit"), N_("print only merged branches"),
 			PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG,
 			opt_parse_merge_filter, (intptr_t) "HEAD",
 		},
-		OPT_COLUMN(0, "column", &colopts, "list branches in columns"),
+		OPT_COLUMN(0, "column", &colopts, N_("list branches in columns")),
 		OPT_END(),
 	};
 
@@ -794,10 +799,10 @@
 	argc = parse_options(argc, argv, prefix, options, builtin_branch_usage,
 			     0);
 
-	if (!delete && !rename && !edit_description && argc == 0)
+	if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0)
 		list = 1;
 
-	if (!!delete + !!rename + !!force_create + !!list > 1)
+	if (!!delete + !!rename + !!force_create + !!list + !!new_upstream + !!unset_upstream > 1)
 		usage_with_options(builtin_branch_usage, options);
 
 	if (abbrev == -1)
@@ -852,11 +857,62 @@
 			rename_branch(argv[0], argv[1], rename > 1);
 		else
 			usage_with_options(builtin_branch_usage, options);
+	} else if (new_upstream) {
+		struct branch *branch = branch_get(argv[0]);
+
+		if (!ref_exists(branch->refname))
+			die(_("branch '%s' does not exist"), branch->name);
+
+		/*
+		 * create_branch takes care of setting up the tracking
+		 * info and making sure new_upstream is correct
+		 */
+		create_branch(head, branch->name, new_upstream, 0, 0, 0, quiet, BRANCH_TRACK_OVERRIDE);
+	} else if (unset_upstream) {
+		struct branch *branch = branch_get(argv[0]);
+		struct strbuf buf = STRBUF_INIT;
+
+		if (!branch_has_merge_config(branch)) {
+			die(_("Branch '%s' has no upstream information"), branch->name);
+		}
+
+		strbuf_addf(&buf, "branch.%s.remote", branch->name);
+		git_config_set_multivar(buf.buf, NULL, NULL, 1);
+		strbuf_reset(&buf);
+		strbuf_addf(&buf, "branch.%s.merge", branch->name);
+		git_config_set_multivar(buf.buf, NULL, NULL, 1);
+		strbuf_release(&buf);
 	} else if (argc > 0 && argc <= 2) {
+		struct branch *branch = branch_get(argv[0]);
+		int branch_existed = 0, remote_tracking = 0;
+		struct strbuf buf = STRBUF_INIT;
+
 		if (kinds != REF_LOCAL_BRANCH)
 			die(_("-a and -r options to 'git branch' do not make sense with a branch name"));
+
+		if (track == BRANCH_TRACK_OVERRIDE)
+			fprintf(stderr, _("The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to\n"));
+
+		strbuf_addf(&buf, "refs/remotes/%s", branch->name);
+		remote_tracking = ref_exists(buf.buf);
+		strbuf_release(&buf);
+
+		branch_existed = ref_exists(branch->refname);
 		create_branch(head, argv[0], (argc == 2) ? argv[1] : head,
 			      force_create, reflog, 0, quiet, track);
+
+		/*
+		 * We only show the instructions if the user gave us
+		 * one branch which doesn't exist locally, but is the
+		 * name of a remote-tracking branch.
+		 */
+		if (argc == 1 && track == BRANCH_TRACK_OVERRIDE &&
+		    !branch_existed && remote_tracking) {
+			fprintf(stderr, _("\nIf you wanted to make '%s' track '%s', do this:\n\n"), head, branch->name);
+			fprintf(stderr, _("    git branch -d %s\n"), branch->name);
+			fprintf(stderr, _("    git branch --set-upstream-to %s\n"), branch->name);
+		}
+
 	} else
 		usage_with_options(builtin_branch_usage, options);
 
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index 0eca2d7..00528dd 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -244,8 +244,8 @@
 }
 
 static const char * const cat_file_usage[] = {
-	"git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>",
-	"git cat-file (--batch|--batch-check) < <list_of_objects>",
+	N_("git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"),
+	N_("git cat-file (--batch|--batch-check) < <list_of_objects>"),
 	NULL
 };
 
@@ -263,19 +263,19 @@
 	const char *exp_type = NULL, *obj_name = NULL;
 
 	const struct option options[] = {
-		OPT_GROUP("<type> can be one of: blob, tree, commit, tag"),
-		OPT_SET_INT('t', NULL, &opt, "show object type", 't'),
-		OPT_SET_INT('s', NULL, &opt, "show object size", 's'),
+		OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")),
+		OPT_SET_INT('t', NULL, &opt, N_("show object type"), 't'),
+		OPT_SET_INT('s', NULL, &opt, N_("show object size"), 's'),
 		OPT_SET_INT('e', NULL, &opt,
-			    "exit with zero when there's no error", 'e'),
-		OPT_SET_INT('p', NULL, &opt, "pretty-print object's content", 'p'),
+			    N_("exit with zero when there's no error"), 'e'),
+		OPT_SET_INT('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
 		OPT_SET_INT(0, "textconv", &opt,
-			    "for blob objects, run textconv on object's content", 'c'),
+			    N_("for blob objects, run textconv on object's content"), 'c'),
 		OPT_SET_INT(0, "batch", &batch,
-			    "show info and content of objects fed from the standard input",
+			    N_("show info and content of objects fed from the standard input"),
 			    BATCH),
 		OPT_SET_INT(0, "batch-check", &batch,
-			    "show info about objects fed from the standard input",
+			    N_("show info about objects fed from the standard input"),
 			    BATCH_CHECK),
 		OPT_END()
 	};
diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index 9000c2d..075d01d 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -8,19 +8,19 @@
 static int cached_attrs;
 static int stdin_paths;
 static const char * const check_attr_usage[] = {
-"git check-attr [-a | --all | attr...] [--] pathname...",
-"git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>",
+N_("git check-attr [-a | --all | attr...] [--] pathname..."),
+N_("git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"),
 NULL
 };
 
 static int null_term_line;
 
 static const struct option check_attr_options[] = {
-	OPT_BOOLEAN('a', "all", &all_attrs, "report all attributes set on file"),
-	OPT_BOOLEAN(0,  "cached", &cached_attrs, "use .gitattributes only from the index"),
-	OPT_BOOLEAN(0 , "stdin", &stdin_paths, "read file names from stdin"),
+	OPT_BOOLEAN('a', "all", &all_attrs, N_("report all attributes set on file")),
+	OPT_BOOLEAN(0,  "cached", &cached_attrs, N_("use .gitattributes only from the index")),
+	OPT_BOOLEAN(0 , "stdin", &stdin_paths, N_("read file names from stdin")),
 	OPT_BOOLEAN('z', NULL, &null_term_line,
-		"input paths are terminated by a null character"),
+		N_("input paths are terminated by a null character")),
 	OPT_END()
 };
 
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index c16d82b..b1feda7 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -123,7 +123,7 @@
 }
 
 static const char * const builtin_checkout_index_usage[] = {
-	"git checkout-index [options] [--] [<file>...]",
+	N_("git checkout-index [options] [--] [<file>...]"),
 	NULL
 };
 
@@ -184,27 +184,27 @@
 	int force = 0, quiet = 0, not_new = 0;
 	struct option builtin_checkout_index_options[] = {
 		OPT_BOOLEAN('a', "all", &all,
-			"checks out all files in the index"),
-		OPT__FORCE(&force, "forces overwrite of existing files"),
+			N_("check out all files in the index")),
+		OPT__FORCE(&force, N_("force overwrite of existing files")),
 		OPT__QUIET(&quiet,
-			"no warning for existing files and files not in index"),
+			N_("no warning for existing files and files not in index")),
 		OPT_BOOLEAN('n', "no-create", &not_new,
-			"don't checkout new files"),
+			N_("don't checkout new files")),
 		{ OPTION_CALLBACK, 'u', "index", &newfd, NULL,
-			"update stat information in the index file",
+			N_("update stat information in the index file"),
 			PARSE_OPT_NOARG, option_parse_u },
 		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL,
-			"paths are separated with NUL character",
+			N_("paths are separated with NUL character"),
 			PARSE_OPT_NOARG, option_parse_z },
 		OPT_BOOLEAN(0, "stdin", &read_from_stdin,
-			"read list of paths from the standard input"),
+			N_("read list of paths from the standard input")),
 		OPT_BOOLEAN(0, "temp", &to_tempfile,
-			"write the content to temporary files"),
-		OPT_CALLBACK(0, "prefix", NULL, "string",
-			"when creating files, prepend <string>",
+			N_("write the content to temporary files")),
+		OPT_CALLBACK(0, "prefix", NULL, N_("string"),
+			N_("when creating files, prepend <string>"),
 			option_parse_prefix),
 		OPT_CALLBACK(0, "stage", NULL, NULL,
-			"copy out the files from named stage",
+			N_("copy out the files from named stage"),
 			option_parse_stage),
 		OPT_END()
 	};
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 7d922c6..781295b 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -22,29 +22,31 @@
 #include "argv-array.h"
 
 static const char * const checkout_usage[] = {
-	"git checkout [options] <branch>",
-	"git checkout [options] [<branch>] -- <file>...",
+	N_("git checkout [options] <branch>"),
+	N_("git checkout [options] [<branch>] -- <file>..."),
 	NULL,
 };
 
 struct checkout_opts {
+	int patch_mode;
 	int quiet;
 	int merge;
 	int force;
 	int force_detach;
 	int writeout_stage;
-	int writeout_error;
 	int overwrite_ignore;
 
-	/* not set by parse_options */
-	int branch_exists;
-
 	const char *new_branch;
 	const char *new_branch_force;
 	const char *new_orphan_branch;
 	int new_branch_log;
 	enum branch_track track;
 	struct diff_options diff_options;
+
+	int branch_exists;
+	const char *prefix;
+	const char **pathspec;
+	struct tree *source_tree;
 };
 
 static int post_checkout_hook(struct commit *old, struct commit *new,
@@ -215,8 +217,8 @@
 	return status;
 }
 
-static int checkout_paths(struct tree *source_tree, const char **pathspec,
-			  const char *prefix, struct checkout_opts *opts)
+static int checkout_paths(const struct checkout_opts *opts,
+			  const char *revision)
 {
 	int pos;
 	struct checkout state;
@@ -228,37 +230,65 @@
 	int stage = opts->writeout_stage;
 	int merge = opts->merge;
 	int newfd;
-	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
+	struct lock_file *lock_file;
+
+	if (opts->track != BRANCH_TRACK_UNSPECIFIED)
+		die(_("'%s' cannot be used with updating paths"), "--track");
+
+	if (opts->new_branch_log)
+		die(_("'%s' cannot be used with updating paths"), "-l");
+
+	if (opts->force && opts->patch_mode)
+		die(_("'%s' cannot be used with updating paths"), "-f");
+
+	if (opts->force_detach)
+		die(_("'%s' cannot be used with updating paths"), "--detach");
+
+	if (opts->merge && opts->patch_mode)
+		die(_("'%s' cannot be used with %s"), "--merge", "--patch");
+
+	if (opts->force && opts->merge)
+		die(_("'%s' cannot be used with %s"), "-f", "-m");
+
+	if (opts->new_branch)
+		die(_("Cannot update paths and switch to branch '%s' at the same time."),
+		    opts->new_branch);
+
+	if (opts->patch_mode)
+		return run_add_interactive(revision, "--patch=checkout",
+					   opts->pathspec);
+
+	lock_file = xcalloc(1, sizeof(struct lock_file));
 
 	newfd = hold_locked_index(lock_file, 1);
-	if (read_cache_preload(pathspec) < 0)
+	if (read_cache_preload(opts->pathspec) < 0)
 		return error(_("corrupt index file"));
 
-	if (source_tree)
-		read_tree_some(source_tree, pathspec);
+	if (opts->source_tree)
+		read_tree_some(opts->source_tree, opts->pathspec);
 
-	for (pos = 0; pathspec[pos]; pos++)
+	for (pos = 0; opts->pathspec[pos]; pos++)
 		;
 	ps_matched = xcalloc(1, pos);
 
 	for (pos = 0; pos < active_nr; pos++) {
 		struct cache_entry *ce = active_cache[pos];
-		if (source_tree && !(ce->ce_flags & CE_UPDATE))
+		if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
 			continue;
-		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
+		match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
 	}
 
-	if (report_path_error(ps_matched, pathspec, prefix))
+	if (report_path_error(ps_matched, opts->pathspec, opts->prefix))
 		return 1;
 
 	/* "checkout -m path" to recreate conflicted state */
 	if (opts->merge)
-		unmerge_cache(pathspec);
+		unmerge_cache(opts->pathspec);
 
 	/* Any unmerged paths? */
 	for (pos = 0; pos < active_nr; pos++) {
 		struct cache_entry *ce = active_cache[pos];
-		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
+		if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
 			if (!ce_stage(ce))
 				continue;
 			if (opts->force) {
@@ -283,9 +313,9 @@
 	state.refresh_cache = 1;
 	for (pos = 0; pos < active_nr; pos++) {
 		struct cache_entry *ce = active_cache[pos];
-		if (source_tree && !(ce->ce_flags & CE_UPDATE))
+		if (opts->source_tree && !(ce->ce_flags & CE_UPDATE))
 			continue;
-		if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
+		if (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
 			if (!ce_stage(ce)) {
 				errs |= checkout_entry(ce, &state, NULL);
 				continue;
@@ -309,7 +339,8 @@
 	return errs;
 }
 
-static void show_local_changes(struct object *head, struct diff_options *opts)
+static void show_local_changes(struct object *head,
+			       const struct diff_options *opts)
 {
 	struct rev_info rev;
 	/* I think we want full paths, even if we're in a subdirectory. */
@@ -331,7 +362,8 @@
 	strbuf_release(&sb);
 }
 
-static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree)
+static int reset_tree(struct tree *tree, const struct checkout_opts *o,
+		      int worktree, int *writeout_error)
 {
 	struct unpack_trees_options opts;
 	struct tree_desc tree_desc;
@@ -350,7 +382,7 @@
 	init_tree_desc(&tree_desc, tree->buffer, tree->size);
 	switch (unpack_trees(1, &tree_desc, &opts)) {
 	case -2:
-		o->writeout_error = 1;
+		*writeout_error = 1;
 		/*
 		 * We return 0 nevertheless, as the index is all right
 		 * and more importantly we have made best efforts to
@@ -381,8 +413,10 @@
 	branch->path = strbuf_detach(&buf, NULL);
 }
 
-static int merge_working_tree(struct checkout_opts *opts,
-			      struct branch_info *old, struct branch_info *new)
+static int merge_working_tree(const struct checkout_opts *opts,
+			      struct branch_info *old,
+			      struct branch_info *new,
+			      int *writeout_error)
 {
 	int ret;
 	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
@@ -393,7 +427,7 @@
 
 	resolve_undo_clear();
 	if (opts->force) {
-		ret = reset_tree(new->commit->tree, opts, 1);
+		ret = reset_tree(new->commit->tree, opts, 1, writeout_error);
 		if (ret)
 			return ret;
 	} else {
@@ -479,7 +513,8 @@
 			o.verbosity = 0;
 			work = write_tree_from_memory(&o);
 
-			ret = reset_tree(new->commit->tree, opts, 1);
+			ret = reset_tree(new->commit->tree, opts, 1,
+					 writeout_error);
 			if (ret)
 				return ret;
 			o.ancestor = old->name;
@@ -487,7 +522,8 @@
 			o.branch2 = "local";
 			merge_trees(&o, new->commit->tree, work,
 				old->commit->tree, &result);
-			ret = reset_tree(new->commit->tree, opts, 0);
+			ret = reset_tree(new->commit->tree, opts, 0,
+					 writeout_error);
 			if (ret)
 				return ret;
 		}
@@ -514,7 +550,7 @@
 	strbuf_release(&sb);
 }
 
-static void update_refs_for_switch(struct checkout_opts *opts,
+static void update_refs_for_switch(const struct checkout_opts *opts,
 				   struct branch_info *old,
 				   struct branch_info *new)
 {
@@ -701,13 +737,14 @@
 	free(refs.objects);
 }
 
-static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
+static int switch_branches(const struct checkout_opts *opts,
+			   struct branch_info *new)
 {
 	int ret = 0;
 	struct branch_info old;
 	void *path_to_free;
 	unsigned char rev[20];
-	int flag;
+	int flag, writeout_error = 0;
 	memset(&old, 0, sizeof(old));
 	old.path = path_to_free = resolve_refdup("HEAD", rev, 0, &flag);
 	old.commit = lookup_commit_reference_gently(rev, 1);
@@ -725,7 +762,7 @@
 		parse_commit(new->commit);
 	}
 
-	ret = merge_working_tree(opts, &old, new);
+	ret = merge_working_tree(opts, &old, new, &writeout_error);
 	if (ret) {
 		free(path_to_free);
 		return ret;
@@ -738,7 +775,7 @@
 
 	ret = post_checkout_hook(old.commit, new->commit, 1);
 	free(path_to_free);
-	return ret || opts->writeout_error;
+	return ret || writeout_error;
 }
 
 static int git_checkout_config(const char *var, const char *value, void *cb)
@@ -755,12 +792,6 @@
 	return git_xmerge_config(var, value, NULL);
 }
 
-static int interactive_checkout(const char *revision, const char **pathspec,
-				struct checkout_opts *opts)
-{
-	return run_add_interactive(revision, "--patch=checkout", pathspec);
-}
-
 struct tracking_name_data {
 	const char *name;
 	char *remote;
@@ -910,7 +941,7 @@
 	return argcount;
 }
 
-static int switch_unborn_to_new_branch(struct checkout_opts *opts)
+static int switch_unborn_to_new_branch(const struct checkout_opts *opts)
 {
 	int status;
 	struct strbuf branch_ref = STRBUF_INIT;
@@ -923,38 +954,80 @@
 	return status;
 }
 
+static int checkout_branch(struct checkout_opts *opts,
+			   struct branch_info *new)
+{
+	if (opts->pathspec)
+		die(_("paths cannot be used with switching branches"));
+
+	if (opts->patch_mode)
+		die(_("'%s' cannot be used with switching branches"),
+		    "--patch");
+
+	if (opts->writeout_stage)
+		die(_("'%s' cannot be used with switching branches"),
+		    "--ours/--theirs");
+
+	if (opts->force && opts->merge)
+		die(_("'%s' cannot be used with '%s'"), "-f", "-m");
+
+	if (opts->force_detach && opts->new_branch)
+		die(_("'%s' cannot be used with '%s'"),
+		    "--detach", "-b/-B/--orphan");
+
+	if (opts->new_orphan_branch) {
+		if (opts->track != BRANCH_TRACK_UNSPECIFIED)
+			die(_("'%s' cannot be used with '%s'"), "--orphan", "-t");
+	} else if (opts->force_detach) {
+		if (opts->track != BRANCH_TRACK_UNSPECIFIED)
+			die(_("'%s' cannot be used with '%s'"), "--detach", "-t");
+	} else if (opts->track == BRANCH_TRACK_UNSPECIFIED)
+		opts->track = git_branch_track;
+
+	if (new->name && !new->commit)
+		die(_("Cannot switch branch to a non-commit '%s'"),
+		    new->name);
+
+	if (!new->commit && opts->new_branch) {
+		unsigned char rev[20];
+		int flag;
+
+		if (!read_ref_full("HEAD", rev, 0, &flag) &&
+		    (flag & REF_ISSYMREF) && is_null_sha1(rev))
+			return switch_unborn_to_new_branch(opts);
+	}
+	return switch_branches(opts, new);
+}
+
 int cmd_checkout(int argc, const char **argv, const char *prefix)
 {
 	struct checkout_opts opts;
-	unsigned char rev[20];
 	struct branch_info new;
-	struct tree *source_tree = NULL;
 	char *conflict_style = NULL;
-	int patch_mode = 0;
 	int dwim_new_local_branch = 1;
 	struct option options[] = {
-		OPT__QUIET(&opts.quiet, "suppress progress reporting"),
-		OPT_STRING('b', NULL, &opts.new_branch, "branch",
-			   "create and checkout a new branch"),
-		OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
-			   "create/reset and checkout a branch"),
-		OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
-		OPT_BOOLEAN(0, "detach", &opts.force_detach, "detach the HEAD at named commit"),
-		OPT_SET_INT('t', "track",  &opts.track, "set upstream info for new branch",
+		OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
+		OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
+			   N_("create and checkout a new branch")),
+		OPT_STRING('B', NULL, &opts.new_branch_force, N_("branch"),
+			   N_("create/reset and checkout a branch")),
+		OPT_BOOLEAN('l', NULL, &opts.new_branch_log, N_("create reflog for new branch")),
+		OPT_BOOLEAN(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")),
+		OPT_SET_INT('t', "track",  &opts.track, N_("set upstream info for new branch"),
 			BRANCH_TRACK_EXPLICIT),
-		OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
-		OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
+		OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new branch"), N_("new unparented branch")),
+		OPT_SET_INT('2', "ours", &opts.writeout_stage, N_("checkout our version for unmerged files"),
 			    2),
-		OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
+		OPT_SET_INT('3', "theirs", &opts.writeout_stage, N_("checkout their version for unmerged files"),
 			    3),
-		OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"),
-		OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
-		OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, "update ignored files (default)"),
-		OPT_STRING(0, "conflict", &conflict_style, "style",
-			   "conflict style (merge or diff3)"),
-		OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
+		OPT__FORCE(&opts.force, N_("force checkout (throw away local modifications)")),
+		OPT_BOOLEAN('m', "merge", &opts.merge, N_("perform a 3-way merge with the new branch")),
+		OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, N_("update ignored files (default)")),
+		OPT_STRING(0, "conflict", &conflict_style, N_("style"),
+			   N_("conflict style (merge or diff3)")),
+		OPT_BOOLEAN('p', "patch", &opts.patch_mode, N_("select hunks interactively")),
 		{ OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
-		  "second guess 'git checkout no-such-branch'",
+		  N_("second guess 'git checkout no-such-branch'"),
 		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
 		OPT_END(),
 	};
@@ -962,6 +1035,7 @@
 	memset(&opts, 0, sizeof(opts));
 	memset(&new, 0, sizeof(new));
 	opts.overwrite_ignore = 1;
+	opts.prefix = prefix;
 
 	gitmodules_config();
 	git_config(git_checkout_config, &opts);
@@ -971,26 +1045,27 @@
 	argc = parse_options(argc, argv, prefix, options, checkout_usage,
 			     PARSE_OPT_KEEP_DASHDASH);
 
-	/* we can assume from now on new_branch = !new_branch_force */
-	if (opts.new_branch && opts.new_branch_force)
-		die(_("-B cannot be used with -b"));
+	if (conflict_style) {
+		opts.merge = 1; /* implied */
+		git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
+	}
 
-	/* copy -B over to -b, so that we can just check the latter */
+	if ((!!opts.new_branch + !!opts.new_branch_force + !!opts.new_orphan_branch) > 1)
+		die(_("-b, -B and --orphan are mutually exclusive"));
+
+	/*
+	 * From here on, new_branch will contain the branch to be checked out,
+	 * and new_branch_force and new_orphan_branch will tell us which one of
+	 * -b/-B/--orphan is being used.
+	 */
 	if (opts.new_branch_force)
 		opts.new_branch = opts.new_branch_force;
 
-	if (patch_mode && (opts.track > 0 || opts.new_branch
-			   || opts.new_branch_log || opts.merge || opts.force
-			   || opts.force_detach))
-		die (_("--patch is incompatible with all other options"));
+	if (opts.new_orphan_branch)
+		opts.new_branch = opts.new_orphan_branch;
 
-	if (opts.force_detach && (opts.new_branch || opts.new_orphan_branch))
-		die(_("--detach cannot be used with -b/-B/--orphan"));
-	if (opts.force_detach && 0 < opts.track)
-		die(_("--detach cannot be used with -t"));
-
-	/* --track without -b should DWIM */
-	if (0 < opts.track && !opts.new_branch) {
+	/* --track without -b/-B/--orphan should DWIM */
+	if (opts.track != BRANCH_TRACK_UNSPECIFIED && !opts.new_branch) {
 		const char *argv0 = argv[0];
 		if (!argc || !strcmp(argv0, "--"))
 			die (_("--track needs a branch name"));
@@ -1004,22 +1079,6 @@
 		opts.new_branch = argv0 + 1;
 	}
 
-	if (opts.new_orphan_branch) {
-		if (opts.new_branch)
-			die(_("--orphan and -b|-B are mutually exclusive"));
-		if (opts.track > 0)
-			die(_("--orphan cannot be used with -t"));
-		opts.new_branch = opts.new_orphan_branch;
-	}
-
-	if (conflict_style) {
-		opts.merge = 1; /* implied */
-		git_xmerge_config("merge.conflictstyle", conflict_style, NULL);
-	}
-
-	if (opts.force && opts.merge)
-		die(_("git checkout: -f and -m are incompatible"));
-
 	/*
 	 * Extract branch name from command line arguments, so
 	 * all that is left is pathspecs.
@@ -1034,73 +1093,56 @@
 	 * remote branches, erroring out for invalid or ambiguous cases.
 	 */
 	if (argc) {
+		unsigned char rev[20];
 		int dwim_ok =
-			!patch_mode &&
+			!opts.patch_mode &&
 			dwim_new_local_branch &&
 			opts.track == BRANCH_TRACK_UNSPECIFIED &&
 			!opts.new_branch;
 		int n = parse_branchname_arg(argc, argv, dwim_ok,
-				&new, &source_tree, rev, &opts.new_branch);
+					     &new, &opts.source_tree,
+					     rev, &opts.new_branch);
 		argv += n;
 		argc -= n;
 	}
 
-	if (opts.track == BRANCH_TRACK_UNSPECIFIED)
-		opts.track = git_branch_track;
-
 	if (argc) {
-		const char **pathspec = get_pathspec(prefix, argv);
+		opts.pathspec = get_pathspec(prefix, argv);
 
-		if (!pathspec)
+		if (!opts.pathspec)
 			die(_("invalid path specification"));
 
-		if (patch_mode)
-			return interactive_checkout(new.name, pathspec, &opts);
-
-		/* Checkout paths */
-		if (opts.new_branch) {
-			if (argc == 1) {
-				die(_("git checkout: updating paths is incompatible with switching branches.\nDid you intend to checkout '%s' which can not be resolved as commit?"), argv[0]);
-			} else {
-				die(_("git checkout: updating paths is incompatible with switching branches."));
-			}
-		}
+		/*
+		 * Try to give more helpful suggestion.
+		 * new_branch && argc > 1 will be caught later.
+		 */
+		if (opts.new_branch && argc == 1)
+			die(_("Cannot update paths and switch to branch '%s' at the same time.\n"
+			      "Did you intend to checkout '%s' which can not be resolved as commit?"),
+			    opts.new_branch, argv[0]);
 
 		if (opts.force_detach)
-			die(_("git checkout: --detach does not take a path argument"));
+			die(_("git checkout: --detach does not take a path argument '%s'"),
+			    argv[0]);
 
 		if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge)
-			die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index."));
-
-		return checkout_paths(source_tree, pathspec, prefix, &opts);
+			die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+			      "checking out of the index."));
 	}
 
-	if (patch_mode)
-		return interactive_checkout(new.name, NULL, &opts);
-
 	if (opts.new_branch) {
 		struct strbuf buf = STRBUF_INIT;
 
-		opts.branch_exists = validate_new_branchname(opts.new_branch, &buf,
-							     !!opts.new_branch_force,
-							     !!opts.new_branch_force);
+		opts.branch_exists =
+			validate_new_branchname(opts.new_branch, &buf,
+						!!opts.new_branch_force,
+						!!opts.new_branch_force);
 
 		strbuf_release(&buf);
 	}
 
-	if (new.name && !new.commit) {
-		die(_("Cannot switch branch to a non-commit."));
-	}
-	if (opts.writeout_stage)
-		die(_("--ours/--theirs is incompatible with switching branches."));
-
-	if (!new.commit && opts.new_branch) {
-		unsigned char rev[20];
-		int flag;
-
-		if (!read_ref_full("HEAD", rev, 0, &flag) &&
-		    (flag & REF_ISSYMREF) && is_null_sha1(rev))
-			return switch_unborn_to_new_branch(&opts);
-	}
-	return switch_branches(&opts, &new);
+	if (opts.patch_mode || opts.pathspec)
+		return checkout_paths(&opts, new.name);
+	else
+		return checkout_branch(&opts, &new);
 }
diff --git a/builtin/clean.c b/builtin/clean.c
index 0c7b3d0..69c1cda 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -16,7 +16,7 @@
 static int force = -1; /* unset */
 
 static const char *const builtin_clean_usage[] = {
-	"git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>...",
+	N_("git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."),
 	NULL
 };
 
@@ -48,16 +48,16 @@
 	const char *qname;
 	char *seen = NULL;
 	struct option options[] = {
-		OPT__QUIET(&quiet, "do not print names of files removed"),
-		OPT__DRY_RUN(&show_only, "dry run"),
-		OPT__FORCE(&force, "force"),
+		OPT__QUIET(&quiet, N_("do not print names of files removed")),
+		OPT__DRY_RUN(&show_only, N_("dry run")),
+		OPT__FORCE(&force, N_("force")),
 		OPT_BOOLEAN('d', NULL, &remove_directories,
-				"remove whole directories"),
-		{ OPTION_CALLBACK, 'e', "exclude", &exclude_list, "pattern",
-		  "add <pattern> to ignore rules", PARSE_OPT_NONEG, exclude_cb },
-		OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"),
+				N_("remove whole directories")),
+		{ OPTION_CALLBACK, 'e', "exclude", &exclude_list, N_("pattern"),
+		  N_("add <pattern> to ignore rules"), PARSE_OPT_NONEG, exclude_cb },
+		OPT_BOOLEAN('x', NULL, &ignored, N_("remove ignored files, too")),
 		OPT_BOOLEAN('X', NULL, &ignored_only,
-				"remove only ignored files"),
+				N_("remove only ignored files")),
 		OPT_END()
 	};
 
diff --git a/builtin/clone.c b/builtin/clone.c
index e314b0b..ec2f75b 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -33,7 +33,7 @@
  *
  */
 static const char * const builtin_clone_usage[] = {
-	"git clone [options] [--] <repo> [<dir>]",
+	N_("git clone [options] [--] <repo> [<dir>]"),
 	NULL
 };
 
@@ -61,43 +61,43 @@
 static struct option builtin_clone_options[] = {
 	OPT__VERBOSITY(&option_verbosity),
 	OPT_BOOL(0, "progress", &option_progress,
-		 "force progress reporting"),
+		 N_("force progress reporting")),
 	OPT_BOOLEAN('n', "no-checkout", &option_no_checkout,
-		    "don't create a checkout"),
-	OPT_BOOLEAN(0, "bare", &option_bare, "create a bare repository"),
+		    N_("don't create a checkout")),
+	OPT_BOOLEAN(0, "bare", &option_bare, N_("create a bare repository")),
 	{ OPTION_BOOLEAN, 0, "naked", &option_bare, NULL,
-		"create a bare repository",
+		N_("create a bare repository"),
 		PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
 	OPT_BOOLEAN(0, "mirror", &option_mirror,
-		    "create a mirror repository (implies bare)"),
+		    N_("create a mirror repository (implies bare)")),
 	OPT_BOOL('l', "local", &option_local,
-		"to clone from a local repository"),
+		N_("to clone from a local repository")),
 	OPT_BOOLEAN(0, "no-hardlinks", &option_no_hardlinks,
-		    "don't use local hardlinks, always copy"),
+		    N_("don't use local hardlinks, always copy")),
 	OPT_BOOLEAN('s', "shared", &option_shared,
-		    "setup as shared repository"),
+		    N_("setup as shared repository")),
 	OPT_BOOLEAN(0, "recursive", &option_recursive,
-		    "initialize submodules in the clone"),
+		    N_("initialize submodules in the clone")),
 	OPT_BOOLEAN(0, "recurse-submodules", &option_recursive,
-		    "initialize submodules in the clone"),
-	OPT_STRING(0, "template", &option_template, "template-directory",
-		   "directory from which templates will be used"),
-	OPT_CALLBACK(0 , "reference", &option_reference, "repo",
-		     "reference repository", &opt_parse_reference),
-	OPT_STRING('o', "origin", &option_origin, "name",
-		   "use <name> instead of 'origin' to track upstream"),
-	OPT_STRING('b', "branch", &option_branch, "branch",
-		   "checkout <branch> instead of the remote's HEAD"),
-	OPT_STRING('u', "upload-pack", &option_upload_pack, "path",
-		   "path to git-upload-pack on the remote"),
-	OPT_STRING(0, "depth", &option_depth, "depth",
-		    "create a shallow clone of that depth"),
+		    N_("initialize submodules in the clone")),
+	OPT_STRING(0, "template", &option_template, N_("template-directory"),
+		   N_("directory from which templates will be used")),
+	OPT_CALLBACK(0 , "reference", &option_reference, N_("repo"),
+		     N_("reference repository"), &opt_parse_reference),
+	OPT_STRING('o', "origin", &option_origin, N_("name"),
+		   N_("use <name> instead of 'origin' to track upstream")),
+	OPT_STRING('b', "branch", &option_branch, N_("branch"),
+		   N_("checkout <branch> instead of the remote's HEAD")),
+	OPT_STRING('u', "upload-pack", &option_upload_pack, N_("path"),
+		   N_("path to git-upload-pack on the remote")),
+	OPT_STRING(0, "depth", &option_depth, N_("depth"),
+		    N_("create a shallow clone of that depth")),
 	OPT_BOOL(0, "single-branch", &option_single_branch,
-		    "clone only one branch, HEAD or --branch"),
-	OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir",
-		   "separate git dir from working tree"),
-	OPT_STRING_LIST('c', "config", &option_config, "key=value",
-			"set config inside the new repository"),
+		    N_("clone only one branch, HEAD or --branch")),
+	OPT_STRING(0, "separate-git-dir", &real_git_dir, N_("gitdir"),
+		   N_("separate git dir from working tree")),
+	OPT_STRING_LIST('c', "config", &option_config, N_("key=value"),
+			N_("set config inside the new repository")),
 	OPT_END()
 };
 
@@ -236,7 +236,7 @@
 	/* Beware: real_path() and mkpath() return static buffer */
 	ref_git = xstrdup(real_path(item->string));
 	if (is_directory(mkpath("%s/.git/objects", ref_git))) {
-		char *ref_git_git = xstrdup(mkpath("%s/.git", ref_git));
+		char *ref_git_git = mkpathdup("%s/.git", ref_git);
 		free(ref_git);
 		ref_git = ref_git_git;
 	} else if (!is_directory(mkpath("%s/objects", ref_git)))
@@ -610,6 +610,54 @@
 	}
 }
 
+static void write_refspec_config(const char* src_ref_prefix,
+		const struct ref* our_head_points_at,
+		const struct ref* remote_head_points_at, struct strbuf* branch_top)
+{
+	struct strbuf key = STRBUF_INIT;
+	struct strbuf value = STRBUF_INIT;
+
+	if (option_mirror || !option_bare) {
+		if (option_single_branch && !option_mirror) {
+			if (option_branch) {
+				if (strstr(our_head_points_at->name, "refs/tags/"))
+					strbuf_addf(&value, "+%s:%s", our_head_points_at->name,
+						our_head_points_at->name);
+				else
+					strbuf_addf(&value, "+%s:%s%s", our_head_points_at->name,
+						branch_top->buf, option_branch);
+			} else if (remote_head_points_at) {
+				strbuf_addf(&value, "+%s:%s%s", remote_head_points_at->name,
+						branch_top->buf,
+						skip_prefix(remote_head_points_at->name, "refs/heads/"));
+			}
+			/*
+			 * otherwise, the next "git fetch" will
+			 * simply fetch from HEAD without updating
+			 * any remote tracking branch, which is what
+			 * we want.
+			 */
+		} else {
+			strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top->buf);
+		}
+		/* Configure the remote */
+		if (value.len) {
+			strbuf_addf(&key, "remote.%s.fetch", option_origin);
+			git_config_set_multivar(key.buf, value.buf, "^$", 0);
+			strbuf_reset(&key);
+
+			if (option_mirror) {
+				strbuf_addf(&key, "remote.%s.mirror", option_origin);
+				git_config_set(key.buf, "true");
+				strbuf_reset(&key);
+			}
+		}
+	}
+
+	strbuf_release(&key);
+	strbuf_release(&value);
+}
+
 int cmd_clone(int argc, const char **argv, const char *prefix)
 {
 	int is_bundle = 0, is_local;
@@ -700,7 +748,7 @@
 		git_dir = xstrdup(dir);
 	else {
 		work_tree = dir;
-		git_dir = xstrdup(mkpath("%s/.git", dir));
+		git_dir = mkpathdup("%s/.git", dir);
 	}
 
 	if (!option_bare) {
@@ -755,20 +803,6 @@
 	}
 
 	strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
-
-	if (option_mirror || !option_bare) {
-		/* Configure the remote */
-		strbuf_addf(&key, "remote.%s.fetch", option_origin);
-		git_config_set_multivar(key.buf, value.buf, "^$", 0);
-		strbuf_reset(&key);
-
-		if (option_mirror) {
-			strbuf_addf(&key, "remote.%s.mirror", option_origin);
-			git_config_set(key.buf, "true");
-			strbuf_reset(&key);
-		}
-	}
-
 	strbuf_addf(&key, "remote.%s.url", option_origin);
 	git_config_set(key.buf, repo);
 	strbuf_reset(&key);
@@ -853,6 +887,9 @@
 					      "refs/heads/master");
 	}
 
+	write_refspec_config(src_ref_prefix, our_head_points_at,
+			remote_head_points_at, &branch_top);
+
 	if (is_local)
 		clone_local(path, git_dir);
 	else if (refs && complete_refs_before_fetch)
diff --git a/builtin/column.c b/builtin/column.c
index 5ea798a..e125a55 100644
--- a/builtin/column.c
+++ b/builtin/column.c
@@ -6,7 +6,7 @@
 #include "column.h"
 
 static const char * const builtin_column_usage[] = {
-	"git column [options]",
+	N_("git column [options]"),
 	NULL
 };
 static unsigned int colopts;
@@ -23,13 +23,13 @@
 	struct column_options copts;
 	const char *command = NULL, *real_command = NULL;
 	struct option options[] = {
-		OPT_STRING(0, "command", &real_command, "name", "lookup config vars"),
-		OPT_COLUMN(0, "mode", &colopts, "layout to use"),
-		OPT_INTEGER(0, "raw-mode", &colopts, "layout to use"),
-		OPT_INTEGER(0, "width", &copts.width, "Maximum width"),
-		OPT_STRING(0, "indent", &copts.indent, "string", "Padding space on left border"),
-		OPT_INTEGER(0, "nl", &copts.nl, "Padding space on right border"),
-		OPT_INTEGER(0, "padding", &copts.padding, "Padding space between columns"),
+		OPT_STRING(0, "command", &real_command, N_("name"), N_("lookup config vars")),
+		OPT_COLUMN(0, "mode", &colopts, N_("layout to use")),
+		OPT_INTEGER(0, "raw-mode", &colopts, N_("layout to use")),
+		OPT_INTEGER(0, "width", &copts.width, N_("Maximum width")),
+		OPT_STRING(0, "indent", &copts.indent, N_("string"), N_("Padding space on left border")),
+		OPT_INTEGER(0, "nl", &copts.nl, N_("Padding space on right border")),
+		OPT_INTEGER(0, "padding", &copts.padding, N_("Padding space between columns")),
 		OPT_END()
 	};
 
diff --git a/builtin/commit.c b/builtin/commit.c
index 62028e7..a17a5df 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -28,14 +28,15 @@
 #include "submodule.h"
 #include "gpg-interface.h"
 #include "column.h"
+#include "sequencer.h"
 
 static const char * const builtin_commit_usage[] = {
-	"git commit [options] [--] <filepattern>...",
+	N_("git commit [options] [--] <filepattern>..."),
 	NULL
 };
 
 static const char * const builtin_status_usage[] = {
-	"git status [options] [--] <filepattern>...",
+	N_("git status [options] [--] <filepattern>..."),
 	NULL
 };
 
@@ -466,8 +467,6 @@
 	return !!(current_head->parents && current_head->parents->next);
 }
 
-static const char sign_off_header[] = "Signed-off-by: ";
-
 static void export_one(const char *var, const char *s, const char *e, int hack)
 {
 	struct strbuf buf = STRBUF_INIT;
@@ -552,47 +551,6 @@
 	}
 }
 
-static int ends_rfc2822_footer(struct strbuf *sb)
-{
-	int ch;
-	int hit = 0;
-	int i, j, k;
-	int len = sb->len;
-	int first = 1;
-	const char *buf = sb->buf;
-
-	for (i = len - 1; i > 0; i--) {
-		if (hit && buf[i] == '\n')
-			break;
-		hit = (buf[i] == '\n');
-	}
-
-	while (i < len - 1 && buf[i] == '\n')
-		i++;
-
-	for (; i < len; i = k) {
-		for (k = i; k < len && buf[k] != '\n'; k++)
-			; /* do nothing */
-		k++;
-
-		if ((buf[k] == ' ' || buf[k] == '\t') && !first)
-			continue;
-
-		first = 0;
-
-		for (j = 0; i + j < len; j++) {
-			ch = buf[i + j];
-			if (ch == ':')
-				break;
-			if (isalnum(ch) ||
-			    (ch == '-'))
-				continue;
-			return 0;
-		}
-	}
-	return 1;
-}
-
 static char *cut_ident_timestamp_part(char *string)
 {
 	char *ket = strrchr(string, '>');
@@ -717,21 +675,30 @@
 		stripspace(&sb, 0);
 
 	if (signoff) {
-		struct strbuf sob = STRBUF_INIT;
-		int i;
+		/*
+		 * See if we have a Conflicts: block at the end. If yes, count
+		 * its size, so we can ignore it.
+		 */
+		int ignore_footer = 0;
+		int i, eol, previous = 0;
+		const char *nl;
 
-		strbuf_addstr(&sob, sign_off_header);
-		strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
-					     getenv("GIT_COMMITTER_EMAIL")));
-		strbuf_addch(&sob, '\n');
-		for (i = sb.len - 1; i > 0 && sb.buf[i - 1] != '\n'; i--)
-			; /* do nothing */
-		if (prefixcmp(sb.buf + i, sob.buf)) {
-			if (!i || !ends_rfc2822_footer(&sb))
-				strbuf_addch(&sb, '\n');
-			strbuf_addbuf(&sb, &sob);
+		for (i = 0; i < sb.len; i++) {
+			nl = memchr(sb.buf + i, '\n', sb.len - i);
+			if (nl)
+				eol = nl - sb.buf;
+			else
+				eol = sb.len;
+			if (!prefixcmp(sb.buf + previous, "\nConflicts:\n")) {
+				ignore_footer = sb.len - previous;
+				break;
+			}
+			while (i < eol)
+				i++;
+			previous = eol;
 		}
-		strbuf_release(&sob);
+
+		append_signoff(&sb, ignore_footer);
 	}
 
 	if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
@@ -1184,26 +1151,26 @@
 	int fd;
 	unsigned char sha1[20];
 	static struct option builtin_status_options[] = {
-		OPT__VERBOSE(&verbose, "be verbose"),
+		OPT__VERBOSE(&verbose, N_("be verbose")),
 		OPT_SET_INT('s', "short", &status_format,
-			    "show status concisely", STATUS_FORMAT_SHORT),
+			    N_("show status concisely"), STATUS_FORMAT_SHORT),
 		OPT_BOOLEAN('b', "branch", &s.show_branch,
-			    "show branch information"),
+			    N_("show branch information")),
 		OPT_SET_INT(0, "porcelain", &status_format,
-			    "machine-readable output",
+			    N_("machine-readable output"),
 			    STATUS_FORMAT_PORCELAIN),
 		OPT_BOOLEAN('z', "null", &s.null_termination,
-			    "terminate entries with NUL"),
+			    N_("terminate entries with NUL")),
 		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg,
-		  "mode",
-		  "show untracked files, optional modes: all, normal, no. (Default: all)",
+		  N_("mode"),
+		  N_("show untracked files, optional modes: all, normal, no. (Default: all)"),
 		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
 		OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
-			    "show ignored files"),
-		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
-		  "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
+			    N_("show ignored files")),
+		{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, N_("when"),
+		  N_("ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)"),
 		  PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
-		OPT_COLUMN(0, "column", &s.colopts, "list untracked files in columns"),
+		OPT_COLUMN(0, "column", &s.colopts, N_("list untracked files in columns")),
 		OPT_END(),
 	};
 
@@ -1384,53 +1351,53 @@
 {
 	static struct wt_status s;
 	static struct option builtin_commit_options[] = {
-		OPT__QUIET(&quiet, "suppress summary after successful commit"),
-		OPT__VERBOSE(&verbose, "show diff in commit message template"),
+		OPT__QUIET(&quiet, N_("suppress summary after successful commit")),
+		OPT__VERBOSE(&verbose, N_("show diff in commit message template")),
 
-		OPT_GROUP("Commit message options"),
-		OPT_FILENAME('F', "file", &logfile, "read message from file"),
-		OPT_STRING(0, "author", &force_author, "author", "override author for commit"),
-		OPT_STRING(0, "date", &force_date, "date", "override date for commit"),
-		OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m),
-		OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"),
-		OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"),
-		OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"),
-		OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"),
-		OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"),
-		OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
-		OPT_FILENAME('t', "template", &template_file, "use specified template file"),
-		OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"),
-		OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"),
-		OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"),
-		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
-		  "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+		OPT_GROUP(N_("Commit message options")),
+		OPT_FILENAME('F', "file", &logfile, N_("read message from file")),
+		OPT_STRING(0, "author", &force_author, N_("author"), N_("override author for commit")),
+		OPT_STRING(0, "date", &force_date, N_("date"), N_("override date for commit")),
+		OPT_CALLBACK('m', "message", &message, N_("message"), N_("commit message"), opt_parse_m),
+		OPT_STRING('c', "reedit-message", &edit_message, N_("commit"), N_("reuse and edit message from specified commit")),
+		OPT_STRING('C', "reuse-message", &use_message, N_("commit"), N_("reuse message from specified commit")),
+		OPT_STRING(0, "fixup", &fixup_message, N_("commit"), N_("use autosquash formatted message to fixup specified commit")),
+		OPT_STRING(0, "squash", &squash_message, N_("commit"), N_("use autosquash formatted message to squash specified commit")),
+		OPT_BOOLEAN(0, "reset-author", &renew_authorship, N_("the commit is authored by me now (used with -C/-c/--amend)")),
+		OPT_BOOLEAN('s', "signoff", &signoff, N_("add Signed-off-by:")),
+		OPT_FILENAME('t', "template", &template_file, N_("use specified template file")),
+		OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
+		OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
+		OPT_BOOLEAN(0, "status", &include_status, N_("include status in commit message template")),
+		{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
+		  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
 		/* end commit message options */
 
-		OPT_GROUP("Commit contents options"),
-		OPT_BOOLEAN('a', "all", &all, "commit all changed files"),
-		OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"),
-		OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"),
-		OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"),
-		OPT_BOOLEAN('o', "only", &only, "commit only specified files"),
-		OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"),
-		OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"),
-		OPT_SET_INT(0, "short", &status_format, "show status concisely",
+		OPT_GROUP(N_("Commit contents options")),
+		OPT_BOOLEAN('a', "all", &all, N_("commit all changed files")),
+		OPT_BOOLEAN('i', "include", &also, N_("add specified files to index for commit")),
+		OPT_BOOLEAN(0, "interactive", &interactive, N_("interactively add files")),
+		OPT_BOOLEAN('p', "patch", &patch_interactive, N_("interactively add changes")),
+		OPT_BOOLEAN('o', "only", &only, N_("commit only specified files")),
+		OPT_BOOLEAN('n', "no-verify", &no_verify, N_("bypass pre-commit hook")),
+		OPT_BOOLEAN(0, "dry-run", &dry_run, N_("show what would be committed")),
+		OPT_SET_INT(0, "short", &status_format, N_("show status concisely"),
 			    STATUS_FORMAT_SHORT),
-		OPT_BOOLEAN(0, "branch", &s.show_branch, "show branch information"),
+		OPT_BOOLEAN(0, "branch", &s.show_branch, N_("show branch information")),
 		OPT_SET_INT(0, "porcelain", &status_format,
-			    "machine-readable output", STATUS_FORMAT_PORCELAIN),
+			    N_("machine-readable output"), STATUS_FORMAT_PORCELAIN),
 		OPT_BOOLEAN('z', "null", &s.null_termination,
-			    "terminate entries with NUL"),
-		OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
-		OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
-		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
+			    N_("terminate entries with NUL")),
+		OPT_BOOLEAN(0, "amend", &amend, N_("amend previous commit")),
+		OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, N_("bypass post-rewrite hook")),
+		{ OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, N_("mode"), N_("show untracked files, optional modes: all, normal, no. (Default: all)"), PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
 		/* end commit contents options */
 
 		{ OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
-		  "ok to record an empty change",
+		  N_("ok to record an empty change"),
 		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
 		{ OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL,
-		  "ok to record a change with an empty message",
+		  N_("ok to record a change with an empty message"),
 		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
 
 		OPT_END()
@@ -1452,6 +1419,7 @@
 		usage_with_options(builtin_commit_usage, builtin_commit_options);
 
 	wt_status_prepare(&s);
+	gitmodules_config();
 	git_config(git_commit_config, &s);
 	determine_whence(&s);
 	s.colopts = 0;
diff --git a/builtin/config.c b/builtin/config.c
index 442ccc2..e1c33e0 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -4,7 +4,7 @@
 #include "parse-options.h"
 
 static const char *const builtin_config_usage[] = {
-	"git config [options]",
+	N_("git config [options]"),
 	NULL
 };
 
@@ -49,33 +49,33 @@
 #define TYPE_PATH (1<<3)
 
 static struct option builtin_config_options[] = {
-	OPT_GROUP("Config file location"),
-	OPT_BOOLEAN(0, "global", &use_global_config, "use global config file"),
-	OPT_BOOLEAN(0, "system", &use_system_config, "use system config file"),
-	OPT_BOOLEAN(0, "local", &use_local_config, "use repository config file"),
-	OPT_STRING('f', "file", &given_config_file, "file", "use given config file"),
-	OPT_GROUP("Action"),
-	OPT_BIT(0, "get", &actions, "get value: name [value-regex]", ACTION_GET),
-	OPT_BIT(0, "get-all", &actions, "get all values: key [value-regex]", ACTION_GET_ALL),
-	OPT_BIT(0, "get-regexp", &actions, "get values for regexp: name-regex [value-regex]", ACTION_GET_REGEXP),
-	OPT_BIT(0, "replace-all", &actions, "replace all matching variables: name value [value_regex]", ACTION_REPLACE_ALL),
-	OPT_BIT(0, "add", &actions, "adds a new variable: name value", ACTION_ADD),
-	OPT_BIT(0, "unset", &actions, "removes a variable: name [value-regex]", ACTION_UNSET),
-	OPT_BIT(0, "unset-all", &actions, "removes all matches: name [value-regex]", ACTION_UNSET_ALL),
-	OPT_BIT(0, "rename-section", &actions, "rename section: old-name new-name", ACTION_RENAME_SECTION),
-	OPT_BIT(0, "remove-section", &actions, "remove a section: name", ACTION_REMOVE_SECTION),
-	OPT_BIT('l', "list", &actions, "list all", ACTION_LIST),
-	OPT_BIT('e', "edit", &actions, "opens an editor", ACTION_EDIT),
-	OPT_STRING(0, "get-color", &get_color_slot, "slot", "find the color configured: [default]"),
-	OPT_STRING(0, "get-colorbool", &get_colorbool_slot, "slot", "find the color setting: [stdout-is-tty]"),
-	OPT_GROUP("Type"),
-	OPT_BIT(0, "bool", &types, "value is \"true\" or \"false\"", TYPE_BOOL),
-	OPT_BIT(0, "int", &types, "value is decimal number", TYPE_INT),
-	OPT_BIT(0, "bool-or-int", &types, "value is --bool or --int", TYPE_BOOL_OR_INT),
-	OPT_BIT(0, "path", &types, "value is a path (file or directory name)", TYPE_PATH),
-	OPT_GROUP("Other"),
-	OPT_BOOLEAN('z', "null", &end_null, "terminate values with NUL byte"),
-	OPT_BOOL(0, "includes", &respect_includes, "respect include directives on lookup"),
+	OPT_GROUP(N_("Config file location")),
+	OPT_BOOLEAN(0, "global", &use_global_config, N_("use global config file")),
+	OPT_BOOLEAN(0, "system", &use_system_config, N_("use system config file")),
+	OPT_BOOLEAN(0, "local", &use_local_config, N_("use repository config file")),
+	OPT_STRING('f', "file", &given_config_file, N_("file"), N_("use given config file")),
+	OPT_GROUP(N_("Action")),
+	OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), ACTION_GET),
+	OPT_BIT(0, "get-all", &actions, N_("get all values: key [value-regex]"), ACTION_GET_ALL),
+	OPT_BIT(0, "get-regexp", &actions, N_("get values for regexp: name-regex [value-regex]"), ACTION_GET_REGEXP),
+	OPT_BIT(0, "replace-all", &actions, N_("replace all matching variables: name value [value_regex]"), ACTION_REPLACE_ALL),
+	OPT_BIT(0, "add", &actions, N_("add a new variable: name value"), ACTION_ADD),
+	OPT_BIT(0, "unset", &actions, N_("remove a variable: name [value-regex]"), ACTION_UNSET),
+	OPT_BIT(0, "unset-all", &actions, N_("remove all matches: name [value-regex]"), ACTION_UNSET_ALL),
+	OPT_BIT(0, "rename-section", &actions, N_("rename section: old-name new-name"), ACTION_RENAME_SECTION),
+	OPT_BIT(0, "remove-section", &actions, N_("remove a section: name"), ACTION_REMOVE_SECTION),
+	OPT_BIT('l', "list", &actions, N_("list all"), ACTION_LIST),
+	OPT_BIT('e', "edit", &actions, N_("open an editor"), ACTION_EDIT),
+	OPT_STRING(0, "get-color", &get_color_slot, N_("slot"), N_("find the color configured: [default]")),
+	OPT_STRING(0, "get-colorbool", &get_colorbool_slot, N_("slot"), N_("find the color setting: [stdout-is-tty]")),
+	OPT_GROUP(N_("Type")),
+	OPT_BIT(0, "bool", &types, N_("value is \"true\" or \"false\""), TYPE_BOOL),
+	OPT_BIT(0, "int", &types, N_("value is decimal number"), TYPE_INT),
+	OPT_BIT(0, "bool-or-int", &types, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
+	OPT_BIT(0, "path", &types, N_("value is a path (file or directory name)"), TYPE_PATH),
+	OPT_GROUP(N_("Other")),
+	OPT_BOOLEAN('z', "null", &end_null, N_("terminate values with NUL byte")),
+	OPT_BOOL(0, "includes", &respect_includes, N_("respect include directives on lookup")),
 	OPT_END(),
 };
 
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index c37cb98..9afaa88 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -66,7 +66,7 @@
 }
 
 static char const * const count_objects_usage[] = {
-	"git count-objects [-v]",
+	N_("git count-objects [-v]"),
 	NULL
 };
 
@@ -79,7 +79,7 @@
 	unsigned long loose = 0, packed = 0, packed_loose = 0, garbage = 0;
 	off_t loose_size = 0;
 	struct option opts[] = {
-		OPT__VERBOSE(&verbose, "be verbose"),
+		OPT__VERBOSE(&verbose, N_("be verbose")),
 		OPT_END(),
 	};
 
diff --git a/builtin/describe.c b/builtin/describe.c
index 9f63067..9fe11ed 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -12,8 +12,8 @@
 #define MAX_TAGS	(FLAG_BITS - 1)
 
 static const char * const describe_usage[] = {
-	"git describe [options] <committish>*",
-	"git describe [options] --dirty",
+	N_("git describe [options] <committish>*"),
+	N_("git describe [options] --dirty"),
 	NULL
 };
 
@@ -400,22 +400,22 @@
 {
 	int contains = 0;
 	struct option options[] = {
-		OPT_BOOLEAN(0, "contains",   &contains, "find the tag that comes after the commit"),
-		OPT_BOOLEAN(0, "debug",      &debug, "debug search strategy on stderr"),
-		OPT_BOOLEAN(0, "all",        &all, "use any ref in .git/refs"),
-		OPT_BOOLEAN(0, "tags",       &tags, "use any tag in .git/refs/tags"),
-		OPT_BOOLEAN(0, "long",       &longformat, "always use long format"),
+		OPT_BOOLEAN(0, "contains",   &contains, N_("find the tag that comes after the commit")),
+		OPT_BOOLEAN(0, "debug",      &debug, N_("debug search strategy on stderr")),
+		OPT_BOOLEAN(0, "all",        &all, N_("use any ref in .git/refs")),
+		OPT_BOOLEAN(0, "tags",       &tags, N_("use any tag in .git/refs/tags")),
+		OPT_BOOLEAN(0, "long",       &longformat, N_("always use long format")),
 		OPT__ABBREV(&abbrev),
 		OPT_SET_INT(0, "exact-match", &max_candidates,
-			    "only output exact matches", 0),
+			    N_("only output exact matches"), 0),
 		OPT_INTEGER(0, "candidates", &max_candidates,
-			    "consider <n> most recent tags (default: 10)"),
-		OPT_STRING(0, "match",       &pattern, "pattern",
-			   "only consider tags matching <pattern>"),
+			    N_("consider <n> most recent tags (default: 10)")),
+		OPT_STRING(0, "match",       &pattern, N_("pattern"),
+			   N_("only consider tags matching <pattern>")),
 		OPT_BOOLEAN(0, "always",     &always,
-			   "show abbreviated commit object as fallback"),
-		{OPTION_STRING, 0, "dirty",  &dirty, "mark",
-			   "append <mark> on dirty working tree (default: \"-dirty\")",
+			   N_("show abbreviated commit object as fallback")),
+		{OPTION_STRING, 0, "dirty",  &dirty, N_("mark"),
+			   N_("append <mark> on dirty working tree (default: \"-dirty\")"),
 		 PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
 		OPT_END(),
 	};
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 9ab6db3..12220ad 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -19,7 +19,7 @@
 #include "quote.h"
 
 static const char *fast_export_usage[] = {
-	"git fast-export [rev-list-opts]",
+	N_("git fast-export [rev-list-opts]"),
 	NULL
 };
 
@@ -632,24 +632,24 @@
 	char *export_filename = NULL, *import_filename = NULL;
 	struct option options[] = {
 		OPT_INTEGER(0, "progress", &progress,
-			    "show progress after <n> objects"),
-		OPT_CALLBACK(0, "signed-tags", &signed_tag_mode, "mode",
-			     "select handling of signed tags",
+			    N_("show progress after <n> objects")),
+		OPT_CALLBACK(0, "signed-tags", &signed_tag_mode, N_("mode"),
+			     N_("select handling of signed tags"),
 			     parse_opt_signed_tag_mode),
-		OPT_CALLBACK(0, "tag-of-filtered-object", &tag_of_filtered_mode, "mode",
-			     "select handling of tags that tag filtered objects",
+		OPT_CALLBACK(0, "tag-of-filtered-object", &tag_of_filtered_mode, N_("mode"),
+			     N_("select handling of tags that tag filtered objects"),
 			     parse_opt_tag_of_filtered_mode),
-		OPT_STRING(0, "export-marks", &export_filename, "file",
-			     "Dump marks to this file"),
-		OPT_STRING(0, "import-marks", &import_filename, "file",
-			     "Import marks from this file"),
+		OPT_STRING(0, "export-marks", &export_filename, N_("file"),
+			     N_("Dump marks to this file")),
+		OPT_STRING(0, "import-marks", &import_filename, N_("file"),
+			     N_("Import marks from this file")),
 		OPT_BOOLEAN(0, "fake-missing-tagger", &fake_missing_tagger,
-			     "Fake a tagger when tags lack one"),
+			     N_("Fake a tagger when tags lack one")),
 		OPT_BOOLEAN(0, "full-tree", &full_tree,
-			     "Output full tree for each commit"),
+			     N_("Output full tree for each commit")),
 		OPT_BOOLEAN(0, "use-done-feature", &use_done_feature,
-			     "Use the done feature to terminate the stream"),
-		OPT_BOOL(0, "no-data", &no_data, "Skip output of blob data"),
+			     N_("Use the done feature to terminate the stream")),
+		OPT_BOOL(0, "no-data", &no_data, N_("Skip output of blob data")),
 		OPT_END()
 	};
 
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index fdda36f..e644398 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -525,72 +525,59 @@
 	}
 }
 
-static void filter_refs(struct ref **refs, int nr_match, char **match)
+static int non_matching_ref(struct string_list_item *item, void *unused)
 {
-	struct ref **return_refs;
+	if (item->util) {
+		item->util = NULL;
+		return 0;
+	}
+	else
+		return 1;
+}
+
+static void filter_refs(struct ref **refs, struct string_list *sought)
+{
 	struct ref *newlist = NULL;
 	struct ref **newtail = &newlist;
 	struct ref *ref, *next;
-	struct ref *fastarray[32];
-	int match_pos;
+	int sought_pos;
 
-	if (nr_match && !args.fetch_all) {
-		if (ARRAY_SIZE(fastarray) < nr_match)
-			return_refs = xcalloc(nr_match, sizeof(struct ref *));
-		else {
-			return_refs = fastarray;
-			memset(return_refs, 0, sizeof(struct ref *) * nr_match);
-		}
-	}
-	else
-		return_refs = NULL;
-
-	match_pos = 0;
+	sought_pos = 0;
 	for (ref = *refs; ref; ref = next) {
+		int keep = 0;
 		next = ref->next;
 		if (!memcmp(ref->name, "refs/", 5) &&
 		    check_refname_format(ref->name + 5, 0))
 			; /* trash */
-		else if (args.fetch_all &&
-			 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
+		else {
+			while (sought_pos < sought->nr) {
+				int cmp = strcmp(ref->name, sought->items[sought_pos].string);
+				if (cmp < 0)
+					break; /* definitely do not have it */
+				else if (cmp == 0) {
+					keep = 1; /* definitely have it */
+					sought->items[sought_pos++].util = "matched";
+					break;
+				}
+				else
+					sought_pos++; /* might have it; keep looking */
+			}
+		}
+
+		if (! keep && args.fetch_all &&
+		    (!args.depth || prefixcmp(ref->name, "refs/tags/")))
+			keep = 1;
+
+		if (keep) {
 			*newtail = ref;
 			ref->next = NULL;
 			newtail = &ref->next;
-			continue;
+		} else {
+			free(ref);
 		}
-		else {
-			int cmp = -1;
-			while (match_pos < nr_match) {
-				cmp = strcmp(ref->name, match[match_pos]);
-				if (cmp < 0) /* definitely do not have it */
-					break;
-				else if (cmp == 0) { /* definitely have it */
-					match[match_pos][0] = '\0';
-					return_refs[match_pos] = ref;
-					break;
-				}
-				else /* might have it; keep looking */
-					match_pos++;
-			}
-			if (!cmp)
-				continue; /* we will link it later */
-		}
-		free(ref);
 	}
 
-	if (!args.fetch_all) {
-		int i;
-		for (i = 0; i < nr_match; i++) {
-			ref = return_refs[i];
-			if (ref) {
-				*newtail = ref;
-				ref->next = NULL;
-				newtail = &ref->next;
-			}
-		}
-		if (return_refs != fastarray)
-			free(return_refs);
-	}
+	filter_string_list(sought, 0, non_matching_ref, NULL);
 	*refs = newlist;
 }
 
@@ -599,7 +586,7 @@
 	mark_complete(NULL, ref->old_sha1, 0, NULL);
 }
 
-static int everything_local(struct ref **refs, int nr_match, char **match)
+static int everything_local(struct ref **refs, struct string_list *sought)
 {
 	struct ref *ref;
 	int retval;
@@ -650,7 +637,7 @@
 		}
 	}
 
-	filter_refs(refs, nr_match, match);
+	filter_refs(refs, sought);
 
 	for (retval = 1, ref = *refs; ref ; ref = ref->next) {
 		const unsigned char *remote = ref->old_sha1;
@@ -781,8 +768,7 @@
 
 static struct ref *do_fetch_pack(int fd[2],
 		const struct ref *orig_ref,
-		int nr_match,
-		char **match,
+		struct string_list *sought,
 		char **pack_lockfile)
 {
 	struct ref *ref = copy_ref_list(orig_ref);
@@ -839,7 +825,7 @@
 				agent_len, agent_feature);
 	}
 
-	if (everything_local(&ref, nr_match, match)) {
+	if (everything_local(&ref, sought)) {
 		packet_flush(fd[1]);
 		goto all_done;
 	}
@@ -859,19 +845,6 @@
 	return ref;
 }
 
-static int remove_duplicates(int nr_heads, char **heads)
-{
-	int src, dst;
-
-	if (!nr_heads)
-		return 0;
-
-	for (src = dst = 1; src < nr_heads; src++)
-		if (strcmp(heads[src], heads[dst-1]))
-			heads[dst++] = heads[src];
-	return dst;
-}
-
 static int fetch_pack_config(const char *var, const char *value, void *cb)
 {
 	if (strcmp(var, "fetch.unpacklimit") == 0) {
@@ -922,8 +895,7 @@
 	int i, ret;
 	struct ref *ref = NULL;
 	const char *dest = NULL;
-	int alloc_heads = 0, nr_heads = 0;
-	char **heads = NULL;
+	struct string_list sought = STRING_LIST_INIT_DUP;
 	int fd[2];
 	char *pack_lockfile = NULL;
 	char **pack_lockfile_ptr = NULL;
@@ -1000,9 +972,8 @@
 	 * Copy refs from cmdline to growable list, then append any
 	 * refs from the standard input:
 	 */
-	ALLOC_GROW(heads, argc - i, alloc_heads);
 	for (; i < argc; i++)
-		heads[nr_heads++] = xstrdup(argv[i]);
+		string_list_append(&sought, xstrdup(argv[i]));
 	if (args.stdin_refs) {
 		if (args.stateless_rpc) {
 			/* in stateless RPC mode we use pkt-line to read
@@ -1015,17 +986,14 @@
 					break;
 				if (line[n-1] == '\n')
 					n--;
-				ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
-				heads[nr_heads++] = xmemdupz(line, n);
+				string_list_append(&sought, xmemdupz(line, n));
 			}
 		}
 		else {
 			/* read from stdin one ref per line, until EOF */
 			struct strbuf line = STRBUF_INIT;
-			while (strbuf_getline(&line, stdin, '\n') != EOF) {
-				ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
-				heads[nr_heads++] = strbuf_detach(&line, NULL);
-			}
+			while (strbuf_getline(&line, stdin, '\n') != EOF)
+				string_list_append(&sought, strbuf_detach(&line, NULL));
 			strbuf_release(&line);
 		}
 	}
@@ -1042,7 +1010,7 @@
 	get_remote_heads(fd[0], &ref, 0, NULL);
 
 	ref = fetch_pack(&args, fd, conn, ref, dest,
-		nr_heads, heads, pack_lockfile_ptr);
+			 &sought, pack_lockfile_ptr);
 	if (pack_lockfile) {
 		printf("lock %s\n", pack_lockfile);
 		fflush(stdout);
@@ -1050,21 +1018,18 @@
 	close(fd[0]);
 	close(fd[1]);
 	if (finish_connect(conn))
-		ref = NULL;
-	ret = !ref;
+		return 1;
 
-	if (!ret && nr_heads) {
-		/* If the heads to pull were given, we should have
-		 * consumed all of them by matching the remote.
-		 * Otherwise, 'git fetch remote no-such-ref' would
-		 * silently succeed without issuing an error.
-		 */
-		for (i = 0; i < nr_heads; i++)
-			if (heads[i] && heads[i][0]) {
-				error("no such remote ref %s", heads[i]);
-				ret = 1;
-			}
-	}
+	ret = !ref || sought.nr;
+
+	/*
+	 * If the heads to pull were given, we should have consumed
+	 * all of them by matching the remote.  Otherwise, 'git fetch
+	 * remote no-such-ref' would silently succeed without issuing
+	 * an error.
+	 */
+	for (i = 0; i < sought.nr; i++)
+		error("no such remote ref %s", sought.items[i].string);
 	while (ref) {
 		printf("%s %s\n",
 		       sha1_to_hex(ref->old_sha1), ref->name);
@@ -1074,18 +1039,12 @@
 	return ret;
 }
 
-static int compare_heads(const void *a, const void *b)
-{
-	return strcmp(*(const char **)a, *(const char **)b);
-}
-
 struct ref *fetch_pack(struct fetch_pack_args *my_args,
 		       int fd[], struct child_process *conn,
 		       const struct ref *ref,
-		const char *dest,
-		int nr_heads,
-		char **heads,
-		char **pack_lockfile)
+		       const char *dest,
+		       struct string_list *sought,
+		       char **pack_lockfile)
 {
 	struct stat st;
 	struct ref *ref_cpy;
@@ -1098,16 +1057,16 @@
 			st.st_mtime = 0;
 	}
 
-	if (heads && nr_heads) {
-		qsort(heads, nr_heads, sizeof(*heads), compare_heads);
-		nr_heads = remove_duplicates(nr_heads, heads);
+	if (sought->nr) {
+		sort_string_list(sought);
+		string_list_remove_duplicates(sought, 0);
 	}
 
 	if (!ref) {
 		packet_flush(fd[1]);
 		die("no matching remote head");
 	}
-	ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
+	ref_cpy = do_fetch_pack(fd, ref, sought, pack_lockfile);
 
 	if (args.depth > 0) {
 		struct cache_time mtime;
diff --git a/builtin/fetch.c b/builtin/fetch.c
index f483352..4b5a898 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -17,10 +17,10 @@
 #include "argv-array.h"
 
 static const char * const builtin_fetch_usage[] = {
-	"git fetch [<options>] [<repository> [<refspec>...]]",
-	"git fetch [<options>] <group>",
-	"git fetch --multiple [<options>] [(<repository> | <group>)...]",
-	"git fetch --all [<options>]",
+	N_("git fetch [<options>] [<repository> [<refspec>...]]"),
+	N_("git fetch [<options>] <group>"),
+	N_("git fetch --multiple [<options>] [(<repository> | <group>)...]"),
+	N_("git fetch --all [<options>]"),
 	NULL
 };
 
@@ -57,36 +57,36 @@
 static struct option builtin_fetch_options[] = {
 	OPT__VERBOSITY(&verbosity),
 	OPT_BOOLEAN(0, "all", &all,
-		    "fetch from all remotes"),
+		    N_("fetch from all remotes")),
 	OPT_BOOLEAN('a', "append", &append,
-		    "append to .git/FETCH_HEAD instead of overwriting"),
-	OPT_STRING(0, "upload-pack", &upload_pack, "path",
-		   "path to upload pack on remote end"),
-	OPT__FORCE(&force, "force overwrite of local branch"),
+		    N_("append to .git/FETCH_HEAD instead of overwriting")),
+	OPT_STRING(0, "upload-pack", &upload_pack, N_("path"),
+		   N_("path to upload pack on remote end")),
+	OPT__FORCE(&force, N_("force overwrite of local branch")),
 	OPT_BOOLEAN('m', "multiple", &multiple,
-		    "fetch from multiple remotes"),
+		    N_("fetch from multiple remotes")),
 	OPT_SET_INT('t', "tags", &tags,
-		    "fetch all tags and associated objects", TAGS_SET),
+		    N_("fetch all tags and associated objects"), TAGS_SET),
 	OPT_SET_INT('n', NULL, &tags,
-		    "do not fetch all tags (--no-tags)", TAGS_UNSET),
+		    N_("do not fetch all tags (--no-tags)"), TAGS_UNSET),
 	OPT_BOOLEAN('p', "prune", &prune,
-		    "prune remote-tracking branches no longer on remote"),
-	{ OPTION_CALLBACK, 0, "recurse-submodules", NULL, "on-demand",
-		    "control recursive fetching of submodules",
+		    N_("prune remote-tracking branches no longer on remote")),
+	{ OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"),
+		    N_("control recursive fetching of submodules"),
 		    PARSE_OPT_OPTARG, option_parse_recurse_submodules },
 	OPT_BOOLEAN(0, "dry-run", &dry_run,
-		    "dry run"),
-	OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"),
+		    N_("dry run")),
+	OPT_BOOLEAN('k', "keep", &keep, N_("keep downloaded pack")),
 	OPT_BOOLEAN('u', "update-head-ok", &update_head_ok,
-		    "allow updating of HEAD ref"),
-	OPT_BOOL(0, "progress", &progress, "force progress reporting"),
-	OPT_STRING(0, "depth", &depth, "depth",
-		   "deepen history of shallow clone"),
-	{ OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, "dir",
-		   "prepend this to submodule path output", PARSE_OPT_HIDDEN },
+		    N_("allow updating of HEAD ref")),
+	OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
+	OPT_STRING(0, "depth", &depth, N_("depth"),
+		   N_("deepen history of shallow clone")),
+	{ OPTION_STRING, 0, "submodule-prefix", &submodule_prefix, N_("dir"),
+		   N_("prepend this to submodule path output"), PARSE_OPT_HIDDEN },
 	{ OPTION_STRING, 0, "recurse-submodules-default",
 		   &recurse_submodules_default, NULL,
-		   "default mode for recursion", PARSE_OPT_HIDDEN },
+		   N_("default mode for recursion"), PARSE_OPT_HIDDEN },
 	OPT_END()
 };
 
@@ -256,9 +256,8 @@
 	if (!hashcmp(ref->old_sha1, ref->new_sha1)) {
 		if (verbosity > 0)
 			strbuf_addf(display, "= %-*s %-*s -> %s",
-				    TRANSPORT_SUMMARY_WIDTH,
-				    _("[up to date]"), REFCOL_WIDTH,
-				    remote, pretty_ref);
+				    TRANSPORT_SUMMARY(_("[up to date]")),
+				    REFCOL_WIDTH, remote, pretty_ref);
 		return 0;
 	}
 
@@ -272,7 +271,7 @@
 		 */
 		strbuf_addf(display,
 			    _("! %-*s %-*s -> %s  (can't fetch in current branch)"),
-			    TRANSPORT_SUMMARY_WIDTH, _("[rejected]"),
+			    TRANSPORT_SUMMARY(_("[rejected]")),
 			    REFCOL_WIDTH, remote, pretty_ref);
 		return 1;
 	}
@@ -283,7 +282,7 @@
 		r = s_update_ref("updating tag", ref, 0);
 		strbuf_addf(display, "%c %-*s %-*s -> %s%s",
 			    r ? '!' : '-',
-			    TRANSPORT_SUMMARY_WIDTH, _("[tag update]"),
+			    TRANSPORT_SUMMARY(_("[tag update]")),
 			    REFCOL_WIDTH, remote, pretty_ref,
 			    r ? _("  (unable to update local ref)") : "");
 		return r;
@@ -318,13 +317,13 @@
 		r = s_update_ref(msg, ref, 0);
 		strbuf_addf(display, "%c %-*s %-*s -> %s%s",
 			    r ? '!' : '*',
-			    TRANSPORT_SUMMARY_WIDTH, what,
+			    TRANSPORT_SUMMARY(what),
 			    REFCOL_WIDTH, remote, pretty_ref,
 			    r ? _("  (unable to update local ref)") : "");
 		return r;
 	}
 
-	if (in_merge_bases(current, &updated, 1)) {
+	if (in_merge_bases(current, updated)) {
 		char quickref[83];
 		int r;
 		strcpy(quickref, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
@@ -358,7 +357,7 @@
 		return r;
 	} else {
 		strbuf_addf(display, "! %-*s %-*s -> %s  %s",
-			    TRANSPORT_SUMMARY_WIDTH, _("[rejected]"),
+			    TRANSPORT_SUMMARY(_("[rejected]")),
 			    REFCOL_WIDTH, remote, pretty_ref,
 			    _("(non-fast-forward)"));
 		return 1;
@@ -555,7 +554,7 @@
 			result |= delete_ref(ref->name, NULL, 0);
 		if (verbosity >= 0) {
 			fprintf(stderr, " x %-*s %-*s -> %s\n",
-				TRANSPORT_SUMMARY_WIDTH, _("[deleted]"),
+				TRANSPORT_SUMMARY(_("[deleted]")),
 				REFCOL_WIDTH, _("(none)"), prettify_refname(ref->name));
 			warn_dangling_symref(stderr, dangling_msg, ref->name);
 		}
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index 2c4d435..e2e27b2 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -10,7 +10,7 @@
 #include "gpg-interface.h"
 
 static const char * const fmt_merge_msg_usage[] = {
-	"git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]",
+	N_("git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"),
 	NULL
 };
 
@@ -650,16 +650,16 @@
 	const char *message = NULL;
 	int shortlog_len = -1;
 	struct option options[] = {
-		{ OPTION_INTEGER, 0, "log", &shortlog_len, "n",
-		  "populate log with at most <n> entries from shortlog",
+		{ OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
+		  N_("populate log with at most <n> entries from shortlog"),
 		  PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
-		{ OPTION_INTEGER, 0, "summary", &shortlog_len, "n",
-		  "alias for --log (deprecated)",
+		{ OPTION_INTEGER, 0, "summary", &shortlog_len, N_("n"),
+		  N_("alias for --log (deprecated)"),
 		  PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, NULL,
 		  DEFAULT_MERGE_LOG_LEN },
-		OPT_STRING('m', "message", &message, "text",
-			"use <text> as start of message"),
-		OPT_FILENAME('F', "file", &inpath, "file to read from"),
+		OPT_STRING('m', "message", &message, N_("text"),
+			N_("use <text> as start of message")),
+		OPT_FILENAME('F', "file", &inpath, N_("file to read from")),
 		OPT_END()
 	};
 
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 0c5294e..7f059c3 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -976,7 +976,7 @@
 }
 
 static char const * const for_each_ref_usage[] = {
-	"git for-each-ref [options] [<pattern>]",
+	N_("git for-each-ref [options] [<pattern>]"),
 	NULL
 };
 
@@ -991,19 +991,19 @@
 
 	struct option opts[] = {
 		OPT_BIT('s', "shell", &quote_style,
-		        "quote placeholders suitably for shells", QUOTE_SHELL),
+			N_("quote placeholders suitably for shells"), QUOTE_SHELL),
 		OPT_BIT('p', "perl",  &quote_style,
-		        "quote placeholders suitably for perl", QUOTE_PERL),
+			N_("quote placeholders suitably for perl"), QUOTE_PERL),
 		OPT_BIT(0 , "python", &quote_style,
-		        "quote placeholders suitably for python", QUOTE_PYTHON),
+			N_("quote placeholders suitably for python"), QUOTE_PYTHON),
 		OPT_BIT(0 , "tcl",  &quote_style,
-		        "quote placeholders suitably for tcl", QUOTE_TCL),
+			N_("quote placeholders suitably for tcl"), QUOTE_TCL),
 
 		OPT_GROUP(""),
-		OPT_INTEGER( 0 , "count", &maxcount, "show only <n> matched refs"),
-		OPT_STRING(  0 , "format", &format, "format", "format to use for the output"),
-		OPT_CALLBACK(0 , "sort", sort_tail, "key",
-		            "field name to sort on", &opt_parse_sort),
+		OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")),
+		OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
+		OPT_CALLBACK(0 , "sort", sort_tail, N_("key"),
+			    N_("field name to sort on"), &opt_parse_sort),
 		OPT_END(),
 	};
 
diff --git a/builtin/fsck.c b/builtin/fsck.c
index a710227..bb9a2cd 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -605,23 +605,23 @@
 }
 
 static char const * const fsck_usage[] = {
-	"git fsck [options] [<object>...]",
+	N_("git fsck [options] [<object>...]"),
 	NULL
 };
 
 static struct option fsck_opts[] = {
-	OPT__VERBOSE(&verbose, "be verbose"),
-	OPT_BOOLEAN(0, "unreachable", &show_unreachable, "show unreachable objects"),
-	OPT_BOOL(0, "dangling", &show_dangling, "show dangling objects"),
-	OPT_BOOLEAN(0, "tags", &show_tags, "report tags"),
-	OPT_BOOLEAN(0, "root", &show_root, "report root nodes"),
-	OPT_BOOLEAN(0, "cache", &keep_cache_objects, "make index objects head nodes"),
-	OPT_BOOLEAN(0, "reflogs", &include_reflogs, "make reflogs head nodes (default)"),
-	OPT_BOOLEAN(0, "full", &check_full, "also consider packs and alternate objects"),
-	OPT_BOOLEAN(0, "strict", &check_strict, "enable more strict checking"),
+	OPT__VERBOSE(&verbose, N_("be verbose")),
+	OPT_BOOLEAN(0, "unreachable", &show_unreachable, N_("show unreachable objects")),
+	OPT_BOOL(0, "dangling", &show_dangling, N_("show dangling objects")),
+	OPT_BOOLEAN(0, "tags", &show_tags, N_("report tags")),
+	OPT_BOOLEAN(0, "root", &show_root, N_("report root nodes")),
+	OPT_BOOLEAN(0, "cache", &keep_cache_objects, N_("make index objects head nodes")),
+	OPT_BOOLEAN(0, "reflogs", &include_reflogs, N_("make reflogs head nodes (default)")),
+	OPT_BOOLEAN(0, "full", &check_full, N_("also consider packs and alternate objects")),
+	OPT_BOOLEAN(0, "strict", &check_strict, N_("enable more strict checking")),
 	OPT_BOOLEAN(0, "lost-found", &write_lost_and_found,
-				"write dangling objects in .git/lost-found"),
-	OPT_BOOL(0, "progress", &show_progress, "show progress"),
+				N_("write dangling objects in .git/lost-found")),
+	OPT_BOOL(0, "progress", &show_progress, N_("show progress")),
 	OPT_END(),
 };
 
diff --git a/builtin/gc.c b/builtin/gc.c
index 9b4232c..6d46608 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -19,7 +19,7 @@
 #define FAILED_RUN "failed to run %s"
 
 static const char * const builtin_gc_usage[] = {
-	"git gc [options]",
+	N_("git gc [options]"),
 	NULL
 };
 
@@ -174,12 +174,12 @@
 	int quiet = 0;
 
 	struct option builtin_gc_options[] = {
-		OPT__QUIET(&quiet, "suppress progress reporting"),
-		{ OPTION_STRING, 0, "prune", &prune_expire, "date",
-			"prune unreferenced objects",
+		OPT__QUIET(&quiet, N_("suppress progress reporting")),
+		{ OPTION_STRING, 0, "prune", &prune_expire, N_("date"),
+			N_("prune unreferenced objects"),
 			PARSE_OPT_OPTARG, NULL, (intptr_t)prune_expire },
-		OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"),
-		OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"),
+		OPT_BOOLEAN(0, "aggressive", &aggressive, N_("be more thorough (increased runtime)")),
+		OPT_BOOLEAN(0, "auto", &auto_gc, N_("enable auto-gc mode")),
 		OPT_END()
 	};
 
diff --git a/builtin/grep.c b/builtin/grep.c
index 29adb0a..82530a6 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -19,7 +19,7 @@
 #include "dir.h"
 
 static char const * const grep_usage[] = {
-	"git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
+	N_("git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"),
 	NULL
 };
 
@@ -209,6 +209,7 @@
 		int err;
 		struct grep_opt *o = grep_opt_dup(opt);
 		o->output = strbuf_out;
+		o->debug = 0;
 		compile_grep_patterns(o);
 		err = pthread_create(&threads[i], NULL, run, o);
 
@@ -260,6 +261,53 @@
 }
 #endif
 
+static int parse_pattern_type_arg(const char *opt, const char *arg)
+{
+	if (!strcmp(arg, "default"))
+		return GREP_PATTERN_TYPE_UNSPECIFIED;
+	else if (!strcmp(arg, "basic"))
+		return GREP_PATTERN_TYPE_BRE;
+	else if (!strcmp(arg, "extended"))
+		return GREP_PATTERN_TYPE_ERE;
+	else if (!strcmp(arg, "fixed"))
+		return GREP_PATTERN_TYPE_FIXED;
+	else if (!strcmp(arg, "perl"))
+		return GREP_PATTERN_TYPE_PCRE;
+	die("bad %s argument: %s", opt, arg);
+}
+
+static void grep_pattern_type_options(const int pattern_type, struct grep_opt *opt)
+{
+	switch (pattern_type) {
+	case GREP_PATTERN_TYPE_UNSPECIFIED:
+		/* fall through */
+
+	case GREP_PATTERN_TYPE_BRE:
+		opt->fixed = 0;
+		opt->pcre = 0;
+		opt->regflags &= ~REG_EXTENDED;
+		break;
+
+	case GREP_PATTERN_TYPE_ERE:
+		opt->fixed = 0;
+		opt->pcre = 0;
+		opt->regflags |= REG_EXTENDED;
+		break;
+
+	case GREP_PATTERN_TYPE_FIXED:
+		opt->fixed = 1;
+		opt->pcre = 0;
+		opt->regflags &= ~REG_EXTENDED;
+		break;
+
+	case GREP_PATTERN_TYPE_PCRE:
+		opt->fixed = 0;
+		opt->pcre = 1;
+		opt->regflags &= ~REG_EXTENDED;
+		break;
+	}
+}
+
 static int grep_config(const char *var, const char *value, void *cb)
 {
 	struct grep_opt *opt = cb;
@@ -270,12 +318,17 @@
 
 	if (!strcmp(var, "grep.extendedregexp")) {
 		if (git_config_bool(var, value))
-			opt->regflags |= REG_EXTENDED;
+			opt->extended_regexp_option = 1;
 		else
-			opt->regflags &= ~REG_EXTENDED;
+			opt->extended_regexp_option = 0;
 		return 0;
 	}
 
+	if (!strcmp(var, "grep.patterntype")) {
+		opt->pattern_type_option = parse_pattern_type_arg(var, value);
+		return 0;
+  }
+
 	if (!strcmp(var, "grep.linenumber")) {
 		opt->linenum = git_config_bool(var, value);
 		return 0;
@@ -669,95 +722,88 @@
 	int i;
 	int dummy;
 	int use_index = 1;
-	enum {
-		pattern_type_unspecified = 0,
-		pattern_type_bre,
-		pattern_type_ere,
-		pattern_type_fixed,
-		pattern_type_pcre,
-	};
-	int pattern_type = pattern_type_unspecified;
+	int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED;
 
 	struct option options[] = {
 		OPT_BOOLEAN(0, "cached", &cached,
-			"search in index instead of in the work tree"),
+			N_("search in index instead of in the work tree")),
 		OPT_NEGBIT(0, "no-index", &use_index,
-			 "finds in contents not managed by git", 1),
+			 N_("find in contents not managed by git"), 1),
 		OPT_BOOLEAN(0, "untracked", &untracked,
-			"search in both tracked and untracked files"),
+			N_("search in both tracked and untracked files")),
 		OPT_SET_INT(0, "exclude-standard", &opt_exclude,
-			    "search also in ignored files", 1),
+			    N_("search also in ignored files"), 1),
 		OPT_GROUP(""),
 		OPT_BOOLEAN('v', "invert-match", &opt.invert,
-			"show non-matching lines"),
+			N_("show non-matching lines")),
 		OPT_BOOLEAN('i', "ignore-case", &opt.ignore_case,
-			"case insensitive matching"),
+			N_("case insensitive matching")),
 		OPT_BOOLEAN('w', "word-regexp", &opt.word_regexp,
-			"match patterns only at word boundaries"),
+			N_("match patterns only at word boundaries")),
 		OPT_SET_INT('a', "text", &opt.binary,
-			"process binary files as text", GREP_BINARY_TEXT),
+			N_("process binary files as text"), GREP_BINARY_TEXT),
 		OPT_SET_INT('I', NULL, &opt.binary,
-			"don't match patterns in binary files",
+			N_("don't match patterns in binary files"),
 			GREP_BINARY_NOMATCH),
-		{ OPTION_INTEGER, 0, "max-depth", &opt.max_depth, "depth",
-			"descend at most <depth> levels", PARSE_OPT_NONEG,
+		{ OPTION_INTEGER, 0, "max-depth", &opt.max_depth, N_("depth"),
+			N_("descend at most <depth> levels"), PARSE_OPT_NONEG,
 			NULL, 1 },
 		OPT_GROUP(""),
-		OPT_SET_INT('E', "extended-regexp", &pattern_type,
-			    "use extended POSIX regular expressions",
-			    pattern_type_ere),
-		OPT_SET_INT('G', "basic-regexp", &pattern_type,
-			    "use basic POSIX regular expressions (default)",
-			    pattern_type_bre),
-		OPT_SET_INT('F', "fixed-strings", &pattern_type,
-			    "interpret patterns as fixed strings",
-			    pattern_type_fixed),
-		OPT_SET_INT('P', "perl-regexp", &pattern_type,
-			    "use Perl-compatible regular expressions",
-			    pattern_type_pcre),
+		OPT_SET_INT('E', "extended-regexp", &pattern_type_arg,
+			    N_("use extended POSIX regular expressions"),
+			    GREP_PATTERN_TYPE_ERE),
+		OPT_SET_INT('G', "basic-regexp", &pattern_type_arg,
+			    N_("use basic POSIX regular expressions (default)"),
+			    GREP_PATTERN_TYPE_BRE),
+		OPT_SET_INT('F', "fixed-strings", &pattern_type_arg,
+			    N_("interpret patterns as fixed strings"),
+			    GREP_PATTERN_TYPE_FIXED),
+		OPT_SET_INT('P', "perl-regexp", &pattern_type_arg,
+			    N_("use Perl-compatible regular expressions"),
+			    GREP_PATTERN_TYPE_PCRE),
 		OPT_GROUP(""),
-		OPT_BOOLEAN('n', "line-number", &opt.linenum, "show line numbers"),
-		OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1),
-		OPT_BIT('H', NULL, &opt.pathname, "show filenames", 1),
+		OPT_BOOLEAN('n', "line-number", &opt.linenum, N_("show line numbers")),
+		OPT_NEGBIT('h', NULL, &opt.pathname, N_("don't show filenames"), 1),
+		OPT_BIT('H', NULL, &opt.pathname, N_("show filenames"), 1),
 		OPT_NEGBIT(0, "full-name", &opt.relative,
-			"show filenames relative to top directory", 1),
+			N_("show filenames relative to top directory"), 1),
 		OPT_BOOLEAN('l', "files-with-matches", &opt.name_only,
-			"show only filenames instead of matching lines"),
+			N_("show only filenames instead of matching lines")),
 		OPT_BOOLEAN(0, "name-only", &opt.name_only,
-			"synonym for --files-with-matches"),
+			N_("synonym for --files-with-matches")),
 		OPT_BOOLEAN('L', "files-without-match",
 			&opt.unmatch_name_only,
-			"show only the names of files without match"),
+			N_("show only the names of files without match")),
 		OPT_BOOLEAN('z', "null", &opt.null_following_name,
-			"print NUL after filenames"),
+			N_("print NUL after filenames")),
 		OPT_BOOLEAN('c', "count", &opt.count,
-			"show the number of matches instead of matching lines"),
-		OPT__COLOR(&opt.color, "highlight matches"),
+			N_("show the number of matches instead of matching lines")),
+		OPT__COLOR(&opt.color, N_("highlight matches")),
 		OPT_BOOLEAN(0, "break", &opt.file_break,
-			"print empty line between matches from different files"),
+			N_("print empty line between matches from different files")),
 		OPT_BOOLEAN(0, "heading", &opt.heading,
-			"show filename only once above matches from same file"),
+			N_("show filename only once above matches from same file")),
 		OPT_GROUP(""),
-		OPT_CALLBACK('C', "context", &opt, "n",
-			"show <n> context lines before and after matches",
+		OPT_CALLBACK('C', "context", &opt, N_("n"),
+			N_("show <n> context lines before and after matches"),
 			context_callback),
 		OPT_INTEGER('B', "before-context", &opt.pre_context,
-			"show <n> context lines before matches"),
+			N_("show <n> context lines before matches")),
 		OPT_INTEGER('A', "after-context", &opt.post_context,
-			"show <n> context lines after matches"),
-		OPT_NUMBER_CALLBACK(&opt, "shortcut for -C NUM",
+			N_("show <n> context lines after matches")),
+		OPT_NUMBER_CALLBACK(&opt, N_("shortcut for -C NUM"),
 			context_callback),
 		OPT_BOOLEAN('p', "show-function", &opt.funcname,
-			"show a line with the function name before matches"),
+			N_("show a line with the function name before matches")),
 		OPT_BOOLEAN('W', "function-context", &opt.funcbody,
-			"show the surrounding function"),
+			N_("show the surrounding function")),
 		OPT_GROUP(""),
-		OPT_CALLBACK('f', NULL, &opt, "file",
-			"read patterns from file", file_callback),
-		{ OPTION_CALLBACK, 'e', NULL, &opt, "pattern",
-			"match <pattern>", PARSE_OPT_NONEG, pattern_callback },
+		OPT_CALLBACK('f', NULL, &opt, N_("file"),
+			N_("read patterns from file"), file_callback),
+		{ OPTION_CALLBACK, 'e', NULL, &opt, N_("pattern"),
+			N_("match <pattern>"), PARSE_OPT_NONEG, pattern_callback },
 		{ OPTION_CALLBACK, 0, "and", &opt, NULL,
-		  "combine patterns specified with -e",
+		  N_("combine patterns specified with -e"),
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, and_callback },
 		OPT_BOOLEAN(0, "or", &dummy, ""),
 		{ OPTION_CALLBACK, 0, "not", &opt, NULL, "",
@@ -769,16 +815,19 @@
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
 		  close_callback },
 		OPT__QUIET(&opt.status_only,
-			   "indicate hit with exit status without output"),
+			   N_("indicate hit with exit status without output")),
 		OPT_BOOLEAN(0, "all-match", &opt.all_match,
-			"show only matches from files that match all patterns"),
+			N_("show only matches from files that match all patterns")),
+		{ OPTION_SET_INT, 0, "debug", &opt.debug, NULL,
+		  N_("show parse tree for grep expression"),
+		  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1 },
 		OPT_GROUP(""),
 		{ OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
-			"pager", "show matching files in the pager",
+			N_("pager"), N_("show matching files in the pager"),
 			PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
 		OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
-			    "allow calling of grep(1) (ignored by this build)"),
-		{ OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
+			    N_("allow calling of grep(1) (ignored by this build)")),
+		{ OPTION_CALLBACK, 0, "help-all", &options, NULL, N_("show usage"),
 		  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
 		OPT_END()
 	};
@@ -799,6 +848,8 @@
 	opt.header_tail = &opt.header_list;
 	opt.regflags = REG_NEWLINE;
 	opt.max_depth = -1;
+	opt.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
+	opt.extended_regexp_option = 0;
 
 	strcpy(opt.color_context, "");
 	strcpy(opt.color_filename, "");
@@ -824,28 +875,13 @@
 			     PARSE_OPT_KEEP_DASHDASH |
 			     PARSE_OPT_STOP_AT_NON_OPTION |
 			     PARSE_OPT_NO_INTERNAL_HELP);
-	switch (pattern_type) {
-	case pattern_type_fixed:
-		opt.fixed = 1;
-		opt.pcre = 0;
-		break;
-	case pattern_type_bre:
-		opt.fixed = 0;
-		opt.pcre = 0;
-		opt.regflags &= ~REG_EXTENDED;
-		break;
-	case pattern_type_ere:
-		opt.fixed = 0;
-		opt.pcre = 0;
-		opt.regflags |= REG_EXTENDED;
-		break;
-	case pattern_type_pcre:
-		opt.fixed = 0;
-		opt.pcre = 1;
-		break;
-	default:
-		break; /* nothing */
-	}
+
+	if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED)
+		grep_pattern_type_options(pattern_type_arg, &opt);
+	else if (opt.pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
+		grep_pattern_type_options(opt.pattern_type_option, &opt);
+	else if (opt.extended_regexp_option)
+		grep_pattern_type_options(GREP_PATTERN_TYPE_ERE, &opt);
 
 	if (use_index && !startup_info->have_repository)
 		/* die the same way as if we did it at the beginning */
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index 33911fd..8d184f1 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -57,8 +57,8 @@
 }
 
 static const char * const hash_object_usage[] = {
-	"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>...",
-	"git hash-object  --stdin-paths < <list-of-paths>",
+	N_("git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>..."),
+	N_("git hash-object  --stdin-paths < <list-of-paths>"),
 	NULL
 };
 
@@ -69,12 +69,12 @@
 static const char *vpath;
 
 static const struct option hash_object_options[] = {
-	OPT_STRING('t', NULL, &type, "type", "object type"),
-	OPT_BOOLEAN('w', NULL, &write_object, "write the object into the object database"),
-	OPT_BOOLEAN( 0 , "stdin", &hashstdin, "read the object from stdin"),
-	OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, "read file names from stdin"),
-	OPT_BOOLEAN( 0 , "no-filters", &no_filters, "store file as is without filters"),
-	OPT_STRING( 0 , "path", &vpath, "file", "process file as it were from this path"),
+	OPT_STRING('t', NULL, &type, N_("type"), N_("object type")),
+	OPT_BOOLEAN('w', NULL, &write_object, N_("write the object into the object database")),
+	OPT_BOOLEAN( 0 , "stdin", &hashstdin, N_("read the object from stdin")),
+	OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, N_("read file names from stdin")),
+	OPT_BOOLEAN( 0 , "no-filters", &no_filters, N_("store file as is without filters")),
+	OPT_STRING( 0 , "path", &vpath, N_("file"), N_("process file as it were from this path")),
 	OPT_END()
 };
 
diff --git a/builtin/help.c b/builtin/help.c
index efea4f5..bd86253 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -40,17 +40,17 @@
 static unsigned int colopts;
 static enum help_format help_format = HELP_FORMAT_NONE;
 static struct option builtin_help_options[] = {
-	OPT_BOOLEAN('a', "all", &show_all, "print all available commands"),
-	OPT_SET_INT('m', "man", &help_format, "show man page", HELP_FORMAT_MAN),
-	OPT_SET_INT('w', "web", &help_format, "show manual in web browser",
+	OPT_BOOLEAN('a', "all", &show_all, N_("print all available commands")),
+	OPT_SET_INT('m', "man", &help_format, N_("show man page"), HELP_FORMAT_MAN),
+	OPT_SET_INT('w', "web", &help_format, N_("show manual in web browser"),
 			HELP_FORMAT_WEB),
-	OPT_SET_INT('i', "info", &help_format, "show info page",
+	OPT_SET_INT('i', "info", &help_format, N_("show info page"),
 			HELP_FORMAT_INFO),
 	OPT_END(),
 };
 
 static const char * const builtin_help_usage[] = {
-	"git help [--all] [--man|--web|--info] [command]",
+	N_("git help [--all] [--man|--web|--info] [command]"),
 	NULL
 };
 
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 953dd30..43d364b 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -291,7 +291,7 @@
 	if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
 		die(_("pack signature mismatch"));
 	if (!pack_version_ok(hdr->hdr_version))
-		die("pack version %"PRIu32" unsupported",
+		die(_("pack version %"PRIu32" unsupported"),
 			ntohl(hdr->hdr_version));
 
 	nr_objects = ntohl(hdr->hdr_entries);
@@ -1061,7 +1061,8 @@
 			int ret = pthread_create(&thread_data[i].thread, NULL,
 						 threaded_second_pass, thread_data + i);
 			if (ret)
-				die("unable to create thread: %s", strerror(ret));
+				die(_("unable to create thread: %s"),
+				    strerror(ret));
 		}
 		for (i = 0; i < nr_threads; i++)
 			pthread_join(thread_data[i].thread, NULL);
@@ -1108,7 +1109,7 @@
 				   * sizeof(*objects));
 		f = sha1fd(output_fd, curr_pack);
 		fix_unresolved_deltas(f, nr_unresolved);
-		sprintf(msg, "completed with %d local objects",
+		sprintf(msg, _("completed with %d local objects"),
 			nr_objects - nr_objects_initial);
 		stop_progress_msg(&progress, msg);
 		sha1close(f, tail_sha1, 0);
@@ -1117,8 +1118,8 @@
 					 curr_pack, nr_objects,
 					 read_sha1, consumed_bytes-20);
 		if (hashcmp(read_sha1, tail_sha1) != 0)
-			die("Unexpected tail checksum for %s "
-			    "(disk corruption?)", curr_pack);
+			die(_("Unexpected tail checksum for %s "
+			      "(disk corruption?)"), curr_pack);
 	}
 	if (nr_deltas != nr_resolved_deltas)
 		die(Q_("pack has %d unresolved delta",
@@ -1327,17 +1328,17 @@
 	if (!strcmp(k, "pack.indexversion")) {
 		opts->version = git_config_int(k, v);
 		if (opts->version > 2)
-			die("bad pack.indexversion=%"PRIu32, opts->version);
+			die(_("bad pack.indexversion=%"PRIu32), opts->version);
 		return 0;
 	}
 	if (!strcmp(k, "pack.threads")) {
 		nr_threads = git_config_int(k, v);
 		if (nr_threads < 0)
-			die("invalid number of threads specified (%d)",
+			die(_("invalid number of threads specified (%d)"),
 			    nr_threads);
 #ifdef NO_PTHREADS
 		if (nr_threads != 1)
-			warning("no threads support, ignoring %s", k);
+			warning(_("no threads support, ignoring %s"), k);
 		nr_threads = 1;
 #endif
 		return 0;
@@ -1510,8 +1511,8 @@
 					usage(index_pack_usage);
 #ifdef NO_PTHREADS
 				if (nr_threads != 1)
-					warning("no threads support, "
-						"ignoring %s", arg);
+					warning(_("no threads support, "
+						  "ignoring %s"), arg);
 				nr_threads = 1;
 #endif
 			} else if (!prefixcmp(arg, "--pack_header=")) {
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 244fb7f..78aa387 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -464,7 +464,7 @@
 }
 
 static const char *const init_db_usage[] = {
-	"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [directory]",
+	N_("git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [directory]"),
 	NULL
 };
 
@@ -482,17 +482,17 @@
 	const char *template_dir = NULL;
 	unsigned int flags = 0;
 	const struct option init_db_options[] = {
-		OPT_STRING(0, "template", &template_dir, "template-directory",
-				"directory from which templates will be used"),
+		OPT_STRING(0, "template", &template_dir, N_("template-directory"),
+				N_("directory from which templates will be used")),
 		OPT_SET_INT(0, "bare", &is_bare_repository_cfg,
-				"create a bare repository", 1),
+				N_("create a bare repository"), 1),
 		{ OPTION_CALLBACK, 0, "shared", &init_shared_repository,
-			"permissions",
-			"specify that the git repository is to be shared amongst several users",
+			N_("permissions"),
+			N_("specify that the git repository is to be shared amongst several users"),
 			PARSE_OPT_OPTARG | PARSE_OPT_NONEG, shared_callback, 0},
-		OPT_BIT('q', "quiet", &flags, "be quiet", INIT_DB_QUIET),
-		OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir",
-			   "separate git dir from working tree"),
+		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_END()
 	};
 
diff --git a/builtin/log.c b/builtin/log.c
index dff7921..09cf43e 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -34,8 +34,8 @@
 static const char *fmt_pretty;
 
 static const char * const builtin_log_usage[] = {
-	"git log [<options>] [<since>..<until>] [[--] <path>...]\n"
-	"   or: git show [options] <object>...",
+	N_("git log [<options>] [<since>..<until>] [[--] <path>...]\n")
+	N_("   or: git show [options] <object>..."),
 	NULL
 };
 
@@ -97,9 +97,9 @@
 	int quiet = 0, source = 0;
 
 	const struct option builtin_log_options[] = {
-		OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
-		OPT_BOOLEAN(0, "source", &source, "show source"),
-		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
+		OPT_BOOLEAN(0, "quiet", &quiet, N_("suppress diff output")),
+		OPT_BOOLEAN(0, "source", &source, N_("show source")),
+		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
 		  PARSE_OPT_OPTARG, decorate_callback},
 		OPT_END()
 	};
@@ -696,7 +696,7 @@
 	return 0;
 }
 
-static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const char *prefix)
+static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
 {
 	struct rev_info check_rev;
 	struct commit *commit;
@@ -717,7 +717,8 @@
 	init_patch_ids(ids);
 
 	/* given a range a..b get all patch ids for b..a */
-	init_revisions(&check_rev, prefix);
+	init_revisions(&check_rev, rev->prefix);
+	check_rev.max_parents = 1;
 	o1->flags ^= UNINTERESTING;
 	o2->flags ^= UNINTERESTING;
 	add_pending_object(&check_rev, o1, "o1");
@@ -726,10 +727,6 @@
 		die(_("revision walk setup failed"));
 
 	while ((commit = get_revision(&check_rev)) != NULL) {
-		/* ignore merges */
-		if (commit->parents && commit->parents->next)
-			continue;
-
 		add_commit_patch_id(commit, ids);
 	}
 
@@ -890,7 +887,7 @@
 }
 
 static const char * const builtin_format_patch_usage[] = {
-	"git format-patch [options] [<since> | <revision range>]",
+	N_("git format-patch [options] [<since> | <revision range>]"),
 	NULL
 };
 
@@ -1063,61 +1060,61 @@
 	char *branch_name = NULL;
 	const struct option builtin_format_patch_options[] = {
 		{ OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
-			    "use [PATCH n/m] even with a single patch",
+			    N_("use [PATCH n/m] even with a single patch"),
 			    PARSE_OPT_NOARG, numbered_callback },
 		{ OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
-			    "use [PATCH] even with multiple patches",
+			    N_("use [PATCH] even with multiple patches"),
 			    PARSE_OPT_NOARG, no_numbered_callback },
-		OPT_BOOLEAN('s', "signoff", &do_signoff, "add Signed-off-by:"),
+		OPT_BOOLEAN('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
 		OPT_BOOLEAN(0, "stdout", &use_stdout,
-			    "print patches to standard out"),
+			    N_("print patches to standard out")),
 		OPT_BOOLEAN(0, "cover-letter", &cover_letter,
-			    "generate a cover letter"),
+			    N_("generate a cover letter")),
 		OPT_BOOLEAN(0, "numbered-files", &numbered_files,
-			    "use simple number sequence for output file names"),
-		OPT_STRING(0, "suffix", &fmt_patch_suffix, "sfx",
-			    "use <sfx> instead of '.patch'"),
+			    N_("use simple number sequence for output file names")),
+		OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
+			    N_("use <sfx> instead of '.patch'")),
 		OPT_INTEGER(0, "start-number", &start_number,
-			    "start numbering patches at <n> instead of 1"),
-		{ OPTION_CALLBACK, 0, "subject-prefix", &rev, "prefix",
-			    "Use [<prefix>] instead of [PATCH]",
+			    N_("start numbering patches at <n> instead of 1")),
+		{ OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
+			    N_("Use [<prefix>] instead of [PATCH]"),
 			    PARSE_OPT_NONEG, subject_prefix_callback },
 		{ OPTION_CALLBACK, 'o', "output-directory", &output_directory,
-			    "dir", "store resulting files in <dir>",
+			    N_("dir"), N_("store resulting files in <dir>"),
 			    PARSE_OPT_NONEG, output_directory_callback },
 		{ OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
-			    "don't strip/add [PATCH]",
+			    N_("don't strip/add [PATCH]"),
 			    PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
 		OPT_BOOLEAN(0, "no-binary", &no_binary_diff,
-			    "don't output binary diffs"),
+			    N_("don't output binary diffs")),
 		OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
-			    "don't include a patch matching a commit upstream"),
+			    N_("don't include a patch matching a commit upstream")),
 		{ OPTION_BOOLEAN, 'p', "no-stat", &use_patch_format, NULL,
-		  "show patch format instead of default (patch + stat)",
+		  N_("show patch format instead of default (patch + stat)"),
 		  PARSE_OPT_NONEG | PARSE_OPT_NOARG },
-		OPT_GROUP("Messaging"),
-		{ OPTION_CALLBACK, 0, "add-header", NULL, "header",
-			    "add email header", 0, header_callback },
-		{ OPTION_CALLBACK, 0, "to", NULL, "email", "add To: header",
+		OPT_GROUP(N_("Messaging")),
+		{ OPTION_CALLBACK, 0, "add-header", NULL, N_("header"),
+			    N_("add email header"), 0, header_callback },
+		{ OPTION_CALLBACK, 0, "to", NULL, N_("email"), N_("add To: header"),
 			    0, to_callback },
-		{ OPTION_CALLBACK, 0, "cc", NULL, "email", "add Cc: header",
+		{ OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"),
 			    0, cc_callback },
-		OPT_STRING(0, "in-reply-to", &in_reply_to, "message-id",
-			    "make first mail a reply to <message-id>"),
-		{ OPTION_CALLBACK, 0, "attach", &rev, "boundary",
-			    "attach the patch", PARSE_OPT_OPTARG,
+		OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"),
+			    N_("make first mail a reply to <message-id>")),
+		{ OPTION_CALLBACK, 0, "attach", &rev, N_("boundary"),
+			    N_("attach the patch"), PARSE_OPT_OPTARG,
 			    attach_callback },
-		{ OPTION_CALLBACK, 0, "inline", &rev, "boundary",
-			    "inline the patch",
+		{ OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"),
+			    N_("inline the patch"),
 			    PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
 			    inline_callback },
-		{ OPTION_CALLBACK, 0, "thread", &thread, "style",
-			    "enable message threading, styles: shallow, deep",
+		{ OPTION_CALLBACK, 0, "thread", &thread, N_("style"),
+			    N_("enable message threading, styles: shallow, deep"),
 			    PARSE_OPT_OPTARG, thread_callback },
-		OPT_STRING(0, "signature", &signature, "signature",
-			    "add a signature"),
+		OPT_STRING(0, "signature", &signature, N_("signature"),
+			    N_("add a signature")),
 		OPT_BOOLEAN(0, "quiet", &quiet,
-			    "don't print the patch filenames"),
+			    N_("don't print the patch filenames")),
 		OPT_END()
 	};
 
@@ -1306,7 +1303,7 @@
 			if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
 				return 0;
 		}
-		get_patch_ids(&rev, &ids, prefix);
+		get_patch_ids(&rev, &ids);
 	}
 
 	if (!use_stdout)
@@ -1443,7 +1440,7 @@
 }
 
 static const char * const cherry_usage[] = {
-	"git cherry [-v] [<upstream> [<head> [<limit>]]]",
+	N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
 	NULL
 };
 
@@ -1477,7 +1474,7 @@
 
 	struct option options[] = {
 		OPT__ABBREV(&abbrev),
-		OPT__VERBOSE(&verbose, "be verbose"),
+		OPT__VERBOSE(&verbose, N_("be verbose")),
 		OPT_END()
 	};
 
@@ -1508,10 +1505,7 @@
 	}
 
 	init_revisions(&revs, prefix);
-	revs.diff = 1;
-	revs.combine_merges = 0;
-	revs.ignore_merges = 1;
-	DIFF_OPT_SET(&revs.diffopt, RECURSIVE);
+	revs.max_parents = 1;
 
 	if (add_pending_commit(head, &revs, 0))
 		die(_("Unknown commit %s"), head);
@@ -1525,7 +1519,7 @@
 			return 0;
 	}
 
-	get_patch_ids(&revs, &ids, prefix);
+	get_patch_ids(&revs, &ids);
 
 	if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
 		die(_("Unknown commit %s"), limit);
@@ -1534,10 +1528,6 @@
 	if (prepare_revision_walk(&revs))
 		die(_("revision walk setup failed"));
 	while ((commit = get_revision(&revs)) != NULL) {
-		/* ignore merges */
-		if (commit->parents && commit->parents->next)
-			continue;
-
 		commit_list_insert(commit, &list);
 	}
 
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 31b3f2d..b5434af 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -405,7 +405,7 @@
 }
 
 static const char * const ls_files_usage[] = {
-	"git ls-files [options] [<file>...]",
+	N_("git ls-files [options] [<file>...]"),
 	NULL
 };
 
@@ -457,57 +457,57 @@
 	struct dir_struct dir;
 	struct option builtin_ls_files_options[] = {
 		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL,
-			"paths are separated with NUL character",
+			N_("paths are separated with NUL character"),
 			PARSE_OPT_NOARG, option_parse_z },
 		OPT_BOOLEAN('t', NULL, &show_tag,
-			"identify the file status with tags"),
+			N_("identify the file status with tags")),
 		OPT_BOOLEAN('v', NULL, &show_valid_bit,
-			"use lowercase letters for 'assume unchanged' files"),
+			N_("use lowercase letters for 'assume unchanged' files")),
 		OPT_BOOLEAN('c', "cached", &show_cached,
-			"show cached files in the output (default)"),
+			N_("show cached files in the output (default)")),
 		OPT_BOOLEAN('d', "deleted", &show_deleted,
-			"show deleted files in the output"),
+			N_("show deleted files in the output")),
 		OPT_BOOLEAN('m', "modified", &show_modified,
-			"show modified files in the output"),
+			N_("show modified files in the output")),
 		OPT_BOOLEAN('o', "others", &show_others,
-			"show other files in the output"),
+			N_("show other files in the output")),
 		OPT_BIT('i', "ignored", &dir.flags,
-			"show ignored files in the output",
+			N_("show ignored files in the output"),
 			DIR_SHOW_IGNORED),
 		OPT_BOOLEAN('s', "stage", &show_stage,
-			"show staged contents' object name in the output"),
+			N_("show staged contents' object name in the output")),
 		OPT_BOOLEAN('k', "killed", &show_killed,
-			"show files on the filesystem that need to be removed"),
+			N_("show files on the filesystem that need to be removed")),
 		OPT_BIT(0, "directory", &dir.flags,
-			"show 'other' directories' name only",
+			N_("show 'other' directories' name only"),
 			DIR_SHOW_OTHER_DIRECTORIES),
 		OPT_NEGBIT(0, "empty-directory", &dir.flags,
-			"don't show empty directories",
+			N_("don't show empty directories"),
 			DIR_HIDE_EMPTY_DIRECTORIES),
 		OPT_BOOLEAN('u', "unmerged", &show_unmerged,
-			"show unmerged files in the output"),
+			N_("show unmerged files in the output")),
 		OPT_BOOLEAN(0, "resolve-undo", &show_resolve_undo,
-			    "show resolve-undo information"),
-		{ OPTION_CALLBACK, 'x', "exclude", &dir.exclude_list[EXC_CMDL], "pattern",
-			"skip files matching pattern",
+			    N_("show resolve-undo information")),
+		{ OPTION_CALLBACK, 'x', "exclude", &dir.exclude_list[EXC_CMDL], N_("pattern"),
+			N_("skip files matching pattern"),
 			0, option_parse_exclude },
-		{ OPTION_CALLBACK, 'X', "exclude-from", &dir, "file",
-			"exclude patterns are read from <file>",
+		{ OPTION_CALLBACK, 'X', "exclude-from", &dir, N_("file"),
+			N_("exclude patterns are read from <file>"),
 			0, option_parse_exclude_from },
-		OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, "file",
-			"read additional per-directory exclude patterns in <file>"),
+		OPT_STRING(0, "exclude-per-directory", &dir.exclude_per_dir, N_("file"),
+			N_("read additional per-directory exclude patterns in <file>")),
 		{ OPTION_CALLBACK, 0, "exclude-standard", &dir, NULL,
-			"add the standard git exclusions",
+			N_("add the standard git exclusions"),
 			PARSE_OPT_NOARG, option_parse_exclude_standard },
 		{ OPTION_SET_INT, 0, "full-name", &prefix_len, NULL,
-			"make the output relative to the project top directory",
+			N_("make the output relative to the project top directory"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL },
 		OPT_BOOLEAN(0, "error-unmatch", &error_unmatch,
-			"if any <file> is not in the index, treat this as an error"),
-		OPT_STRING(0, "with-tree", &with_tree, "tree-ish",
-			"pretend that paths removed since <tree-ish> are still present"),
+			N_("if any <file> is not in the index, treat this as an error")),
+		OPT_STRING(0, "with-tree", &with_tree, N_("tree-ish"),
+			N_("pretend that paths removed since <tree-ish> are still present")),
 		OPT__ABBREV(&abbrev),
-		OPT_BOOLEAN(0, "debug", &debug_mode, "show debugging data"),
+		OPT_BOOLEAN(0, "debug", &debug_mode, N_("show debugging data")),
 		OPT_END()
 	};
 
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index 6b666e1..235c17c 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -24,7 +24,7 @@
 static const char *ls_tree_prefix;
 
 static const  char * const ls_tree_usage[] = {
-	"git ls-tree [<options>] <tree-ish> [<path>...]",
+	N_("git ls-tree [<options>] <tree-ish> [<path>...]"),
 	NULL
 };
 
@@ -122,25 +122,25 @@
 	struct tree *tree;
 	int i, full_tree = 0;
 	const struct option ls_tree_options[] = {
-		OPT_BIT('d', NULL, &ls_options, "only show trees",
+		OPT_BIT('d', NULL, &ls_options, N_("only show trees"),
 			LS_TREE_ONLY),
-		OPT_BIT('r', NULL, &ls_options, "recurse into subtrees",
+		OPT_BIT('r', NULL, &ls_options, N_("recurse into subtrees"),
 			LS_RECURSIVE),
-		OPT_BIT('t', NULL, &ls_options, "show trees when recursing",
+		OPT_BIT('t', NULL, &ls_options, N_("show trees when recursing"),
 			LS_SHOW_TREES),
 		OPT_SET_INT('z', NULL, &line_termination,
-			    "terminate entries with NUL byte", 0),
-		OPT_BIT('l', "long", &ls_options, "include object size",
+			    N_("terminate entries with NUL byte"), 0),
+		OPT_BIT('l', "long", &ls_options, N_("include object size"),
 			LS_SHOW_SIZE),
-		OPT_BIT(0, "name-only", &ls_options, "list only filenames",
+		OPT_BIT(0, "name-only", &ls_options, N_("list only filenames"),
 			LS_NAME_ONLY),
-		OPT_BIT(0, "name-status", &ls_options, "list only filenames",
+		OPT_BIT(0, "name-status", &ls_options, N_("list only filenames"),
 			LS_NAME_ONLY),
 		OPT_SET_INT(0, "full-name", &chomp_prefix,
-			    "use full path names", 0),
+			    N_("use full path names"), 0),
 		OPT_BOOLEAN(0, "full-tree", &full_tree,
-			    "list entire tree; not just current directory "
-			    "(implies --full-name)"),
+			    N_("list entire tree; not just current directory "
+			       "(implies --full-name)")),
 		OPT__ABBREV(&abbrev),
 		OPT_END()
 	};
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index 18895ee..2b3f4d9 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -160,10 +160,9 @@
 	const char *ends, *ap = strcasestr(line, name);
 	size_t sz;
 
-	if (!ap) {
-		strbuf_setlen(attr, 0);
+	strbuf_setlen(attr, 0);
+	if (!ap)
 		return 0;
-	}
 	ap += strlen(name);
 	if (*ap == '"') {
 		ap++;
@@ -483,36 +482,12 @@
 	return out;
 }
 
-/*
- * When there is no known charset, guess.
- *
- * Right now we assume that if the target is UTF-8 (the default),
- * and it already looks like UTF-8 (which includes US-ASCII as its
- * subset, of course) then that is what it is and there is nothing
- * to do.
- *
- * Otherwise, we default to assuming it is Latin1 for historical
- * reasons.
- */
-static const char *guess_charset(const struct strbuf *line, const char *target_charset)
-{
-	if (is_encoding_utf8(target_charset)) {
-		if (is_utf8(line->buf))
-			return NULL;
-	}
-	return "ISO8859-1";
-}
-
 static void convert_to_utf8(struct strbuf *line, const char *charset)
 {
 	char *out;
 
-	if (!charset || !*charset) {
-		charset = guess_charset(line, metainfo_charset);
-		if (!charset)
-			return;
-	}
-
+	if (!charset || !*charset)
+		return;
 	if (!strcasecmp(metainfo_charset, charset))
 		return;
 	out = reencode_string(line->buf, metainfo_charset, charset);
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 4f30f1b..1bc7991 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -23,9 +23,10 @@
 }
 
 static const char * const merge_base_usage[] = {
-	"git merge-base [-a|--all] <commit> <commit>...",
-	"git merge-base [-a|--all] --octopus <commit>...",
-	"git merge-base --independent <commit>...",
+	N_("git merge-base [-a|--all] <commit> <commit>..."),
+	N_("git merge-base [-a|--all] --octopus <commit>..."),
+	N_("git merge-base --independent <commit>..."),
+	N_("git merge-base --is-ancestor <commit> <commit>"),
 	NULL
 };
 
@@ -70,6 +71,20 @@
 	return 0;
 }
 
+static int handle_is_ancestor(int argc, const char **argv)
+{
+	struct commit *one, *two;
+
+	if (argc != 2)
+		die("--is-ancestor takes exactly two commits");
+	one = get_commit_reference(argv[0]);
+	two = get_commit_reference(argv[1]);
+	if (in_merge_bases(one, two))
+		return 0;
+	else
+		return 1;
+}
+
 int cmd_merge_base(int argc, const char **argv, const char *prefix)
 {
 	struct commit **rev;
@@ -77,11 +92,14 @@
 	int show_all = 0;
 	int octopus = 0;
 	int reduce = 0;
+	int is_ancestor = 0;
 
 	struct option options[] = {
-		OPT_BOOLEAN('a', "all", &show_all, "output all common ancestors"),
-		OPT_BOOLEAN(0, "octopus", &octopus, "find ancestors for a single n-way merge"),
-		OPT_BOOLEAN(0, "independent", &reduce, "list revs not reachable from others"),
+		OPT_BOOLEAN('a', "all", &show_all, N_("output all common ancestors")),
+		OPT_BOOLEAN(0, "octopus", &octopus, N_("find ancestors for a single n-way merge")),
+		OPT_BOOLEAN(0, "independent", &reduce, N_("list revs not reachable from others")),
+		OPT_BOOLEAN(0, "is-ancestor", &is_ancestor,
+			    N_("is the first one ancestor of the other?")),
 		OPT_END()
 	};
 
@@ -89,6 +107,10 @@
 	argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0);
 	if (!octopus && !reduce && argc < 2)
 		usage_with_options(merge_base_usage, options);
+	if (is_ancestor && (show_all | octopus | reduce))
+		die("--is-ancestor cannot be used with other options");
+	if (is_ancestor)
+		return handle_is_ancestor(argc, argv);
 	if (reduce && (show_all || octopus))
 		die("--independent cannot be used with other options");
 
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index 6f0efef..c0570f2 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -5,7 +5,7 @@
 #include "parse-options.h"
 
 static const char *const merge_file_usage[] = {
-	"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file file2",
+	N_("git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file file2"),
 	NULL
 };
 
@@ -30,19 +30,19 @@
 	int quiet = 0;
 	int prefixlen = 0;
 	struct option options[] = {
-		OPT_BOOLEAN('p', "stdout", &to_stdout, "send results to standard output"),
-		OPT_SET_INT(0, "diff3", &xmp.style, "use a diff3 based merge", XDL_MERGE_DIFF3),
-		OPT_SET_INT(0, "ours", &xmp.favor, "for conflicts, use our version",
+		OPT_BOOLEAN('p', "stdout", &to_stdout, N_("send results to standard output")),
+		OPT_SET_INT(0, "diff3", &xmp.style, N_("use a diff3 based merge"), XDL_MERGE_DIFF3),
+		OPT_SET_INT(0, "ours", &xmp.favor, N_("for conflicts, use our version"),
 			    XDL_MERGE_FAVOR_OURS),
-		OPT_SET_INT(0, "theirs", &xmp.favor, "for conflicts, use their version",
+		OPT_SET_INT(0, "theirs", &xmp.favor, N_("for conflicts, use their version"),
 			    XDL_MERGE_FAVOR_THEIRS),
-		OPT_SET_INT(0, "union", &xmp.favor, "for conflicts, use a union version",
+		OPT_SET_INT(0, "union", &xmp.favor, N_("for conflicts, use a union version"),
 			    XDL_MERGE_FAVOR_UNION),
 		OPT_INTEGER(0, "marker-size", &xmp.marker_size,
-			    "for conflicts, use this marker size"),
-		OPT__QUIET(&quiet, "do not warn about conflicts"),
-		OPT_CALLBACK('L', NULL, names, "name",
-			     "set labels for file1/orig_file/file2", &label_cb),
+			    N_("for conflicts, use this marker size")),
+		OPT__QUIET(&quiet, N_("do not warn about conflicts")),
+		OPT_CALLBACK('L', NULL, names, N_("name"),
+			     N_("set labels for file1/orig_file/file2"), &label_cb),
 		OPT_END(),
 	};
 
diff --git a/builtin/merge.c b/builtin/merge.c
index e81fde6..0ec8f0d 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -40,9 +40,9 @@
 };
 
 static const char * const builtin_merge_usage[] = {
-	"git merge [options] [<commit>...]",
-	"git merge [options] <msg> HEAD <commit>",
-	"git merge --abort",
+	N_("git merge [options] [<commit>...]"),
+	N_("git merge [options] <msg> HEAD <commit>"),
+	N_("git merge --abort"),
 	NULL
 };
 
@@ -180,39 +180,39 @@
 
 static struct option builtin_merge_options[] = {
 	{ OPTION_CALLBACK, 'n', NULL, NULL, NULL,
-		"do not show a diffstat at the end of the merge",
+		N_("do not show a diffstat at the end of the merge"),
 		PARSE_OPT_NOARG, option_parse_n },
 	OPT_BOOLEAN(0, "stat", &show_diffstat,
-		"show a diffstat at the end of the merge"),
-	OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"),
-	{ OPTION_INTEGER, 0, "log", &shortlog_len, "n",
-	  "add (at most <n>) entries from shortlog to merge commit message",
+		N_("show a diffstat at the end of the merge")),
+	OPT_BOOLEAN(0, "summary", &show_diffstat, N_("(synonym to --stat)")),
+	{ OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
+	  N_("add (at most <n>) entries from shortlog to merge commit message"),
 	  PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
 	OPT_BOOLEAN(0, "squash", &squash,
-		"create a single commit instead of doing a merge"),
+		N_("create a single commit instead of doing a merge")),
 	OPT_BOOLEAN(0, "commit", &option_commit,
-		"perform a commit if the merge succeeds (default)"),
+		N_("perform a commit if the merge succeeds (default)")),
 	OPT_BOOL('e', "edit", &option_edit,
-		"edit message before committing"),
+		N_("edit message before committing")),
 	OPT_BOOLEAN(0, "ff", &allow_fast_forward,
-		"allow fast-forward (default)"),
+		N_("allow fast-forward (default)")),
 	OPT_BOOLEAN(0, "ff-only", &fast_forward_only,
-		"abort if fast-forward is not possible"),
+		N_("abort if fast-forward is not possible")),
 	OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
-	OPT_CALLBACK('s', "strategy", &use_strategies, "strategy",
-		"merge strategy to use", option_parse_strategy),
-	OPT_CALLBACK('X', "strategy-option", &xopts, "option=value",
-		"option for selected merge strategy", option_parse_x),
-	OPT_CALLBACK('m', "message", &merge_msg, "message",
-		"merge commit message (for a non-fast-forward merge)",
+	OPT_CALLBACK('s', "strategy", &use_strategies, N_("strategy"),
+		N_("merge strategy to use"), option_parse_strategy),
+	OPT_CALLBACK('X', "strategy-option", &xopts, N_("option=value"),
+		N_("option for selected merge strategy"), option_parse_x),
+	OPT_CALLBACK('m', "message", &merge_msg, N_("message"),
+		N_("merge commit message (for a non-fast-forward merge)"),
 		option_parse_message),
 	OPT__VERBOSITY(&verbosity),
 	OPT_BOOLEAN(0, "abort", &abort_current_merge,
-		"abort the current in-progress merge"),
-	OPT_SET_INT(0, "progress", &show_progress, "force progress reporting", 1),
-	{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
-	  "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
-	OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, "update ignored files (default)"),
+		N_("abort the current in-progress merge")),
+	OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
+	{ OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
+	  N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+	OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
 	OPT_END()
 };
 
diff --git a/builtin/mktree.c b/builtin/mktree.c
index 4ae1c41..f92ba40 100644
--- a/builtin/mktree.c
+++ b/builtin/mktree.c
@@ -64,7 +64,7 @@
 }
 
 static const char *mktree_usage[] = {
-	"git mktree [-z] [--missing] [--batch]",
+	N_("git mktree [-z] [--missing] [--batch]"),
 	NULL
 };
 
@@ -150,9 +150,9 @@
 	int got_eof = 0;
 
 	const struct option option[] = {
-		OPT_SET_INT('z', NULL, &line_termination, "input is NUL terminated", '\0'),
-		OPT_SET_INT( 0 , "missing", &allow_missing, "allow missing objects", 1),
-		OPT_SET_INT( 0 , "batch", &is_batch_mode, "allow creation of more than one tree", 1),
+		OPT_SET_INT('z', NULL, &line_termination, N_("input is NUL terminated"), '\0'),
+		OPT_SET_INT( 0 , "missing", &allow_missing, N_("allow missing objects"), 1),
+		OPT_SET_INT( 0 , "batch", &is_batch_mode, N_("allow creation of more than one tree"), 1),
 		OPT_END()
 	};
 
diff --git a/builtin/mv.c b/builtin/mv.c
index 2a144b0..034fec9 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -11,7 +11,7 @@
 #include "parse-options.h"
 
 static const char * const builtin_mv_usage[] = {
-	"git mv [options] <source>... <destination>",
+	N_("git mv [options] <source>... <destination>"),
 	NULL
 };
 
@@ -59,10 +59,10 @@
 	int i, newfd;
 	int verbose = 0, show_only = 0, force = 0, ignore_errors = 0;
 	struct option builtin_mv_options[] = {
-		OPT__VERBOSE(&verbose, "be verbose"),
-		OPT__DRY_RUN(&show_only, "dry run"),
-		OPT__FORCE(&force, "force move/rename even if target exists"),
-		OPT_BOOLEAN('k', NULL, &ignore_errors, "skip move/rename errors"),
+		OPT__VERBOSE(&verbose, N_("be verbose")),
+		OPT__DRY_RUN(&show_only, N_("dry run")),
+		OPT__FORCE(&force, N_("force move/rename even if target exists")),
+		OPT_BOOLEAN('k', NULL, &ignore_errors, N_("skip move/rename errors")),
 		OPT_END(),
 	};
 	const char **source, **destination, **dest_path;
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 1b37458..6238247 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -172,9 +172,9 @@
 }
 
 static char const * const name_rev_usage[] = {
-	"git name-rev [options] <commit>...",
-	"git name-rev [options] --all",
-	"git name-rev [options] --stdin",
+	N_("git name-rev [options] <commit>..."),
+	N_("git name-rev [options] --all"),
+	N_("git name-rev [options] --stdin"),
 	NULL
 };
 
@@ -226,16 +226,16 @@
 	int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0;
 	struct name_ref_data data = { 0, 0, NULL };
 	struct option opts[] = {
-		OPT_BOOLEAN(0, "name-only", &data.name_only, "print only names (no SHA-1)"),
-		OPT_BOOLEAN(0, "tags", &data.tags_only, "only use tags to name the commits"),
-		OPT_STRING(0, "refs", &data.ref_filter, "pattern",
-				   "only use refs matching <pattern>"),
+		OPT_BOOLEAN(0, "name-only", &data.name_only, N_("print only names (no SHA-1)")),
+		OPT_BOOLEAN(0, "tags", &data.tags_only, N_("only use tags to name the commits")),
+		OPT_STRING(0, "refs", &data.ref_filter, N_("pattern"),
+				   N_("only use refs matching <pattern>")),
 		OPT_GROUP(""),
-		OPT_BOOLEAN(0, "all", &all, "list all commits reachable from all refs"),
-		OPT_BOOLEAN(0, "stdin", &transform_stdin, "read from stdin"),
-		OPT_BOOLEAN(0, "undefined", &allow_undefined, "allow to print `undefined` names"),
+		OPT_BOOLEAN(0, "all", &all, N_("list all commits reachable from all refs")),
+		OPT_BOOLEAN(0, "stdin", &transform_stdin, N_("read from stdin")),
+		OPT_BOOLEAN(0, "undefined", &allow_undefined, N_("allow to print `undefined` names")),
 		OPT_BOOLEAN(0, "always",     &always,
-			   "show abbreviated commit object as fallback"),
+			   N_("show abbreviated commit object as fallback")),
 		OPT_END(),
 	};
 
diff --git a/builtin/notes.c b/builtin/notes.c
index 3644d14..453457a 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -19,72 +19,75 @@
 #include "string-list.h"
 #include "notes-merge.h"
 
+static void commit_notes(struct notes_tree *t, const char *msg);
+static combine_notes_fn parse_combine_notes_fn(const char *v);
+
 static const char * const git_notes_usage[] = {
-	"git notes [--ref <notes_ref>] [list [<object>]]",
-	"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]",
-	"git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>",
-	"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]",
-	"git notes [--ref <notes_ref>] edit [<object>]",
-	"git notes [--ref <notes_ref>] show [<object>]",
-	"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>",
-	"git notes merge --commit [-v | -q]",
-	"git notes merge --abort [-v | -q]",
-	"git notes [--ref <notes_ref>] remove [<object>...]",
-	"git notes [--ref <notes_ref>] prune [-n | -v]",
-	"git notes [--ref <notes_ref>] get-ref",
+	N_("git notes [--ref <notes_ref>] [list [<object>]]"),
+	N_("git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"),
+	N_("git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"),
+	N_("git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"),
+	N_("git notes [--ref <notes_ref>] edit [<object>]"),
+	N_("git notes [--ref <notes_ref>] show [<object>]"),
+	N_("git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"),
+	N_("git notes merge --commit [-v | -q]"),
+	N_("git notes merge --abort [-v | -q]"),
+	N_("git notes [--ref <notes_ref>] remove [<object>...]"),
+	N_("git notes [--ref <notes_ref>] prune [-n | -v]"),
+	N_("git notes [--ref <notes_ref>] get-ref"),
 	NULL
 };
 
 static const char * const git_notes_list_usage[] = {
-	"git notes [list [<object>]]",
+	N_("git notes [list [<object>]]"),
 	NULL
 };
 
 static const char * const git_notes_add_usage[] = {
-	"git notes add [<options>] [<object>]",
+	N_("git notes add [<options>] [<object>]"),
 	NULL
 };
 
 static const char * const git_notes_copy_usage[] = {
-	"git notes copy [<options>] <from-object> <to-object>",
-	"git notes copy --stdin [<from-object> <to-object>]...",
+	N_("git notes copy [<options>] <from-object> <to-object>"),
+	N_("git notes copy --stdin [<from-object> <to-object>]..."),
 	NULL
 };
 
 static const char * const git_notes_append_usage[] = {
-	"git notes append [<options>] [<object>]",
+	N_("git notes append [<options>] [<object>]"),
 	NULL
 };
 
 static const char * const git_notes_edit_usage[] = {
-	"git notes edit [<object>]",
+	N_("git notes edit [<object>]"),
 	NULL
 };
 
 static const char * const git_notes_show_usage[] = {
-	"git notes show [<object>]",
+	N_("git notes show [<object>]"),
 	NULL
 };
 
 static const char * const git_notes_merge_usage[] = {
-	"git notes merge [<options>] <notes_ref>",
-	"git notes merge --commit [<options>]",
-	"git notes merge --abort [<options>]",
+	N_("git notes merge [<options>] <notes_ref>"),
+	N_("git notes merge --commit [<options>]"),
+	N_("git notes merge --abort [<options>]"),
 	NULL
 };
 
 static const char * const git_notes_remove_usage[] = {
-	"git notes remove [<object>]",
+	N_("git notes remove [<object>]"),
 	NULL
 };
 
 static const char * const git_notes_prune_usage[] = {
-	"git notes prune [<options>]",
+	N_("git notes prune [<options>]"),
 	NULL
 };
 
 static const char * const git_notes_get_ref_usage[] = {
-	"git notes get-ref",
+	N_("git notes get-ref"),
 	NULL
 };
 
@@ -288,7 +291,7 @@
 	return parse_reuse_arg(opt, arg, unset);
 }
 
-void commit_notes(struct notes_tree *t, const char *msg)
+static void commit_notes(struct notes_tree *t, const char *msg)
 {
 	struct strbuf buf = STRBUF_INIT;
 	unsigned char commit_sha1[20];
@@ -312,7 +315,7 @@
 	strbuf_release(&buf);
 }
 
-combine_notes_fn parse_combine_notes_fn(const char *v)
+static combine_notes_fn parse_combine_notes_fn(const char *v)
 {
 	if (!strcasecmp(v, "overwrite"))
 		return combine_notes_overwrite;
@@ -531,19 +534,19 @@
 	const unsigned char *note;
 	struct msg_arg msg = { 0, 0, STRBUF_INIT };
 	struct option options[] = {
-		{ OPTION_CALLBACK, 'm', "message", &msg, "msg",
-			"note contents as a string", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'm', "message", &msg, N_("message"),
+			N_("note contents as a string"), PARSE_OPT_NONEG,
 			parse_msg_arg},
-		{ OPTION_CALLBACK, 'F', "file", &msg, "file",
-			"note contents in a file", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'F', "file", &msg, N_("file"),
+			N_("note contents in a file"), PARSE_OPT_NONEG,
 			parse_file_arg},
-		{ OPTION_CALLBACK, 'c', "reedit-message", &msg, "object",
-			"reuse and edit specified note object", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'c', "reedit-message", &msg, N_("object"),
+			N_("reuse and edit specified note object"), PARSE_OPT_NONEG,
 			parse_reedit_arg},
-		{ OPTION_CALLBACK, 'C', "reuse-message", &msg, "object",
-			"reuse specified note object", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'C', "reuse-message", &msg, N_("object"),
+			N_("reuse specified note object"), PARSE_OPT_NONEG,
 			parse_reuse_arg},
-		OPT__FORCE(&force, "replace existing notes"),
+		OPT__FORCE(&force, N_("replace existing notes")),
 		OPT_END()
 	};
 
@@ -611,11 +614,11 @@
 	struct notes_tree *t;
 	const char *rewrite_cmd = NULL;
 	struct option options[] = {
-		OPT__FORCE(&force, "replace existing notes"),
-		OPT_BOOLEAN(0, "stdin", &from_stdin, "read objects from stdin"),
-		OPT_STRING(0, "for-rewrite", &rewrite_cmd, "command",
-			   "load rewriting config for <command> (implies "
-			   "--stdin)"),
+		OPT__FORCE(&force, N_("replace existing notes")),
+		OPT_BOOLEAN(0, "stdin", &from_stdin, N_("read objects from stdin")),
+		OPT_STRING(0, "for-rewrite", &rewrite_cmd, N_("command"),
+			   N_("load rewriting config for <command> (implies "
+			      "--stdin)")),
 		OPT_END()
 	};
 
@@ -688,17 +691,17 @@
 	const char * const *usage;
 	struct msg_arg msg = { 0, 0, STRBUF_INIT };
 	struct option options[] = {
-		{ OPTION_CALLBACK, 'm', "message", &msg, "msg",
-			"note contents as a string", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'm', "message", &msg, N_("message"),
+			N_("note contents as a string"), PARSE_OPT_NONEG,
 			parse_msg_arg},
-		{ OPTION_CALLBACK, 'F', "file", &msg, "file",
-			"note contents in a file", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'F', "file", &msg, N_("file"),
+			N_("note contents in a file"), PARSE_OPT_NONEG,
 			parse_file_arg},
-		{ OPTION_CALLBACK, 'c', "reedit-message", &msg, "object",
-			"reuse and edit specified note object", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'c', "reedit-message", &msg, N_("object"),
+			N_("reuse and edit specified note object"), PARSE_OPT_NONEG,
 			parse_reedit_arg},
-		{ OPTION_CALLBACK, 'C', "reuse-message", &msg, "object",
-			"reuse specified note object", PARSE_OPT_NONEG,
+		{ OPTION_CALLBACK, 'C', "reuse-message", &msg, N_("object"),
+			N_("reuse specified note object"), PARSE_OPT_NONEG,
 			parse_reuse_arg},
 		OPT_END()
 	};
@@ -861,19 +864,19 @@
 	int verbosity = 0, result;
 	const char *strategy = NULL;
 	struct option options[] = {
-		OPT_GROUP("General options"),
+		OPT_GROUP(N_("General options")),
 		OPT__VERBOSITY(&verbosity),
-		OPT_GROUP("Merge options"),
-		OPT_STRING('s', "strategy", &strategy, "strategy",
-			   "resolve notes conflicts using the given strategy "
-			   "(manual/ours/theirs/union/cat_sort_uniq)"),
-		OPT_GROUP("Committing unmerged notes"),
+		OPT_GROUP(N_("Merge options")),
+		OPT_STRING('s', "strategy", &strategy, N_("strategy"),
+			   N_("resolve notes conflicts using the given strategy "
+			      "(manual/ours/theirs/union/cat_sort_uniq)")),
+		OPT_GROUP(N_("Committing unmerged notes")),
 		{ OPTION_BOOLEAN, 0, "commit", &do_commit, NULL,
-			"finalize notes merge by committing unmerged notes",
+			N_("finalize notes merge by committing unmerged notes"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG },
-		OPT_GROUP("Aborting notes merge resolution"),
+		OPT_GROUP(N_("Aborting notes merge resolution")),
 		{ OPTION_BOOLEAN, 0, "abort", &do_abort, NULL,
-			"abort notes merge",
+			N_("abort notes merge"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG },
 		OPT_END()
 	};
@@ -980,10 +983,10 @@
 	int from_stdin = 0;
 	struct option options[] = {
 		OPT_BIT(0, "ignore-missing", &flag,
-			"attempt to remove non-existent note is not an error",
+			N_("attempt to remove non-existent note is not an error"),
 			IGNORE_MISSING),
 		OPT_BOOLEAN(0, "stdin", &from_stdin,
-			    "read object names from the standard input"),
+			    N_("read object names from the standard input")),
 		OPT_END()
 	};
 	struct notes_tree *t;
@@ -1064,8 +1067,8 @@
 	int result;
 	const char *override_notes_ref = NULL;
 	struct option options[] = {
-		OPT_STRING(0, "ref", &override_notes_ref, "notes_ref",
-			   "use notes from <notes_ref>"),
+		OPT_STRING(0, "ref", &override_notes_ref, N_("notes_ref"),
+			   N_("use notes from <notes_ref>")),
 		OPT_END()
 	};
 
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 782e7d0..5e14064 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -20,8 +20,8 @@
 #include "thread-utils.h"
 
 static const char *pack_usage[] = {
-	"git pack-objects --stdout [options...] [< ref-list | < object-list]",
-	"git pack-objects [options...] base-name [< ref-list | < object-list]",
+	N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"),
+	N_("git pack-objects [options...] base-name [< ref-list | < object-list]"),
 	NULL
 };
 
@@ -2445,67 +2445,67 @@
 	int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0;
 	struct option pack_objects_options[] = {
 		OPT_SET_INT('q', "quiet", &progress,
-			    "do not show progress meter", 0),
+			    N_("do not show progress meter"), 0),
 		OPT_SET_INT(0, "progress", &progress,
-			    "show progress meter", 1),
+			    N_("show progress meter"), 1),
 		OPT_SET_INT(0, "all-progress", &progress,
-			    "show progress meter during object writing phase", 2),
+			    N_("show progress meter during object writing phase"), 2),
 		OPT_BOOL(0, "all-progress-implied",
 			 &all_progress_implied,
-			 "similar to --all-progress when progress meter is shown"),
-		{ OPTION_CALLBACK, 0, "index-version", NULL, "version[,offset]",
-		  "write the pack index file in the specified idx format version",
+			 N_("similar to --all-progress when progress meter is shown")),
+		{ OPTION_CALLBACK, 0, "index-version", NULL, N_("version[,offset]"),
+		  N_("write the pack index file in the specified idx format version"),
 		  0, option_parse_index_version },
 		OPT_ULONG(0, "max-pack-size", &pack_size_limit,
-			  "maximum size of each output pack file"),
+			  N_("maximum size of each output pack file")),
 		OPT_BOOL(0, "local", &local,
-			 "ignore borrowed objects from alternate object store"),
+			 N_("ignore borrowed objects from alternate object store")),
 		OPT_BOOL(0, "incremental", &incremental,
-			 "ignore packed objects"),
+			 N_("ignore packed objects")),
 		OPT_INTEGER(0, "window", &window,
-			    "limit pack window by objects"),
+			    N_("limit pack window by objects")),
 		OPT_ULONG(0, "window-memory", &window_memory_limit,
-			  "limit pack window by memory in addition to object limit"),
+			  N_("limit pack window by memory in addition to object limit")),
 		OPT_INTEGER(0, "depth", &depth,
-			    "maximum length of delta chain allowed in the resulting pack"),
+			    N_("maximum length of delta chain allowed in the resulting pack")),
 		OPT_BOOL(0, "reuse-delta", &reuse_delta,
-			 "reuse existing deltas"),
+			 N_("reuse existing deltas")),
 		OPT_BOOL(0, "reuse-object", &reuse_object,
-			 "reuse existing objects"),
+			 N_("reuse existing objects")),
 		OPT_BOOL(0, "delta-base-offset", &allow_ofs_delta,
-			 "use OFS_DELTA objects"),
+			 N_("use OFS_DELTA objects")),
 		OPT_INTEGER(0, "threads", &delta_search_threads,
-			    "use threads when searching for best delta matches"),
+			    N_("use threads when searching for best delta matches")),
 		OPT_BOOL(0, "non-empty", &non_empty,
-			 "do not create an empty pack output"),
+			 N_("do not create an empty pack output")),
 		OPT_BOOL(0, "revs", &use_internal_rev_list,
-			 "read revision arguments from standard input"),
+			 N_("read revision arguments from standard input")),
 		{ OPTION_SET_INT, 0, "unpacked", &rev_list_unpacked, NULL,
-		  "limit the objects to those that are not yet packed",
+		  N_("limit the objects to those that are not yet packed"),
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
 		{ OPTION_SET_INT, 0, "all", &rev_list_all, NULL,
-		  "include objects reachable from any reference",
+		  N_("include objects reachable from any reference"),
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
 		{ OPTION_SET_INT, 0, "reflog", &rev_list_reflog, NULL,
-		  "include objects referred by reflog entries",
+		  N_("include objects referred by reflog entries"),
 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, 1 },
 		OPT_BOOL(0, "stdout", &pack_to_stdout,
-			 "output pack to stdout"),
+			 N_("output pack to stdout")),
 		OPT_BOOL(0, "include-tag", &include_tag,
-			 "include tag objects that refer to objects to be packed"),
+			 N_("include tag objects that refer to objects to be packed")),
 		OPT_BOOL(0, "keep-unreachable", &keep_unreachable,
-			 "keep unreachable objects"),
-		{ OPTION_CALLBACK, 0, "unpack-unreachable", NULL, "time",
-		  "unpack unreachable objects newer than <time>",
+			 N_("keep unreachable objects")),
+		{ OPTION_CALLBACK, 0, "unpack-unreachable", NULL, N_("time"),
+		  N_("unpack unreachable objects newer than <time>"),
 		  PARSE_OPT_OPTARG, option_parse_unpack_unreachable },
 		OPT_BOOL(0, "thin", &thin,
-			 "create thin packs"),
+			 N_("create thin packs")),
 		OPT_BOOL(0, "honor-pack-keep", &ignore_packed_keep,
-			 "ignore packs that have companion .keep file"),
+			 N_("ignore packs that have companion .keep file")),
 		OPT_INTEGER(0, "compression", &pack_compression_level,
-			    "pack compression level"),
+			    N_("pack compression level")),
 		OPT_SET_INT(0, "keep-true-parents", &grafts_replace_parents,
-			    "do not hide commits by grafts", 0),
+			    N_("do not hide commits by grafts"), 0),
 		OPT_END(),
 	};
 
diff --git a/builtin/pack-refs.c b/builtin/pack-refs.c
index 39a9d89..b5a0f88 100644
--- a/builtin/pack-refs.c
+++ b/builtin/pack-refs.c
@@ -3,7 +3,7 @@
 #include "pack-refs.h"
 
 static char const * const pack_refs_usage[] = {
-	"git pack-refs [options]",
+	N_("git pack-refs [options]"),
 	NULL
 };
 
@@ -11,8 +11,8 @@
 {
 	unsigned int flags = PACK_REFS_PRUNE;
 	struct option opts[] = {
-		OPT_BIT(0, "all",   &flags, "pack everything", PACK_REFS_ALL),
-		OPT_BIT(0, "prune", &flags, "prune loose refs (default)", PACK_REFS_PRUNE),
+		OPT_BIT(0, "all",   &flags, N_("pack everything"), PACK_REFS_ALL),
+		OPT_BIT(0, "prune", &flags, N_("prune loose refs (default)"), PACK_REFS_PRUNE),
 		OPT_END(),
 	};
 	if (parse_options(argc, argv, prefix, opts, pack_refs_usage, 0))
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index b58a2e1..83382c1 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -4,7 +4,7 @@
 #include "parse-options.h"
 
 static const char * const prune_packed_usage[] = {
-	"git prune-packed [-n|--dry-run] [-q|--quiet]",
+	N_("git prune-packed [-n|--dry-run] [-q|--quiet]"),
 	NULL
 };
 
@@ -73,8 +73,8 @@
 {
 	int opts = isatty(2) ? VERBOSE : 0;
 	const struct option prune_packed_options[] = {
-		OPT_BIT('n', "dry-run", &opts, "dry run", DRY_RUN),
-		OPT_NEGBIT('q', "quiet", &opts, "be quiet", VERBOSE),
+		OPT_BIT('n', "dry-run", &opts, N_("dry run"), DRY_RUN),
+		OPT_NEGBIT('q', "quiet", &opts, N_("be quiet"), VERBOSE),
 		OPT_END()
 	};
 
diff --git a/builtin/prune.c b/builtin/prune.c
index 6cb9944..8cb8b91 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -9,7 +9,7 @@
 #include "dir.h"
 
 static const char * const prune_usage[] = {
-	"git prune [-n] [-v] [--expire <time>] [--] [<head>...]",
+	N_("git prune [-n] [-v] [--expire <time>] [--] [<head>...]"),
 	NULL
 };
 static int show_only;
@@ -129,11 +129,11 @@
 	struct rev_info revs;
 	struct progress *progress = NULL;
 	const struct option options[] = {
-		OPT__DRY_RUN(&show_only, "do not remove, show only"),
-		OPT__VERBOSE(&verbose, "report pruned objects"),
-		OPT_BOOL(0, "progress", &show_progress, "show progress"),
+		OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
+		OPT__VERBOSE(&verbose, N_("report pruned objects")),
+		OPT_BOOL(0, "progress", &show_progress, N_("show progress")),
 		OPT_DATE(0, "expire", &expire,
-			 "expire objects older than <time>"),
+			 N_("expire objects older than <time>")),
 		OPT_END()
 	};
 	char *s;
@@ -169,7 +169,7 @@
 
 	prune_packed_objects(show_only);
 	remove_temporary_files(get_object_directory());
-	s = xstrdup(mkpath("%s/pack", get_object_directory()));
+	s = mkpathdup("%s/pack", get_object_directory());
 	remove_temporary_files(s);
 	free(s);
 	return 0;
diff --git a/builtin/push.c b/builtin/push.c
index fdfcc6c..db9ba30 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -11,7 +11,7 @@
 #include "submodule.h"
 
 static const char * const push_usage[] = {
-	"git push [<options>] [<repository> [<refspec>...]]",
+	N_("git push [<options>] [<repository> [<refspec>...]]"),
 	NULL,
 };
 
@@ -147,12 +147,37 @@
 	add_refspec(refspec.buf);
 }
 
+static char warn_unspecified_push_default_msg[] =
+N_("push.default is unset; its implicit value is changing in\n"
+   "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+   "and maintain the current behavior after the default changes, use:\n"
+   "\n"
+   "  git config --global push.default matching\n"
+   "\n"
+   "To squelch this message and adopt the new behavior now, use:\n"
+   "\n"
+   "  git config --global push.default simple\n"
+   "\n"
+   "See 'git help config' and search for 'push.default' for further information.\n"
+   "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+   "'current' instead of 'simple' if you sometimes use older versions of Git)");
+
+static void warn_unspecified_push_default_configuration(void)
+{
+	static int warn_once;
+
+	if (warn_once++)
+		return;
+	warning("%s\n", _(warn_unspecified_push_default_msg));
+}
+
 static void setup_default_push_refspecs(struct remote *remote)
 {
 	switch (push_default) {
 	default:
 	case PUSH_DEFAULT_UNSPECIFIED:
 		default_matching_used = 1;
+		warn_unspecified_push_default_configuration();
 		/* fallthru */
 	case PUSH_DEFAULT_MATCHING:
 		add_refspec(":");
@@ -186,8 +211,8 @@
 static const char message_advice_use_upstream[] =
 	N_("Updates were rejected because a pushed branch tip is behind its remote\n"
 	   "counterpart. If you did not intend to push that branch, you may want to\n"
-	   "specify branches to push or set the 'push.default' configuration\n"
-	   "variable to 'current' or 'upstream' to push only the current branch.");
+	   "specify branches to push or set the 'push.default' configuration variable\n"
+	   "to 'simple', 'current' or 'upstream' to push only the current branch.");
 
 static const char message_advice_checkout_pull_push[] =
 	N_("Updates were rejected because a pushed branch tip is behind its remote\n"
@@ -354,25 +379,25 @@
 	const char *repo = NULL;	/* default repository */
 	struct option options[] = {
 		OPT__VERBOSITY(&verbosity),
-		OPT_STRING( 0 , "repo", &repo, "repository", "repository"),
-		OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL),
-		OPT_BIT( 0 , "mirror", &flags, "mirror all refs",
+		OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
+		OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
+		OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
 			    (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
-		OPT_BOOLEAN( 0, "delete", &deleterefs, "delete refs"),
-		OPT_BOOLEAN( 0 , "tags", &tags, "push tags (can't be used with --all or --mirror)"),
-		OPT_BIT('n' , "dry-run", &flags, "dry run", TRANSPORT_PUSH_DRY_RUN),
-		OPT_BIT( 0,  "porcelain", &flags, "machine-readable output", TRANSPORT_PUSH_PORCELAIN),
-		OPT_BIT('f', "force", &flags, "force updates", TRANSPORT_PUSH_FORCE),
-		{ OPTION_CALLBACK, 0, "recurse-submodules", &flags, "check",
-			"controls recursive pushing of submodules",
+		OPT_BOOLEAN( 0, "delete", &deleterefs, N_("delete refs")),
+		OPT_BOOLEAN( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
+		OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
+		OPT_BIT( 0,  "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
+		OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
+		{ OPTION_CALLBACK, 0, "recurse-submodules", &flags, N_("check"),
+			N_("control recursive pushing of submodules"),
 			PARSE_OPT_OPTARG, option_parse_recurse_submodules },
-		OPT_BOOLEAN( 0 , "thin", &thin, "use thin pack"),
-		OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", "receive pack program"),
-		OPT_STRING( 0 , "exec", &receivepack, "receive-pack", "receive pack program"),
-		OPT_BIT('u', "set-upstream", &flags, "set upstream for git pull/status",
+		OPT_BOOLEAN( 0 , "thin", &thin, N_("use thin pack")),
+		OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
+		OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
+		OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
 			TRANSPORT_PUSH_SET_UPSTREAM),
-		OPT_BOOL(0, "progress", &progress, "force progress reporting"),
-		OPT_BIT(0, "prune", &flags, "prune locally removed refs",
+		OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
+		OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
 			TRANSPORT_PUSH_PRUNE),
 		OPT_END()
 	};
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index df6c4c8..042ac1b 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -33,7 +33,7 @@
 }
 
 static const char * const read_tree_usage[] = {
-	"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])",
+	N_("git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"),
 	NULL
 };
 
@@ -104,37 +104,37 @@
 	struct unpack_trees_options opts;
 	int prefix_set = 0;
 	const struct option read_tree_options[] = {
-		{ OPTION_CALLBACK, 0, "index-output", NULL, "file",
-		  "write resulting index to <file>",
+		{ OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
+		  N_("write resulting index to <file>"),
 		  PARSE_OPT_NONEG, index_output_cb },
 		OPT_SET_INT(0, "empty", &read_empty,
-			    "only empty the index", 1),
-		OPT__VERBOSE(&opts.verbose_update, "be verbose"),
-		OPT_GROUP("Merging"),
+			    N_("only empty the index"), 1),
+		OPT__VERBOSE(&opts.verbose_update, N_("be verbose")),
+		OPT_GROUP(N_("Merging")),
 		OPT_SET_INT('m', NULL, &opts.merge,
-			    "perform a merge in addition to a read", 1),
+			    N_("perform a merge in addition to a read"), 1),
 		OPT_SET_INT(0, "trivial", &opts.trivial_merges_only,
-			    "3-way merge if no file level merging required", 1),
+			    N_("3-way merge if no file level merging required"), 1),
 		OPT_SET_INT(0, "aggressive", &opts.aggressive,
-			    "3-way merge in presence of adds and removes", 1),
+			    N_("3-way merge in presence of adds and removes"), 1),
 		OPT_SET_INT(0, "reset", &opts.reset,
-			    "same as -m, but discard unmerged entries", 1),
-		{ OPTION_STRING, 0, "prefix", &opts.prefix, "<subdirectory>/",
-		  "read the tree into the index under <subdirectory>/",
+			    N_("same as -m, but discard unmerged entries"), 1),
+		{ OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
+		  N_("read the tree into the index under <subdirectory>/"),
 		  PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP },
 		OPT_SET_INT('u', NULL, &opts.update,
-			    "update working tree with merge result", 1),
+			    N_("update working tree with merge result"), 1),
 		{ OPTION_CALLBACK, 0, "exclude-per-directory", &opts,
-		  "gitignore",
-		  "allow explicitly ignored files to be overwritten",
+		  N_("gitignore"),
+		  N_("allow explicitly ignored files to be overwritten"),
 		  PARSE_OPT_NONEG, exclude_per_directory_cb },
 		OPT_SET_INT('i', NULL, &opts.index_only,
-			    "don't check the working tree after merging", 1),
-		OPT__DRY_RUN(&opts.dry_run, "don't update the index or the work tree"),
+			    N_("don't check the working tree after merging"), 1),
+		OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
 		OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
-			    "skip applying sparse checkout filter", 1),
+			    N_("skip applying sparse checkout filter"), 1),
 		OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack,
-			    "debug unpack-trees", 1),
+			    N_("debug unpack-trees"), 1),
 		OPT_END()
 	};
 
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 2cb854f..ff781fe 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -480,7 +480,6 @@
 	    !prefixcmp(name, "refs/heads/")) {
 		struct object *old_object, *new_object;
 		struct commit *old_commit, *new_commit;
-		struct commit_list *bases, *ent;
 
 		old_object = parse_object(old_sha1);
 		new_object = parse_object(new_sha1);
@@ -493,12 +492,7 @@
 		}
 		old_commit = (struct commit *)old_object;
 		new_commit = (struct commit *)new_object;
-		bases = get_merge_bases(old_commit, new_commit, 1);
-		for (ent = bases; ent; ent = ent->next)
-			if (!hashcmp(old_sha1, ent->item->object.sha1))
-				break;
-		free_commit_list(bases);
-		if (!ent) {
+		if (!in_merge_bases(old_commit, new_commit)) {
 			rp_error("denying non-fast-forward %s"
 				 " (you should pull first)", name);
 			return "non-fast-forward";
@@ -701,7 +695,7 @@
 
 	if (unpacker_error) {
 		for (cmd = commands; cmd; cmd = cmd->next)
-			cmd->error_string = "n/a (unpacker error)";
+			cmd->error_string = "unpacker error";
 		return;
 	}
 
@@ -801,7 +795,7 @@
 
 static const char *pack_lockfile;
 
-static const char *unpack(void)
+static const char *unpack(int err_fd)
 {
 	struct pack_header hdr;
 	const char *hdr_err;
@@ -821,6 +815,7 @@
 
 	if (ntohl(hdr.hdr_entries) < unpack_limit) {
 		int code, i = 0;
+		struct child_process child;
 		const char *unpacker[5];
 		unpacker[i++] = "unpack-objects";
 		if (quiet)
@@ -829,7 +824,12 @@
 			unpacker[i++] = "--strict";
 		unpacker[i++] = hdr_arg;
 		unpacker[i++] = NULL;
-		code = run_command_v_opt(unpacker, RUN_GIT_CMD);
+		memset(&child, 0, sizeof(child));
+		child.argv = unpacker;
+		child.no_stdout = 1;
+		child.err = err_fd;
+		child.git_cmd = 1;
+		code = run_command(&child);
 		if (!code)
 			return NULL;
 		return "unpack-objects abnormal exit";
@@ -854,6 +854,7 @@
 		memset(&ip, 0, sizeof(ip));
 		ip.argv = keeper;
 		ip.out = -1;
+		ip.err = err_fd;
 		ip.git_cmd = 1;
 		status = start_command(&ip);
 		if (status) {
@@ -870,6 +871,26 @@
 	}
 }
 
+static const char *unpack_with_sideband(void)
+{
+	struct async muxer;
+	const char *ret;
+
+	if (!use_sideband)
+		return unpack(0);
+
+	memset(&muxer, 0, sizeof(muxer));
+	muxer.proc = copy_to_sideband;
+	muxer.in = -1;
+	if (start_async(&muxer))
+		return NULL;
+
+	ret = unpack(muxer.in);
+
+	finish_async(&muxer);
+	return ret;
+}
+
 static void report(struct command *commands, const char *unpack_status)
 {
 	struct command *cmd;
@@ -967,7 +988,7 @@
 		const char *unpack_status = NULL;
 
 		if (!delete_only(commands))
-			unpack_status = unpack();
+			unpack_status = unpack_with_sideband();
 		execute_commands(commands, unpack_status);
 		if (pack_lockfile)
 			unlink_or_warn(pack_lockfile);
diff --git a/builtin/remote.c b/builtin/remote.c
index 357d59d..a5a4b23 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -8,66 +8,66 @@
 #include "refs.h"
 
 static const char * const builtin_remote_usage[] = {
-	"git remote [-v | --verbose]",
-	"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>",
-	"git remote rename <old> <new>",
-	"git remote remove <name>",
-	"git remote set-head <name> (-a | -d | <branch>)",
-	"git remote [-v | --verbose] show [-n] <name>",
-	"git remote prune [-n | --dry-run] <name>",
-	"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]",
-	"git remote set-branches [--add] <name> <branch>...",
-	"git remote set-url [--push] <name> <newurl> [<oldurl>]",
-	"git remote set-url --add <name> <newurl>",
-	"git remote set-url --delete <name> <url>",
+	N_("git remote [-v | --verbose]"),
+	N_("git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>"),
+	N_("git remote rename <old> <new>"),
+	N_("git remote remove <name>"),
+	N_("git remote set-head <name> (-a | -d | <branch>)"),
+	N_("git remote [-v | --verbose] show [-n] <name>"),
+	N_("git remote prune [-n | --dry-run] <name>"),
+	N_("git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"),
+	N_("git remote set-branches [--add] <name> <branch>..."),
+	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
+	N_("git remote set-url --add <name> <newurl>"),
+	N_("git remote set-url --delete <name> <url>"),
 	NULL
 };
 
 static const char * const builtin_remote_add_usage[] = {
-	"git remote add [<options>] <name> <url>",
+	N_("git remote add [<options>] <name> <url>"),
 	NULL
 };
 
 static const char * const builtin_remote_rename_usage[] = {
-	"git remote rename <old> <new>",
+	N_("git remote rename <old> <new>"),
 	NULL
 };
 
 static const char * const builtin_remote_rm_usage[] = {
-	"git remote remove <name>",
+	N_("git remote remove <name>"),
 	NULL
 };
 
 static const char * const builtin_remote_sethead_usage[] = {
-	"git remote set-head <name> (-a | -d | <branch>])",
+	N_("git remote set-head <name> (-a | -d | <branch>])"),
 	NULL
 };
 
 static const char * const builtin_remote_setbranches_usage[] = {
-	"git remote set-branches <name> <branch>...",
-	"git remote set-branches --add <name> <branch>...",
+	N_("git remote set-branches <name> <branch>..."),
+	N_("git remote set-branches --add <name> <branch>..."),
 	NULL
 };
 
 static const char * const builtin_remote_show_usage[] = {
-	"git remote show [<options>] <name>",
+	N_("git remote show [<options>] <name>"),
 	NULL
 };
 
 static const char * const builtin_remote_prune_usage[] = {
-	"git remote prune [<options>] <name>",
+	N_("git remote prune [<options>] <name>"),
 	NULL
 };
 
 static const char * const builtin_remote_update_usage[] = {
-	"git remote update [<options>] [<group> | <remote>]...",
+	N_("git remote update [<options>] [<group> | <remote>]..."),
 	NULL
 };
 
 static const char * const builtin_remote_seturl_usage[] = {
-	"git remote set-url [--push] <name> <newurl> [<oldurl>]",
-	"git remote set-url --add <name> <newurl>",
-	"git remote set-url --delete <name> <url>",
+	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
+	N_("git remote set-url --add <name> <newurl>"),
+	N_("git remote set-url --delete <name> <url>"),
 	NULL
 };
 
@@ -160,17 +160,17 @@
 	int i;
 
 	struct option options[] = {
-		OPT_BOOLEAN('f', "fetch", &fetch, "fetch the remote branches"),
+		OPT_BOOLEAN('f', "fetch", &fetch, N_("fetch the remote branches")),
 		OPT_SET_INT(0, "tags", &fetch_tags,
-			    "import all tags and associated objects when fetching",
+			    N_("import all tags and associated objects when fetching"),
 			    TAGS_SET),
 		OPT_SET_INT(0, NULL, &fetch_tags,
-			    "or do not fetch any tag at all (--no-tags)", TAGS_UNSET),
-		OPT_STRING_LIST('t', "track", &track, "branch",
-				"branch(es) to track"),
-		OPT_STRING('m', "master", &master, "branch", "master branch"),
-		{ OPTION_CALLBACK, 0, "mirror", &mirror, "push|fetch",
-			"set up remote as a mirror to push to or fetch from",
+			    N_("or do not fetch any tag at all (--no-tags)"), TAGS_UNSET),
+		OPT_STRING_LIST('t', "track", &track, N_("branch"),
+				N_("branch(es) to track")),
+		OPT_STRING('m', "master", &master, N_("branch"), N_("master branch")),
+		{ OPTION_CALLBACK, 0, "mirror", &mirror, N_("push|fetch"),
+			N_("set up remote as a mirror to push to or fetch from"),
 			PARSE_OPT_OPTARG, parse_mirror_opt },
 		OPT_END()
 	};
@@ -1088,7 +1088,7 @@
 {
 	int no_query = 0, result = 0, query_flag = 0;
 	struct option options[] = {
-		OPT_BOOLEAN('n', NULL, &no_query, "do not query remotes"),
+		OPT_BOOLEAN('n', NULL, &no_query, N_("do not query remotes")),
 		OPT_END()
 	};
 	struct ref_states states;
@@ -1196,9 +1196,9 @@
 
 	struct option options[] = {
 		OPT_BOOLEAN('a', "auto", &opt_a,
-			    "set refs/remotes/<name>/HEAD according to remote"),
+			    N_("set refs/remotes/<name>/HEAD according to remote")),
 		OPT_BOOLEAN('d', "delete", &opt_d,
-			    "delete refs/remotes/<name>/HEAD"),
+			    N_("delete refs/remotes/<name>/HEAD")),
 		OPT_END()
 	};
 	argc = parse_options(argc, argv, NULL, options, builtin_remote_sethead_usage,
@@ -1250,7 +1250,7 @@
 {
 	int dry_run = 0, result = 0;
 	struct option options[] = {
-		OPT__DRY_RUN(&dry_run, "dry run"),
+		OPT__DRY_RUN(&dry_run, N_("dry run")),
 		OPT_END()
 	};
 
@@ -1318,7 +1318,7 @@
 	int i, prune = 0;
 	struct option options[] = {
 		OPT_BOOLEAN('p', "prune", &prune,
-			    "prune remotes after fetching"),
+			    N_("prune remotes after fetching")),
 		OPT_END()
 	};
 	const char **fetch_argv;
@@ -1404,7 +1404,7 @@
 {
 	int add_mode = 0;
 	struct option options[] = {
-		OPT_BOOLEAN('\0', "add", &add_mode, "add branch"),
+		OPT_BOOLEAN('\0', "add", &add_mode, N_("add branch")),
 		OPT_END()
 	};
 
@@ -1433,11 +1433,11 @@
 	struct strbuf name_buf = STRBUF_INIT;
 	struct option options[] = {
 		OPT_BOOLEAN('\0', "push", &push_mode,
-			    "manipulate push URLs"),
+			    N_("manipulate push URLs")),
 		OPT_BOOLEAN('\0', "add", &add_mode,
-			    "add URL"),
+			    N_("add URL")),
 		OPT_BOOLEAN('\0', "delete", &delete_mode,
-			    "delete URLs"),
+			    N_("delete URLs")),
 		OPT_END()
 	};
 	argc = parse_options(argc, argv, NULL, options, builtin_remote_seturl_usage,
@@ -1566,7 +1566,7 @@
 int cmd_remote(int argc, const char **argv, const char *prefix)
 {
 	struct option options[] = {
-		OPT__VERBOSE(&verbose, "be verbose; must be placed before a subcommand"),
+		OPT__VERBOSE(&verbose, N_("be verbose; must be placed before a subcommand")),
 		OPT_END()
 	};
 	int result;
diff --git a/builtin/replace.c b/builtin/replace.c
index 4a8970e..e3aaf70 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -14,9 +14,9 @@
 #include "parse-options.h"
 
 static const char * const git_replace_usage[] = {
-	"git replace [-f] <object> <replacement>",
-	"git replace -d <object>...",
-	"git replace -l [<pattern>]",
+	N_("git replace [-f] <object> <replacement>"),
+	N_("git replace -d <object>..."),
+	N_("git replace -l [<pattern>]"),
 	NULL
 };
 
@@ -115,9 +115,9 @@
 {
 	int list = 0, delete = 0, force = 0;
 	struct option options[] = {
-		OPT_BOOLEAN('l', NULL, &list, "list replace refs"),
-		OPT_BOOLEAN('d', NULL, &delete, "delete replace refs"),
-		OPT_BOOLEAN('f', NULL, &force, "replace the ref if it exists"),
+		OPT_BOOLEAN('l', NULL, &list, N_("list replace refs")),
+		OPT_BOOLEAN('d', NULL, &delete, N_("delete replace refs")),
+		OPT_BOOLEAN('f', NULL, &force, N_("replace the ref if it exists")),
 		OPT_END()
 	};
 
diff --git a/builtin/rerere.c b/builtin/rerere.c
index 08213c7..dc1708e 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -8,7 +8,7 @@
 #include "xdiff-interface.h"
 
 static const char * const rerere_usage[] = {
-	"git rerere [clear | forget path... | status | remaining | diff | gc]",
+	N_("git rerere [clear | forget path... | status | remaining | diff | gc]"),
 	NULL,
 };
 
@@ -53,7 +53,7 @@
 
 	struct option options[] = {
 		OPT_SET_INT(0, "rerere-autoupdate", &autoupdate,
-			"register clean resolutions in index", 1),
+			N_("register clean resolutions in index"), 1),
 		OPT_END(),
 	};
 
diff --git a/builtin/reset.c b/builtin/reset.c
index 74442bd..915cc9f 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -22,9 +22,9 @@
 #include "cache-tree.h"
 
 static const char * const git_reset_usage[] = {
-	"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]",
-	"git reset [-q] <commit> [--] <paths>...",
-	"git reset --patch [<commit>] [--] [<paths>...]",
+	N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"),
+	N_("git reset [-q] <commit> [--] <paths>..."),
+	N_("git reset --patch [<commit>] [--] [<paths>...]"),
 	NULL
 };
 
@@ -235,17 +235,17 @@
 	struct commit *commit;
 	struct strbuf msg = STRBUF_INIT;
 	const struct option options[] = {
-		OPT__QUIET(&quiet, "be quiet, only report errors"),
+		OPT__QUIET(&quiet, N_("be quiet, only report errors")),
 		OPT_SET_INT(0, "mixed", &reset_type,
-						"reset HEAD and index", MIXED),
-		OPT_SET_INT(0, "soft", &reset_type, "reset only HEAD", SOFT),
+						N_("reset HEAD and index"), MIXED),
+		OPT_SET_INT(0, "soft", &reset_type, N_("reset only HEAD"), SOFT),
 		OPT_SET_INT(0, "hard", &reset_type,
-				"reset HEAD, index and working tree", HARD),
+				N_("reset HEAD, index and working tree"), HARD),
 		OPT_SET_INT(0, "merge", &reset_type,
-				"reset HEAD, index and working tree", MERGE),
+				N_("reset HEAD, index and working tree"), MERGE),
 		OPT_SET_INT(0, "keep", &reset_type,
-				"reset HEAD but keep local changes", KEEP),
-		OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
+				N_("reset HEAD but keep local changes"), KEEP),
+		OPT_BOOLEAN('p', "patch", &patch_mode, N_("select hunks interactively")),
 		OPT_END()
 	};
 
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 25e225f..f267a1d 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -336,15 +336,15 @@
 {
 	static int keep_dashdash = 0, stop_at_non_option = 0;
 	static char const * const parseopt_usage[] = {
-		"git rev-parse --parseopt [options] -- [<args>...]",
+		N_("git rev-parse --parseopt [options] -- [<args>...]"),
 		NULL
 	};
 	static struct option parseopt_opts[] = {
 		OPT_BOOLEAN(0, "keep-dashdash", &keep_dashdash,
-					"keep the `--` passed as an arg"),
+					N_("keep the `--` passed as an arg")),
 		OPT_BOOLEAN(0, "stop-at-non-option", &stop_at_non_option,
-					"stop parsing after the "
-					"first non-option argument"),
+					N_("stop parsing after the "
+					   "first non-option argument")),
 		OPT_END(),
 	};
 
@@ -461,11 +461,11 @@
 }
 
 static const char builtin_rev_parse_usage[] =
-"git rev-parse --parseopt [options] -- [<args>...]\n"
-"   or: git rev-parse --sq-quote [<arg>...]\n"
-"   or: git rev-parse [options] [<arg>...]\n"
-"\n"
-"Run \"git rev-parse --parseopt -h\" for more information on the first usage.";
+N_("git rev-parse --parseopt [options] -- [<args>...]\n"
+   "   or: git rev-parse --sq-quote [<arg>...]\n"
+   "   or: git rev-parse [options] [<arg>...]\n"
+   "\n"
+   "Run \"git rev-parse --parseopt -h\" for more information on the first usage.");
 
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
diff --git a/builtin/revert.c b/builtin/revert.c
index 98ad641..c5e36b9 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -19,14 +19,14 @@
  */
 
 static const char * const revert_usage[] = {
-	"git revert [options] <commit-ish>",
-	"git revert <subcommand>",
+	N_("git revert [options] <commit-ish>"),
+	N_("git revert <subcommand>"),
 	NULL
 };
 
 static const char * const cherry_pick_usage[] = {
-	"git cherry-pick [options] <commit-ish>",
-	"git cherry-pick <subcommand>",
+	N_("git cherry-pick [options] <commit-ish>"),
+	N_("git cherry-pick <subcommand>"),
 	NULL
 };
 
@@ -100,18 +100,19 @@
 	int contin = 0;
 	int rollback = 0;
 	struct option options[] = {
-		OPT_BOOLEAN(0, "quit", &remove_state, "end revert or cherry-pick sequence"),
-		OPT_BOOLEAN(0, "continue", &contin, "resume revert or cherry-pick sequence"),
-		OPT_BOOLEAN(0, "abort", &rollback, "cancel revert or cherry-pick sequence"),
-		OPT_BOOLEAN('n', "no-commit", &opts->no_commit, "don't automatically commit"),
-		OPT_BOOLEAN('e', "edit", &opts->edit, "edit the commit message"),
+		OPT_BOOLEAN(0, "quit", &remove_state, N_("end revert or cherry-pick sequence")),
+		OPT_BOOLEAN(0, "continue", &contin, N_("resume revert or cherry-pick sequence")),
+		OPT_BOOLEAN(0, "abort", &rollback, N_("cancel revert or cherry-pick sequence")),
+		OPT_BOOLEAN('n', "no-commit", &opts->no_commit, N_("don't automatically commit")),
+		OPT_BOOLEAN('e', "edit", &opts->edit, N_("edit the commit message")),
 		OPT_NOOP_NOARG('r', NULL),
-		OPT_BOOLEAN('s', "signoff", &opts->signoff, "add Signed-off-by:"),
-		OPT_INTEGER('m', "mainline", &opts->mainline, "parent number"),
+		OPT_BOOLEAN('s', "signoff", &opts->signoff, N_("add Signed-off-by:")),
+		OPT_INTEGER('m', "mainline", &opts->mainline, N_("parent number")),
 		OPT_RERERE_AUTOUPDATE(&opts->allow_rerere_auto),
-		OPT_STRING(0, "strategy", &opts->strategy, "strategy", "merge strategy"),
-		OPT_CALLBACK('X', "strategy-option", &opts, "option",
-			"option for merge strategy", option_parse_x),
+		OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")),
+		OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
+			N_("option for merge strategy"), option_parse_x),
+		OPT_END(),
 		OPT_END(),
 		OPT_END(),
 		OPT_END(),
@@ -121,10 +122,11 @@
 
 	if (opts->action == REPLAY_PICK) {
 		struct option cp_extra[] = {
-			OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
-			OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
-			OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, "preserve initially empty commits"),
-			OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, "keep redundant, empty commits"),
+			OPT_BOOLEAN('x', NULL, &opts->record_origin, N_("append commit name")),
+			OPT_BOOLEAN(0, "ff", &opts->allow_ff, N_("allow fast-forward")),
+			OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, N_("preserve initially empty commits")),
+			OPT_BOOLEAN(0, "allow-empty-message", &opts->allow_empty_message, N_("allow commits with empty messages")),
+			OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, N_("keep redundant, empty commits")),
 			OPT_END(),
 		};
 		if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))
diff --git a/builtin/rm.c b/builtin/rm.c
index 90c8a50..b384c4c 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -11,7 +11,7 @@
 #include "parse-options.h"
 
 static const char * const builtin_rm_usage[] = {
-	"git rm [options] [--] <file>...",
+	N_("git rm [options] [--] <file>..."),
 	NULL
 };
 
@@ -130,13 +130,13 @@
 static int ignore_unmatch = 0;
 
 static struct option builtin_rm_options[] = {
-	OPT__DRY_RUN(&show_only, "dry run"),
-	OPT__QUIET(&quiet, "do not list removed files"),
-	OPT_BOOLEAN( 0 , "cached",         &index_only, "only remove from the index"),
-	OPT__FORCE(&force, "override the up-to-date check"),
-	OPT_BOOLEAN('r', NULL,             &recursive,  "allow recursive removal"),
+	OPT__DRY_RUN(&show_only, N_("dry run")),
+	OPT__QUIET(&quiet, N_("do not list removed files")),
+	OPT_BOOLEAN( 0 , "cached",         &index_only, N_("only remove from the index")),
+	OPT__FORCE(&force, N_("override the up-to-date check")),
+	OPT_BOOLEAN('r', NULL,             &recursive,  N_("allow recursive removal")),
 	OPT_BOOLEAN( 0 , "ignore-unmatch", &ignore_unmatch,
-				"exit with a zero status even if nothing matched"),
+				N_("exit with a zero status even if nothing matched")),
 	OPT_END(),
 };
 
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 37f3193..b316cf3 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -10,9 +10,9 @@
 #include "parse-options.h"
 
 static char const * const shortlog_usage[] = {
-	"git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]",
+	N_("git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"),
 	"",
-	"[rev-opts] are documented in git-rev-list(1)",
+	N_("[rev-opts] are documented in git-rev-list(1)"),
 	NULL
 };
 
@@ -250,13 +250,13 @@
 
 	static const struct option options[] = {
 		OPT_BOOLEAN('n', "numbered", &log.sort_by_number,
-			    "sort output according to the number of commits per author"),
+			    N_("sort output according to the number of commits per author")),
 		OPT_BOOLEAN('s', "summary", &log.summary,
-			    "Suppress commit descriptions, only provides commit count"),
+			    N_("Suppress commit descriptions, only provides commit count")),
 		OPT_BOOLEAN('e', "email", &log.email,
-			    "Show the email address of each author"),
-		{ OPTION_CALLBACK, 'w', NULL, &log, "w[,i1[,i2]]",
-			"Linewrap output", PARSE_OPT_OPTARG, &parse_wrap_args },
+			    N_("Show the email address of each author")),
+		{ OPTION_CALLBACK, 'w', NULL, &log, N_("w[,i1[,i2]]"),
+			N_("Linewrap output"), PARSE_OPT_OPTARG, &parse_wrap_args },
 		OPT_END(),
 	};
 
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index a59e088..d208fd6 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -6,8 +6,8 @@
 #include "parse-options.h"
 
 static const char* show_branch_usage[] = {
-    "git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]",
-    "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]",
+    N_("git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"),
+    N_("git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"),
     NULL
 };
 
@@ -648,36 +648,36 @@
 	const char *reflog_base = NULL;
 	struct option builtin_show_branch_options[] = {
 		OPT_BOOLEAN('a', "all", &all_heads,
-			    "show remote-tracking and local branches"),
+			    N_("show remote-tracking and local branches")),
 		OPT_BOOLEAN('r', "remotes", &all_remotes,
-			    "show remote-tracking branches"),
+			    N_("show remote-tracking branches")),
 		OPT__COLOR(&showbranch_use_color,
-			    "color '*!+-' corresponding to the branch"),
-		{ OPTION_INTEGER, 0, "more", &extra, "n",
-			    "show <n> more commits after the common ancestor",
+			    N_("color '*!+-' corresponding to the branch")),
+		{ OPTION_INTEGER, 0, "more", &extra, N_("n"),
+			    N_("show <n> more commits after the common ancestor"),
 			    PARSE_OPT_OPTARG, NULL, (intptr_t)1 },
-		OPT_SET_INT(0, "list", &extra, "synonym to more=-1", -1),
-		OPT_BOOLEAN(0, "no-name", &no_name, "suppress naming strings"),
+		OPT_SET_INT(0, "list", &extra, N_("synonym to more=-1"), -1),
+		OPT_BOOLEAN(0, "no-name", &no_name, N_("suppress naming strings")),
 		OPT_BOOLEAN(0, "current", &with_current_branch,
-			    "include the current branch"),
+			    N_("include the current branch")),
 		OPT_BOOLEAN(0, "sha1-name", &sha1_name,
-			    "name commits with their object names"),
+			    N_("name commits with their object names")),
 		OPT_BOOLEAN(0, "merge-base", &merge_base,
-			    "show possible merge bases"),
+			    N_("show possible merge bases")),
 		OPT_BOOLEAN(0, "independent", &independent,
-			    "show refs unreachable from any other ref"),
+			    N_("show refs unreachable from any other ref")),
 		OPT_BOOLEAN(0, "topo-order", &lifo,
-			    "show commits in topological order"),
+			    N_("show commits in topological order")),
 		OPT_BOOLEAN(0, "topics", &topics,
-			    "show only commits not on the first branch"),
+			    N_("show only commits not on the first branch")),
 		OPT_SET_INT(0, "sparse", &dense,
-			    "show merges reachable from only one tip", 0),
+			    N_("show merges reachable from only one tip"), 0),
 		OPT_SET_INT(0, "date-order", &lifo,
-			    "show commits where no parent comes before its "
-			    "children", 0),
-		{ OPTION_CALLBACK, 'g', "reflog", &reflog_base, "<n>[,<base>]",
-			    "show <n> most recent ref-log entries starting at "
-			    "base",
+			    N_("show commits where no parent comes before its "
+			       "children"), 0),
+		{ OPTION_CALLBACK, 'g', "reflog", &reflog_base, N_("<n>[,<base>]"),
+			    N_("show <n> most recent ref-log entries starting at "
+			       "base"),
 			    PARSE_OPT_OPTARG | PARSE_OPT_LITERAL_ARGHELP,
 			    parse_reflog_param },
 		OPT_END()
diff --git a/builtin/show-ref.c b/builtin/show-ref.c
index 3911661..4eb016d 100644
--- a/builtin/show-ref.c
+++ b/builtin/show-ref.c
@@ -7,8 +7,8 @@
 #include "parse-options.h"
 
 static const char * const show_ref_usage[] = {
-	"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] ",
-	"git show-ref --exclude-existing[=pattern] < ref-list",
+	N_("git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "),
+	N_("git show-ref --exclude-existing[=pattern] < ref-list"),
 	NULL
 };
 
@@ -179,26 +179,26 @@
 }
 
 static const struct option show_ref_options[] = {
-	OPT_BOOLEAN(0, "tags", &tags_only, "only show tags (can be combined with heads)"),
-	OPT_BOOLEAN(0, "heads", &heads_only, "only show heads (can be combined with tags)"),
-	OPT_BOOLEAN(0, "verify", &verify, "stricter reference checking, "
-		    "requires exact ref path"),
+	OPT_BOOLEAN(0, "tags", &tags_only, N_("only show tags (can be combined with heads)")),
+	OPT_BOOLEAN(0, "heads", &heads_only, N_("only show heads (can be combined with tags)")),
+	OPT_BOOLEAN(0, "verify", &verify, N_("stricter reference checking, "
+		    "requires exact ref path")),
 	{ OPTION_BOOLEAN, 'h', NULL, &show_head, NULL,
-	  "show the HEAD reference",
+	  N_("show the HEAD reference"),
 	  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
-	OPT_BOOLEAN(0, "head", &show_head, "show the HEAD reference"),
+	OPT_BOOLEAN(0, "head", &show_head, N_("show the HEAD reference")),
 	OPT_BOOLEAN('d', "dereference", &deref_tags,
-		    "dereference tags into object IDs"),
-	{ OPTION_CALLBACK, 's', "hash", &abbrev, "n",
-	  "only show SHA1 hash using <n> digits",
+		    N_("dereference tags into object IDs")),
+	{ OPTION_CALLBACK, 's', "hash", &abbrev, N_("n"),
+	  N_("only show SHA1 hash using <n> digits"),
 	  PARSE_OPT_OPTARG, &hash_callback },
 	OPT__ABBREV(&abbrev),
 	OPT__QUIET(&quiet,
-		   "do not print results to stdout (useful with --verify)"),
+		   N_("do not print results to stdout (useful with --verify)")),
 	{ OPTION_CALLBACK, 0, "exclude-existing", &exclude_existing_arg,
-	  "pattern", "show refs from stdin that aren't in local repository",
+	  N_("pattern"), N_("show refs from stdin that aren't in local repository"),
 	  PARSE_OPT_OPTARG | PARSE_OPT_NONEG, exclude_existing_callback },
-	{ OPTION_CALLBACK, 0, "help-all", NULL, NULL, "show usage",
+	{ OPTION_CALLBACK, 0, "help-all", NULL, NULL, N_("show usage"),
 	  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
 	OPT_END()
 };
diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c
index 801d62e..9e92828 100644
--- a/builtin/symbolic-ref.c
+++ b/builtin/symbolic-ref.c
@@ -4,7 +4,7 @@
 #include "parse-options.h"
 
 static const char * const git_symbolic_ref_usage[] = {
-	"git symbolic-ref [options] name [ref]",
+	N_("git symbolic-ref [options] name [ref]"),
 	NULL
 };
 
@@ -35,9 +35,9 @@
 	const char *msg = NULL;
 	struct option options[] = {
 		OPT__QUIET(&quiet,
-			"suppress error message for non-symbolic (detached) refs"),
-		OPT_BOOL(0, "short", &shorten, "shorten ref output"),
-		OPT_STRING('m', NULL, &msg, "reason", "reason of the update"),
+			N_("suppress error message for non-symbolic (detached) refs")),
+		OPT_BOOL(0, "short", &shorten, N_("shorten ref output")),
+		OPT_STRING('m', NULL, &msg, N_("reason"), N_("reason of the update")),
 		OPT_END(),
 	};
 
diff --git a/builtin/tag.c b/builtin/tag.c
index 7b1be85..9c3e067 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -19,11 +19,11 @@
 #include "column.h"
 
 static const char * const git_tag_usage[] = {
-	"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]",
-	"git tag -d <tagname>...",
-	"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
-		"\n\t\t[<pattern>...]",
-	"git tag -v <tagname>...",
+	N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"),
+	N_("git tag -d <tagname>..."),
+	N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
+		"\n\t\t[<pattern>...]"),
+	N_("git tag -v <tagname>..."),
 	NULL
 };
 
@@ -444,37 +444,37 @@
 	struct msg_arg msg = { 0, STRBUF_INIT };
 	struct commit_list *with_commit = NULL;
 	struct option options[] = {
-		OPT_BOOLEAN('l', "list", &list, "list tag names"),
-		{ OPTION_INTEGER, 'n', NULL, &lines, "n",
-				"print <n> lines of each tag message",
+		OPT_BOOLEAN('l', "list", &list, N_("list tag names")),
+		{ OPTION_INTEGER, 'n', NULL, &lines, N_("n"),
+				N_("print <n> lines of each tag message"),
 				PARSE_OPT_OPTARG, NULL, 1 },
-		OPT_BOOLEAN('d', "delete", &delete, "delete tags"),
-		OPT_BOOLEAN('v', "verify", &verify, "verify tags"),
+		OPT_BOOLEAN('d', "delete", &delete, N_("delete tags")),
+		OPT_BOOLEAN('v', "verify", &verify, N_("verify tags")),
 
-		OPT_GROUP("Tag creation options"),
+		OPT_GROUP(N_("Tag creation options")),
 		OPT_BOOLEAN('a', "annotate", &annotate,
-					"annotated tag, needs a message"),
-		OPT_CALLBACK('m', "message", &msg, "message",
-			     "tag message", parse_msg_arg),
-		OPT_FILENAME('F', "file", &msgfile, "read message from file"),
-		OPT_BOOLEAN('s', "sign", &opt.sign, "annotated and GPG-signed tag"),
-		OPT_STRING(0, "cleanup", &cleanup_arg, "mode",
-			"how to strip spaces and #comments from message"),
-		OPT_STRING('u', "local-user", &keyid, "key-id",
-					"use another key to sign the tag"),
-		OPT__FORCE(&force, "replace the tag if exists"),
-		OPT_COLUMN(0, "column", &colopts, "show tag list in columns"),
+					N_("annotated tag, needs a message")),
+		OPT_CALLBACK('m', "message", &msg, N_("message"),
+			     N_("tag message"), parse_msg_arg),
+		OPT_FILENAME('F', "file", &msgfile, N_("read message from file")),
+		OPT_BOOLEAN('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")),
+		OPT_STRING(0, "cleanup", &cleanup_arg, N_("mode"),
+			N_("how to strip spaces and #comments from message")),
+		OPT_STRING('u', "local-user", &keyid, N_("key id"),
+					N_("use another key to sign the tag")),
+		OPT__FORCE(&force, N_("replace the tag if exists")),
+		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
 
-		OPT_GROUP("Tag listing options"),
+		OPT_GROUP(N_("Tag listing options")),
 		{
-			OPTION_CALLBACK, 0, "contains", &with_commit, "commit",
-			"print only tags that contain the commit",
+			OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
+			N_("print only tags that contain the commit"),
 			PARSE_OPT_LASTARG_DEFAULT,
 			parse_opt_with_commit, (intptr_t)"HEAD",
 		},
 		{
-			OPTION_CALLBACK, 0, "points-at", NULL, "object",
-			"print only tags of the object", 0, parse_opt_points_at
+			OPTION_CALLBACK, 0, "points-at", NULL, N_("object"),
+			N_("print only tags of the object"), 0, parse_opt_points_at
 		},
 		OPT_END()
 	};
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 4ce341c..74986bf 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -398,7 +398,7 @@
 }
 
 static const char * const update_index_usage[] = {
-	"git update-index [options] [--] [<file>...]",
+	N_("git update-index [options] [--] [<file>...]"),
 	NULL
 };
 
@@ -714,83 +714,83 @@
 	int parseopt_state = PARSE_OPT_UNKNOWN;
 	struct option options[] = {
 		OPT_BIT('q', NULL, &refresh_args.flags,
-			"continue refresh even when index needs update",
+			N_("continue refresh even when index needs update"),
 			REFRESH_QUIET),
 		OPT_BIT(0, "ignore-submodules", &refresh_args.flags,
-			"refresh: ignore submodules",
+			N_("refresh: ignore submodules"),
 			REFRESH_IGNORE_SUBMODULES),
 		OPT_SET_INT(0, "add", &allow_add,
-			"do not ignore new files", 1),
+			N_("do not ignore new files"), 1),
 		OPT_SET_INT(0, "replace", &allow_replace,
-			"let files replace directories and vice-versa", 1),
+			N_("let files replace directories and vice-versa"), 1),
 		OPT_SET_INT(0, "remove", &allow_remove,
-			"notice files missing from worktree", 1),
+			N_("notice files missing from worktree"), 1),
 		OPT_BIT(0, "unmerged", &refresh_args.flags,
-			"refresh even if index contains unmerged entries",
+			N_("refresh even if index contains unmerged entries"),
 			REFRESH_UNMERGED),
 		{OPTION_CALLBACK, 0, "refresh", &refresh_args, NULL,
-			"refresh stat information",
+			N_("refresh stat information"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
 			refresh_callback},
 		{OPTION_CALLBACK, 0, "really-refresh", &refresh_args, NULL,
-			"like --refresh, but ignore assume-unchanged setting",
+			N_("like --refresh, but ignore assume-unchanged setting"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
 			really_refresh_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 0, "cacheinfo", NULL,
-			"<mode> <object> <path>",
-			"add the specified entry to the index",
+			N_("<mode> <object> <path>"),
+			N_("add the specified entry to the index"),
 			PARSE_OPT_NOARG |	/* disallow --cacheinfo=<mode> form */
 			PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
 			(parse_opt_cb *) cacheinfo_callback},
-		{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, "(+/-)x",
-			"override the executable bit of the listed files",
+		{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, N_("(+/-)x"),
+			N_("override the executable bit of the listed files"),
 			PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
 			chmod_callback},
 		{OPTION_SET_INT, 0, "assume-unchanged", &mark_valid_only, NULL,
-			"mark files as \"not changing\"",
+			N_("mark files as \"not changing\""),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
 		{OPTION_SET_INT, 0, "no-assume-unchanged", &mark_valid_only, NULL,
-			"clear assumed-unchanged bit",
+			N_("clear assumed-unchanged bit"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
 		{OPTION_SET_INT, 0, "skip-worktree", &mark_skip_worktree_only, NULL,
-			"mark files as \"index-only\"",
+			N_("mark files as \"index-only\""),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG},
 		{OPTION_SET_INT, 0, "no-skip-worktree", &mark_skip_worktree_only, NULL,
-			"clear skip-worktree bit",
+			N_("clear skip-worktree bit"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG},
 		OPT_SET_INT(0, "info-only", &info_only,
-			"add to index only; do not add content to object database", 1),
+			N_("add to index only; do not add content to object database"), 1),
 		OPT_SET_INT(0, "force-remove", &force_remove,
-			"remove named paths even if present in worktree", 1),
+			N_("remove named paths even if present in worktree"), 1),
 		OPT_SET_INT('z', NULL, &line_termination,
-			"with --stdin: input lines are terminated by null bytes", '\0'),
+			N_("with --stdin: input lines are terminated by null bytes"), '\0'),
 		{OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL,
-			"read list of paths to be updated from standard input",
+			N_("read list of paths to be updated from standard input"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
 			(parse_opt_cb *) stdin_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &line_termination, NULL,
-			"add entries from standard input to the index",
+			N_("add entries from standard input to the index"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
 			(parse_opt_cb *) stdin_cacheinfo_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 0, "unresolve", &has_errors, NULL,
-			"repopulate stages #2 and #3 for the listed paths",
+			N_("repopulate stages #2 and #3 for the listed paths"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
 			(parse_opt_cb *) unresolve_callback},
 		{OPTION_LOWLEVEL_CALLBACK, 'g', "again", &has_errors, NULL,
-			"only update entries that differ from HEAD",
+			N_("only update entries that differ from HEAD"),
 			PARSE_OPT_NONEG | PARSE_OPT_NOARG,
 			(parse_opt_cb *) reupdate_callback},
 		OPT_BIT(0, "ignore-missing", &refresh_args.flags,
-			"ignore files missing from worktree",
+			N_("ignore files missing from worktree"),
 			REFRESH_IGNORE_MISSING),
 		OPT_SET_INT(0, "verbose", &verbose,
-			"report actions to standard output", 1),
+			N_("report actions to standard output"), 1),
 		{OPTION_CALLBACK, 0, "clear-resolve-undo", NULL, NULL,
-			"(for porcelains) forget saved unresolved conflicts",
+			N_("(for porcelains) forget saved unresolved conflicts"),
 			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
 			resolve_undo_clear_callback},
 		OPT_INTEGER(0, "index-version", &preferred_index_format,
-			    "write index in this format"),
+			N_("write index in this format")),
 		OPT_END()
 	};
 
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 835c62a..51d2684 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -4,8 +4,8 @@
 #include "parse-options.h"
 
 static const char * const git_update_ref_usage[] = {
-	"git update-ref [options] -d <refname> [<oldval>]",
-	"git update-ref [options]    <refname> <newval> [<oldval>]",
+	N_("git update-ref [options] -d <refname> [<oldval>]"),
+	N_("git update-ref [options]    <refname> <newval> [<oldval>]"),
 	NULL
 };
 
@@ -15,10 +15,10 @@
 	unsigned char sha1[20], oldsha1[20];
 	int delete = 0, no_deref = 0, flags = 0;
 	struct option options[] = {
-		OPT_STRING( 'm', NULL, &msg, "reason", "reason of the update"),
-		OPT_BOOLEAN('d', NULL, &delete, "deletes the reference"),
+		OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")),
+		OPT_BOOLEAN('d', NULL, &delete, N_("delete the reference")),
 		OPT_BOOLEAN( 0 , "no-deref", &no_deref,
-					"update <refname> not the one it points to"),
+					N_("update <refname> not the one it points to")),
 		OPT_END(),
 	};
 
diff --git a/builtin/update-server-info.c b/builtin/update-server-info.c
index 0d63c44..6c8cc3e 100644
--- a/builtin/update-server-info.c
+++ b/builtin/update-server-info.c
@@ -3,7 +3,7 @@
 #include "parse-options.h"
 
 static const char * const update_server_info_usage[] = {
-	"git update-server-info [--force]",
+	N_("git update-server-info [--force]"),
 	NULL
 };
 
@@ -11,7 +11,7 @@
 {
 	int force = 0;
 	struct option options[] = {
-		OPT__FORCE(&force, "update the info files from scratch"),
+		OPT__FORCE(&force, N_("update the info files from scratch")),
 		OPT_END()
 	};
 
diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c
index e841b4a..66cd2df 100644
--- a/builtin/verify-pack.c
+++ b/builtin/verify-pack.c
@@ -53,7 +53,7 @@
 }
 
 static const char * const verify_pack_usage[] = {
-	"git verify-pack [-v|--verbose] [-s|--stat-only] <pack>...",
+	N_("git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."),
 	NULL
 };
 
@@ -63,9 +63,9 @@
 	unsigned int flags = 0;
 	int i;
 	const struct option verify_pack_options[] = {
-		OPT_BIT('v', "verbose", &flags, "verbose",
+		OPT_BIT('v', "verbose", &flags, N_("verbose"),
 			VERIFY_PACK_VERBOSE),
-		OPT_BIT('s', "stat-only", &flags, "show statistics only",
+		OPT_BIT('s', "stat-only", &flags, N_("show statistics only"),
 			VERIFY_PACK_STAT_ONLY),
 		OPT_END()
 	};
diff --git a/builtin/verify-tag.c b/builtin/verify-tag.c
index 986789f..a8eee88 100644
--- a/builtin/verify-tag.c
+++ b/builtin/verify-tag.c
@@ -14,7 +14,7 @@
 #include "gpg-interface.h"
 
 static const char * const verify_tag_usage[] = {
-		"git verify-tag [-v|--verbose] <tag>...",
+		N_("git verify-tag [-v|--verbose] <tag>..."),
 		NULL
 };
 
@@ -70,7 +70,7 @@
 {
 	int i = 1, verbose = 0, had_error = 0;
 	const struct option verify_tag_options[] = {
-		OPT__VERBOSE(&verbose, "print tag contents"),
+		OPT__VERBOSE(&verbose, N_("print tag contents")),
 		OPT_END()
 	};
 
diff --git a/builtin/write-tree.c b/builtin/write-tree.c
index b223af4..084c0df 100644
--- a/builtin/write-tree.c
+++ b/builtin/write-tree.c
@@ -10,7 +10,7 @@
 #include "parse-options.h"
 
 static const char * const write_tree_usage[] = {
-	"git write-tree [--missing-ok] [--prefix=<prefix>/]",
+	N_("git write-tree [--missing-ok] [--prefix=<prefix>/]"),
 	NULL
 };
 
@@ -21,13 +21,13 @@
 	unsigned char sha1[20];
 	const char *me = "git-write-tree";
 	struct option write_tree_options[] = {
-		OPT_BIT(0, "missing-ok", &flags, "allow missing objects",
+		OPT_BIT(0, "missing-ok", &flags, N_("allow missing objects"),
 			WRITE_TREE_MISSING_OK),
-		{ OPTION_STRING, 0, "prefix", &prefix, "<prefix>/",
-		  "write tree object for a subdirectory <prefix>" ,
+		{ OPTION_STRING, 0, "prefix", &prefix, N_("<prefix>/"),
+		  N_("write tree object for a subdirectory <prefix>") ,
 		  PARSE_OPT_LITERAL_ARGHELP },
 		{ OPTION_BIT, 0, "ignore-cache-tree", &flags, NULL,
-		  "only useful for debugging",
+		  N_("only useful for debugging"),
 		  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, NULL,
 		  WRITE_TREE_IGNORE_CACHE_TREE },
 		OPT_END()
diff --git a/cache.h b/cache.h
index eb4a031..a58df84 100644
--- a/cache.h
+++ b/cache.h
@@ -442,7 +442,6 @@
 extern int unmerged_index(const struct index_state *);
 extern int verify_path(const char *path);
 extern struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int igncase);
-extern int index_name_stage_pos(const struct index_state *, const char *name, int namelen, int stage);
 extern int index_name_pos(const struct index_state *, const char *name, int namelen);
 #define ADD_CACHE_OK_TO_ADD 1		/* Ok to add */
 #define ADD_CACHE_OK_TO_REPLACE 2	/* Ok to replace file/directory */
@@ -902,9 +901,7 @@
 extern const char *git_committer_info(int);
 extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int);
 extern const char *fmt_name(const char *name, const char *email);
-extern const char *ident_default_name(void);
 extern const char *ident_default_email(void);
-extern const char *ident_default_date(void);
 extern const char *git_editor(void);
 extern const char *git_pager(int stdout_is_tty);
 extern int git_ident_config(const char *, const char *, void *);
@@ -947,9 +944,7 @@
 extern int has_symlink_leading_path(const char *name, int len);
 extern int threaded_has_symlink_leading_path(struct cache_def *, const char *, int);
 extern int check_leading_path(const char *name, int len);
-extern int threaded_check_leading_path(struct cache_def *cache, const char *name, int len);
 extern int has_dirs_only_path(const char *name, int len, int prefix_len);
-extern int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len);
 extern void schedule_dir_for_removal(const char *name, int len);
 extern void remove_scheduled_dirs(void);
 
@@ -1208,7 +1203,6 @@
 /* trace.c */
 __attribute__((format (printf, 1, 2)))
 extern void trace_printf(const char *format, ...);
-extern void trace_vprintf(const char *key, const char *format, va_list ap);
 __attribute__((format (printf, 2, 3)))
 extern void trace_argv_printf(const char **argv, const char *format, ...);
 extern void trace_repo_setup(const char *prefix);
diff --git a/commit.c b/commit.c
index 42af4c1..0246767 100644
--- a/commit.c
+++ b/commit.c
@@ -9,6 +9,8 @@
 #include "gpg-interface.h"
 #include "mergesort.h"
 
+static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
+
 int save_commit_buffer = 1;
 
 const char *commit_type = "commit";
@@ -607,28 +609,12 @@
 	return NULL;
 }
 
-static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)
+static struct commit_list *paint_down_to_common(struct commit *one, int n, struct commit **twos)
 {
 	struct commit_list *list = NULL;
 	struct commit_list *result = NULL;
 	int i;
 
-	for (i = 0; i < n; i++) {
-		if (one == twos[i])
-			/*
-			 * We do not mark this even with RESULT so we do not
-			 * have to clean it up.
-			 */
-			return commit_list_insert(one, &result);
-	}
-
-	if (parse_commit(one))
-		return NULL;
-	for (i = 0; i < n; i++) {
-		if (parse_commit(twos[i]))
-			return NULL;
-	}
-
 	one->object.flags |= PARENT1;
 	commit_list_insert_by_date(one, &list);
 	for (i = 0; i < n; i++) {
@@ -669,9 +655,34 @@
 		}
 	}
 
-	/* Clean up the result to remove stale ones */
 	free_commit_list(list);
-	list = result; result = NULL;
+	return result;
+}
+
+static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)
+{
+	struct commit_list *list = NULL;
+	struct commit_list *result = NULL;
+	int i;
+
+	for (i = 0; i < n; i++) {
+		if (one == twos[i])
+			/*
+			 * We do not mark this even with RESULT so we do not
+			 * have to clean it up.
+			 */
+			return commit_list_insert(one, &result);
+	}
+
+	if (parse_commit(one))
+		return NULL;
+	for (i = 0; i < n; i++) {
+		if (parse_commit(twos[i]))
+			return NULL;
+	}
+
+	list = paint_down_to_common(one, n, twos);
+
 	while (list) {
 		struct commit_list *next = list->next;
 		if (!(list->item->object.flags & STALE))
@@ -709,6 +720,60 @@
 	return ret;
 }
 
+static int remove_redundant(struct commit **array, int cnt)
+{
+	/*
+	 * Some commit in the array may be an ancestor of
+	 * another commit.  Move such commit to the end of
+	 * the array, and return the number of commits that
+	 * are independent from each other.
+	 */
+	struct commit **work;
+	unsigned char *redundant;
+	int *filled_index;
+	int i, j, filled;
+
+	work = xcalloc(cnt, sizeof(*work));
+	redundant = xcalloc(cnt, 1);
+	filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));
+
+	for (i = 0; i < cnt; i++) {
+		struct commit_list *common;
+
+		if (redundant[i])
+			continue;
+		for (j = filled = 0; j < cnt; j++) {
+			if (i == j || redundant[j])
+				continue;
+			filled_index[filled] = j;
+			work[filled++] = array[j];
+		}
+		common = paint_down_to_common(array[i], filled, work);
+		if (array[i]->object.flags & PARENT2)
+			redundant[i] = 1;
+		for (j = 0; j < filled; j++)
+			if (work[j]->object.flags & PARENT1)
+				redundant[filled_index[j]] = 1;
+		clear_commit_marks(array[i], all_flags);
+		for (j = 0; j < filled; j++)
+			clear_commit_marks(work[j], all_flags);
+		free_commit_list(common);
+	}
+
+	/* Now collect the result */
+	memcpy(work, array, sizeof(*array) * cnt);
+	for (i = filled = 0; i < cnt; i++)
+		if (!redundant[i])
+			array[filled++] = work[i];
+	for (j = filled, i = 0; i < cnt; i++)
+		if (redundant[i])
+			array[j++] = work[i];
+	free(work);
+	free(redundant);
+	free(filled_index);
+	return filled;
+}
+
 struct commit_list *get_merge_bases_many(struct commit *one,
 					 int n,
 					 struct commit **twos,
@@ -717,7 +782,7 @@
 	struct commit_list *list;
 	struct commit **rslt;
 	struct commit_list *result;
-	int cnt, i, j;
+	int cnt, i;
 
 	result = merge_bases_many(one, n, twos);
 	for (i = 0; i < n; i++) {
@@ -748,28 +813,11 @@
 	clear_commit_marks(one, all_flags);
 	for (i = 0; i < n; i++)
 		clear_commit_marks(twos[i], all_flags);
-	for (i = 0; i < cnt - 1; i++) {
-		for (j = i+1; j < cnt; j++) {
-			if (!rslt[i] || !rslt[j])
-				continue;
-			result = merge_bases_many(rslt[i], 1, &rslt[j]);
-			clear_commit_marks(rslt[i], all_flags);
-			clear_commit_marks(rslt[j], all_flags);
-			for (list = result; list; list = list->next) {
-				if (rslt[i] == list->item)
-					rslt[i] = NULL;
-				if (rslt[j] == list->item)
-					rslt[j] = NULL;
-			}
-		}
-	}
 
-	/* Surviving ones in rslt[] are the independent results */
+	cnt = remove_redundant(rslt, cnt);
 	result = NULL;
-	for (i = 0; i < cnt; i++) {
-		if (rslt[i])
-			commit_list_insert_by_date(rslt[i], &result);
-	}
+	for (i = 0; i < cnt; i++)
+		commit_list_insert_by_date(rslt[i], &result);
 	free(rslt);
 	return result;
 }
@@ -780,6 +828,9 @@
 	return get_merge_bases_many(one, 1, &two, cleanup);
 }
 
+/*
+ * Is "commit" a decendant of one of the elements on the "with_commit" list?
+ */
 int is_descendant_of(struct commit *commit, struct commit_list *with_commit)
 {
 	if (!with_commit)
@@ -789,28 +840,28 @@
 
 		other = with_commit->item;
 		with_commit = with_commit->next;
-		if (in_merge_bases(other, &commit, 1))
+		if (in_merge_bases(other, commit))
 			return 1;
 	}
 	return 0;
 }
 
-int in_merge_bases(struct commit *commit, struct commit **reference, int num)
+/*
+ * Is "commit" an ancestor of (i.e. reachable from) the "reference"?
+ */
+int in_merge_bases(struct commit *commit, struct commit *reference)
 {
-	struct commit_list *bases, *b;
+	struct commit_list *bases;
 	int ret = 0;
 
-	if (num == 1)
-		bases = get_merge_bases(commit, *reference, 1);
-	else
-		die("not yet");
-	for (b = bases; b; b = b->next) {
-		if (!hashcmp(commit->object.sha1, b->item->object.sha1)) {
-			ret = 1;
-			break;
-		}
-	}
+	if (parse_commit(commit) || parse_commit(reference))
+		return ret;
 
+	bases = paint_down_to_common(commit, 1, &reference);
+	if (commit->object.flags & PARENT2)
+		ret = 1;
+	clear_commit_marks(commit, all_flags);
+	clear_commit_marks(reference, all_flags);
 	free_commit_list(bases);
 	return ret;
 }
@@ -819,51 +870,31 @@
 {
 	struct commit_list *p;
 	struct commit_list *result = NULL, **tail = &result;
-	struct commit **other;
-	size_t num_head, num_other;
+	struct commit **array;
+	int num_head, i;
 
 	if (!heads)
 		return NULL;
 
-	/* Avoid unnecessary reallocations */
-	for (p = heads, num_head = 0; p; p = p->next)
-		num_head++;
-	other = xcalloc(sizeof(*other), num_head);
-
-	/* For each commit, see if it can be reached by others */
-	for (p = heads; p; p = p->next) {
-		struct commit_list *q, *base;
-
-		/* Do we already have this in the result? */
-		for (q = result; q; q = q->next)
-			if (p->item == q->item)
-				break;
-		if (q)
+	/* Uniquify */
+	for (p = heads; p; p = p->next)
+		p->item->object.flags &= ~STALE;
+	for (p = heads, num_head = 0; p; p = p->next) {
+		if (p->item->object.flags & STALE)
 			continue;
-
-		num_other = 0;
-		for (q = heads; q; q = q->next) {
-			if (p->item == q->item)
-				continue;
-			other[num_other++] = q->item;
-		}
-		if (num_other)
-			base = get_merge_bases_many(p->item, num_other, other, 1);
-		else
-			base = NULL;
-		/*
-		 * If p->item does not have anything common with other
-		 * commits, there won't be any merge base.  If it is
-		 * reachable from some of the others, p->item will be
-		 * the merge base.  If its history is connected with
-		 * others, but p->item is not reachable by others, we
-		 * will get something other than p->item back.
-		 */
-		if (!base || (base->item != p->item))
-			tail = &(commit_list_insert(p->item, tail)->next);
-		free_commit_list(base);
+		p->item->object.flags |= STALE;
+		num_head++;
 	}
-	free(other);
+	array = xcalloc(sizeof(*array), num_head);
+	for (p = heads, i = 0; p; p = p->next) {
+		if (p->item->object.flags & STALE) {
+			array[i++] = p->item;
+			p->item->object.flags &= ~STALE;
+		}
+	}
+	num_head = remove_redundant(array, num_head);
+	for (i = 0; i < num_head; i++)
+		tail = &commit_list_insert(array[i], tail)->next;
 	return result;
 }
 
@@ -1044,8 +1075,9 @@
 	return 0;
 }
 
-struct commit_extra_header *read_commit_extra_header_lines(const char *buffer, size_t size,
-							   const char **exclude)
+static struct commit_extra_header *read_commit_extra_header_lines(
+	const char *buffer, size_t size,
+	const char **exclude)
 {
 	struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL;
 	const char *line, *next, *eof, *eob;
@@ -1112,8 +1144,92 @@
 	return result;
 }
 
+static int find_invalid_utf8(const char *buf, int len)
+{
+	int offset = 0;
+
+	while (len) {
+		unsigned char c = *buf++;
+		int bytes, bad_offset;
+
+		len--;
+		offset++;
+
+		/* Simple US-ASCII? No worries. */
+		if (c < 0x80)
+			continue;
+
+		bad_offset = offset-1;
+
+		/*
+		 * Count how many more high bits set: that's how
+		 * many more bytes this sequence should have.
+		 */
+		bytes = 0;
+		while (c & 0x40) {
+			c <<= 1;
+			bytes++;
+		}
+
+		/* Must be between 1 and 5 more bytes */
+		if (bytes < 1 || bytes > 5)
+			return bad_offset;
+
+		/* Do we *have* that many bytes? */
+		if (len < bytes)
+			return bad_offset;
+
+		offset += bytes;
+		len -= bytes;
+
+		/* And verify that they are good continuation bytes */
+		do {
+			if ((*buf++ & 0xc0) != 0x80)
+				return bad_offset;
+		} while (--bytes);
+
+		/* We could/should check the value and length here too */
+	}
+	return -1;
+}
+
+/*
+ * This verifies that the buffer is in proper utf8 format.
+ *
+ * If it isn't, it assumes any non-utf8 characters are Latin1,
+ * and does the conversion.
+ *
+ * Fixme: we should probably also disallow overlong forms and
+ * invalid characters. But we don't do that currently.
+ */
+static int verify_utf8(struct strbuf *buf)
+{
+	int ok = 1;
+	long pos = 0;
+
+	for (;;) {
+		int bad;
+		unsigned char c;
+		unsigned char replace[2];
+
+		bad = find_invalid_utf8(buf->buf + pos, buf->len - pos);
+		if (bad < 0)
+			return ok;
+		pos += bad;
+		ok = 0;
+		c = buf->buf[pos];
+		strbuf_remove(buf, pos, 1);
+
+		/* We know 'c' must be in the range 128-255 */
+		replace[0] = 0xc0 + (c >> 6);
+		replace[1] = 0x80 + (c & 0x3f);
+		strbuf_insert(buf, pos, replace, 2);
+		pos += 2;
+	}
+}
+
 static const char commit_utf8_warn[] =
-"Warning: commit message does not conform to UTF-8.\n"
+"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"
 "variable i18n.commitencoding to the encoding your project uses.\n";
 
@@ -1170,7 +1286,7 @@
 	strbuf_addbuf(&buffer, msg);
 
 	/* And check the encoding */
-	if (encoding_is_utf8 && !is_utf8(buffer.buf))
+	if (encoding_is_utf8 && !verify_utf8(&buffer))
 		fprintf(stderr, commit_utf8_warn);
 
 	if (sign_commit && do_sign_commit(&buffer, sign_commit))
diff --git a/commit.h b/commit.h
index d617fa3..9f21313 100644
--- a/commit.h
+++ b/commit.h
@@ -171,7 +171,7 @@
 		int depth, int shallow_flag, int not_shallow_flag);
 
 int is_descendant_of(struct commit *, struct commit_list *);
-int in_merge_bases(struct commit *, struct commit **, int);
+int in_merge_bases(struct commit *, struct commit *);
 
 extern int interactive_add(int argc, const char **argv, const char *prefix, int patch);
 extern int run_add_interactive(const char *revision, const char *patch_mode,
@@ -204,7 +204,6 @@
 				struct commit_extra_header *);
 
 extern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);
-extern struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
 
 extern void free_commit_extra_headers(struct commit_extra_header *extra);
 
diff --git a/compat/mkdir.c b/compat/mkdir.c
new file mode 100644
index 0000000..9e253fb
--- /dev/null
+++ b/compat/mkdir.c
@@ -0,0 +1,24 @@
+#include "../git-compat-util.h"
+#undef mkdir
+
+/* for platforms that can't deal with a trailing '/' */
+int compat_mkdir_wo_trailing_slash(const char *dir, mode_t mode)
+{
+	int retval;
+	char *tmp_dir = NULL;
+	size_t len = strlen(dir);
+
+	if (len && dir[len-1] == '/') {
+		if ((tmp_dir = strdup(dir)) == NULL)
+			return -1;
+		tmp_dir[len-1] = '\0';
+	}
+	else
+		tmp_dir = (char *)dir;
+
+	retval = mkdir(tmp_dir, mode);
+	if (tmp_dir != dir)
+		free(tmp_dir);
+
+	return retval;
+}
diff --git a/compat/win32/poll.c b/compat/poll/poll.c
similarity index 97%
rename from compat/win32/poll.c
rename to compat/poll/poll.c
index 403eaa7..7d226ec 100644
--- a/compat/win32/poll.c
+++ b/compat/poll/poll.c
@@ -24,7 +24,9 @@
 # pragma GCC diagnostic ignored "-Wtype-limits"
 #endif
 
-#include <malloc.h>
+#if defined(WIN32)
+# include <malloc.h>
+#endif
 
 #include <sys/types.h>
 
@@ -48,7 +50,9 @@
 #else
 # include <sys/time.h>
 # include <sys/socket.h>
-# include <sys/select.h>
+# ifndef NO_SYS_SELECT_H
+#  include <sys/select.h>
+# endif
 # include <unistd.h>
 #endif
 
@@ -302,6 +306,10 @@
 	       || socket_errno == ECONNABORTED || socket_errno == ENETRESET)
 	happened |= POLLHUP;
 
+      /* some systems can't use recv() on non-socket, including HP NonStop */
+      else if (/* (r == -1) && */ socket_errno == ENOTSOCK)
+	happened |= (POLLIN | POLLRDNORM) & sought;
+
       else
 	happened |= POLLERR;
     }
@@ -349,7 +357,7 @@
 
   /* EFAULT is not necessary to implement, but let's do it in the
      simplest case. */
-  if (!pfd)
+  if (!pfd && nfd)
     {
       errno = EFAULT;
       return -1;
diff --git a/compat/win32/poll.h b/compat/poll/poll.h
similarity index 100%
rename from compat/win32/poll.h
rename to compat/poll/poll.h
diff --git a/config.mak.in b/config.mak.in
index 802d342..69d4838 100644
--- a/config.mak.in
+++ b/config.mak.in
@@ -5,12 +5,10 @@
 CFLAGS = @CFLAGS@
 CPPFLAGS = @CPPFLAGS@
 LDFLAGS = @LDFLAGS@
-CC_LD_DYNPATH = @CC_LD_DYNPATH@
 AR = @AR@
 TAR = @TAR@
 DIFF = @DIFF@
 #INSTALL = @INSTALL@		# needs install-sh or install.sh in sources
-TCLTK_PATH = @TCLTK_PATH@
 
 prefix = @prefix@
 exec_prefix = @exec_prefix@
@@ -27,50 +25,3 @@
 
 export exec_prefix mandir
 export srcdir VPATH
-
-NEEDS_SSL_WITH_CRYPTO=@NEEDS_SSL_WITH_CRYPTO@
-NO_OPENSSL=@NO_OPENSSL@
-NO_CURL=@NO_CURL@
-NO_EXPAT=@NO_EXPAT@
-NO_LIBGEN_H=@NO_LIBGEN_H@
-HAVE_PATHS_H=@HAVE_PATHS_H@
-HAVE_LIBCHARSET_H=@HAVE_LIBCHARSET_H@
-NO_GETTEXT=@NO_GETTEXT@
-LIBC_CONTAINS_LIBINTL=@LIBC_CONTAINS_LIBINTL@
-NEEDS_LIBICONV=@NEEDS_LIBICONV@
-NEEDS_SOCKET=@NEEDS_SOCKET@
-NEEDS_RESOLV=@NEEDS_RESOLV@
-NEEDS_LIBGEN=@NEEDS_LIBGEN@
-NO_SYS_SELECT_H=@NO_SYS_SELECT_H@
-NO_D_INO_IN_DIRENT=@NO_D_INO_IN_DIRENT@
-NO_D_TYPE_IN_DIRENT=@NO_D_TYPE_IN_DIRENT@
-NO_SOCKADDR_STORAGE=@NO_SOCKADDR_STORAGE@
-NO_IPV6=@NO_IPV6@
-NO_HSTRERROR=@NO_HSTRERROR@
-NO_STRCASESTR=@NO_STRCASESTR@
-NO_STRTOK_R=@NO_STRTOK_R@
-NO_FNMATCH=@NO_FNMATCH@
-NO_FNMATCH_CASEFOLD=@NO_FNMATCH_CASEFOLD@
-NO_MEMMEM=@NO_MEMMEM@
-NO_STRLCPY=@NO_STRLCPY@
-NO_UINTMAX_T=@NO_UINTMAX_T@
-NO_STRTOUMAX=@NO_STRTOUMAX@
-NO_SETENV=@NO_SETENV@
-NO_UNSETENV=@NO_UNSETENV@
-NO_MKDTEMP=@NO_MKDTEMP@
-NO_MKSTEMPS=@NO_MKSTEMPS@
-NO_INET_NTOP=@NO_INET_NTOP@
-NO_INET_PTON=@NO_INET_PTON@
-NO_ICONV=@NO_ICONV@
-OLD_ICONV=@OLD_ICONV@
-NO_REGEX=@NO_REGEX@
-USE_LIBPCRE=@USE_LIBPCRE@
-NO_DEFLATE_BOUND=@NO_DEFLATE_BOUND@
-INLINE=@INLINE@
-SOCKLEN_T=@SOCKLEN_T@
-FREAD_READS_DIRECTORIES=@FREAD_READS_DIRECTORIES@
-SNPRINTF_RETURNS_BOGUS=@SNPRINTF_RETURNS_BOGUS@
-NO_PTHREADS=@NO_PTHREADS@
-PTHREAD_CFLAGS=@PTHREAD_CFLAGS@
-PTHREAD_LIBS=@PTHREAD_LIBS@
-CHARSET_LIB=@CHARSET_LIB@
diff --git a/configure.ac b/configure.ac
index df7e376..da1f41f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7,8 +7,9 @@
 # ------------------------
 # Cause the line "VAR=VAL" to be eventually appended to ${config_file}.
 AC_DEFUN([GIT_CONF_SUBST],
-   [AC_REQUIRE([GIT_CONF_SUBST_INIT])
-   config_appended_defs="$config_appended_defs${newline}$1=$2"])
+[AC_REQUIRE([GIT_CONF_SUBST_INIT])
+config_appended_defs="$config_appended_defs${newline}dnl
+$1=m4_if([$#],[1],[${$1}],[$2])"])
 
 # GIT_CONF_SUBST_INIT
 # -------------------
@@ -179,7 +180,7 @@
   else
 	lib=$withval
 	AC_MSG_NOTICE([Setting lib to '$lib'])
-	GIT_CONF_SUBST([lib], [$withval])
+	GIT_CONF_SUBST([lib])
   fi])
 
 if test -z "$lib"; then
@@ -215,7 +216,7 @@
 [
   JSMIN=$enableval;
   AC_MSG_NOTICE([Setting JSMIN to '$JSMIN' to enable JavaScript minifying])
-  GIT_CONF_SUBST([JSMIN], [$enableval])
+  GIT_CONF_SUBST([JSMIN])
 ])
 
 # Define option to enable CSS minification
@@ -225,7 +226,7 @@
 [
   CSSMIN=$enableval;
   AC_MSG_NOTICE([Setting CSSMIN to '$CSSMIN' to enable CSS minifying])
-  GIT_CONF_SUBST([CSSMIN], [$enableval])
+  GIT_CONF_SUBST([CSSMIN])
 ])
 
 ## Site configuration (override autodetection)
@@ -265,8 +266,10 @@
     else
 	USE_LIBPCRE=YesPlease
 	LIBPCREDIR=$withval
-	AC_MSG_NOTICE([Setting LIBPCREDIR to $withval])
-	GIT_CONF_SUBST([LIBPCREDIR], [$withval])
+	AC_MSG_NOTICE([Setting LIBPCREDIR to $LIBPCREDIR])
+        dnl USE_LIBPCRE can still be modified below, so don't substitute
+        dnl it yet.
+	GIT_CONF_SUBST([LIBPCREDIR])
     fi)
 #
 # Define NO_CURL if you do not have curl installed.  git-http-pull and
@@ -386,9 +389,10 @@
 AC_PROG_CC([cc gcc])
 AC_C_INLINE
 case $ac_cv_c_inline in
-  inline | yes | no)	;;
-  *)			AC_SUBST([INLINE], [$ac_cv_c_inline]) ;;
+  inline | yes | no) INLINE='';;
+  *)                 INLINE=$ac_cv_c_inline ;;
 esac
+GIT_CONF_SUBST([INLINE])
 
 # which switch to pass runtime path to dynamic libraries to the linker
 AC_CACHE_CHECK([if linker supports -R], git_cv_ld_dashr, [
@@ -398,7 +402,7 @@
    LDFLAGS="${SAVE_LDFLAGS}"
 ])
 if test "$git_cv_ld_dashr" = "yes"; then
-   AC_SUBST(CC_LD_DYNPATH, [-R])
+   CC_LD_DYNPATH=-R
 else
    AC_CACHE_CHECK([if linker supports -Wl,-rpath,], git_cv_ld_wl_rpath, [
       SAVE_LDFLAGS="${LDFLAGS}"
@@ -407,7 +411,7 @@
       LDFLAGS="${SAVE_LDFLAGS}"
    ])
    if test "$git_cv_ld_wl_rpath" = "yes"; then
-      AC_SUBST(CC_LD_DYNPATH, [-Wl,-rpath,])
+      CC_LD_DYNPATH=-Wl,-rpath
    else
       AC_CACHE_CHECK([if linker supports -rpath], git_cv_ld_rpath, [
          SAVE_LDFLAGS="${LDFLAGS}"
@@ -416,32 +420,35 @@
          LDFLAGS="${SAVE_LDFLAGS}"
       ])
       if test "$git_cv_ld_rpath" = "yes"; then
-         AC_SUBST(CC_LD_DYNPATH, [-rpath])
+         CC_LD_DYNPATH=-rpath
       else
+         CC_LD_DYNPATH=
          AC_MSG_WARN([linker does not support runtime path to dynamic libraries])
       fi
    fi
 fi
+GIT_CONF_SUBST([CC_LD_DYNPATH])
 #AC_PROG_INSTALL		# needs install-sh or install.sh in sources
 AC_CHECK_TOOLS(AR, [gar ar], :)
 AC_CHECK_PROGS(TAR, [gtar tar])
 AC_CHECK_PROGS(DIFF, [gnudiff gdiff diff])
 # TCLTK_PATH will be set to some value if we want Tcl/Tk
 # or will be empty otherwise.
-if test -z "$NO_TCLTK"; then
+if test -n "$NO_TCLTK"; then
+  TCLTK_PATH=
+else
   if test "$with_tcltk" = ""; then
   # No Tcl/Tk switches given. Do not check for Tcl/Tk, use bare 'wish'.
     TCLTK_PATH=wish
-    AC_SUBST(TCLTK_PATH)
   elif test "$with_tcltk" = "yes"; then
   # Tcl/Tk check requested.
     AC_CHECK_PROGS(TCLTK_PATH, [wish], )
   else
     AC_MSG_RESULT([Using Tcl/Tk interpreter $with_tcltk])
     TCLTK_PATH="$with_tcltk"
-    AC_SUBST(TCLTK_PATH)
   fi
 fi
+GIT_CONF_SUBST([TCLTK_PATH])
 AC_CHECK_PROGS(ASCIIDOC, [asciidoc])
 if test -n "$ASCIIDOC"; then
 	AC_MSG_CHECKING([for asciidoc version])
@@ -468,13 +475,13 @@
 AC_CHECK_LIB([crypto], [SHA1_Init],
 [NEEDS_SSL_WITH_CRYPTO=],
 [AC_CHECK_LIB([ssl], [SHA1_Init],
- [NEEDS_SSL_WITH_CRYPTO=YesPlease],
- [NEEDS_SSL_WITH_CRYPTO= NO_OPENSSL=YesPlease])])
+ [NEEDS_SSL_WITH_CRYPTO=YesPlease NO_OPENSSL=],
+ [NEEDS_SSL_WITH_CRYPTO=          NO_OPENSSL=YesPlease])])
 
 GIT_UNSTASH_FLAGS($OPENSSLDIR)
 
-AC_SUBST(NEEDS_SSL_WITH_CRYPTO)
-AC_SUBST(NO_OPENSSL)
+GIT_CONF_SUBST([NEEDS_SSL_WITH_CRYPTO])
+GIT_CONF_SUBST([NO_OPENSSL])
 
 #
 # Define USE_LIBPCRE if you have and want to use libpcre. git-grep will be
@@ -491,7 +498,7 @@
 
 GIT_UNSTASH_FLAGS($LIBPCREDIR)
 
-AC_SUBST(USE_LIBPCRE)
+GIT_CONF_SUBST([USE_LIBPCRE])
 
 fi
 
@@ -508,7 +515,7 @@
 
 GIT_UNSTASH_FLAGS($CURLDIR)
 
-AC_SUBST(NO_CURL)
+GIT_CONF_SUBST([NO_CURL])
 
 #
 # Define NO_EXPAT if you do not have expat installed.  git-http-push is
@@ -522,7 +529,7 @@
 
 GIT_UNSTASH_FLAGS($EXPATDIR)
 
-AC_SUBST(NO_EXPAT)
+GIT_CONF_SUBST([NO_EXPAT])
 
 #
 # Define NEEDS_LIBICONV if linking with libc is not enough (Darwin and
@@ -568,8 +575,8 @@
 
 GIT_UNSTASH_FLAGS($ICONVDIR)
 
-AC_SUBST(NEEDS_LIBICONV)
-AC_SUBST(NO_ICONV)
+GIT_CONF_SUBST([NEEDS_LIBICONV])
+GIT_CONF_SUBST([NO_ICONV])
 
 if test -n "$NO_ICONV"; then
     NEEDS_LIBICONV=
@@ -596,7 +603,7 @@
 
 GIT_UNSTASH_FLAGS($ZLIB_PATH)
 
-AC_SUBST(NO_DEFLATE_BOUND)
+GIT_CONF_SUBST([NO_DEFLATE_BOUND])
 
 #
 # Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
@@ -604,7 +611,7 @@
 AC_CHECK_LIB([c], [socket],
 [NEEDS_SOCKET=],
 [NEEDS_SOCKET=YesPlease])
-AC_SUBST(NEEDS_SOCKET)
+GIT_CONF_SUBST([NEEDS_SOCKET])
 test -n "$NEEDS_SOCKET" && LIBS="$LIBS -lsocket"
 
 #
@@ -612,40 +619,43 @@
 # libresolv provides some of the functions we would normally get
 # from libc.
 NEEDS_RESOLV=
-AC_SUBST(NEEDS_RESOLV)
 #
 # Define NO_INET_NTOP if linking with -lresolv is not enough.
 # Solaris 2.7 in particular hos inet_ntop in -lresolv.
 NO_INET_NTOP=
-AC_SUBST(NO_INET_NTOP)
 AC_CHECK_FUNC([inet_ntop],
-	[],
+    [],
     [AC_CHECK_LIB([resolv], [inet_ntop],
-	    [NEEDS_RESOLV=YesPlease],
+	[NEEDS_RESOLV=YesPlease],
 	[NO_INET_NTOP=YesPlease])
 ])
+GIT_CONF_SUBST([NO_INET_NTOP])
 #
 # Define NO_INET_PTON if linking with -lresolv is not enough.
 # Solaris 2.7 in particular hos inet_pton in -lresolv.
 NO_INET_PTON=
-AC_SUBST(NO_INET_PTON)
 AC_CHECK_FUNC([inet_pton],
-	[],
+    [],
     [AC_CHECK_LIB([resolv], [inet_pton],
-	    [NEEDS_RESOLV=YesPlease],
+	[NEEDS_RESOLV=YesPlease],
 	[NO_INET_PTON=YesPlease])
 ])
+GIT_CONF_SUBST([NO_INET_PTON])
 #
 # Define NO_HSTRERROR if linking with -lresolv is not enough.
 # Solaris 2.6 in particular has no hstrerror, even in -lresolv.
 NO_HSTRERROR=
 AC_CHECK_FUNC([hstrerror],
-	[],
+    [],
     [AC_CHECK_LIB([resolv], [hstrerror],
-	    [NEEDS_RESOLV=YesPlease],
+	[NEEDS_RESOLV=YesPlease],
 	[NO_HSTRERROR=YesPlease])
 ])
-AC_SUBST(NO_HSTRERROR)
+GIT_CONF_SUBST([NO_HSTRERROR])
+
+dnl This must go after all the possible places for its initialization,
+dnl in the AC_CHECK_FUNC invocations above.
+GIT_CONF_SUBST([NEEDS_RESOLV])
 #
 # If any of the above tests determined that -lresolv is needed at
 # build-time, also set it here for remaining configure-time checks.
@@ -654,13 +664,13 @@
 AC_CHECK_LIB([c], [basename],
 [NEEDS_LIBGEN=],
 [NEEDS_LIBGEN=YesPlease])
-AC_SUBST(NEEDS_LIBGEN)
+GIT_CONF_SUBST([NEEDS_LIBGEN])
 test -n "$NEEDS_LIBGEN" && LIBS="$LIBS -lgen"
 
 AC_CHECK_LIB([c], [gettext],
 [LIBC_CONTAINS_LIBINTL=YesPlease],
 [LIBC_CONTAINS_LIBINTL=])
-AC_SUBST(LIBC_CONTAINS_LIBINTL)
+GIT_CONF_SUBST([LIBC_CONTAINS_LIBINTL])
 
 #
 # Define NO_GETTEXT if you don't want Git output to be translated.
@@ -668,7 +678,7 @@
 AC_CHECK_HEADER([libintl.h],
 [NO_GETTEXT=],
 [NO_GETTEXT=YesPlease])
-AC_SUBST(NO_GETTEXT)
+GIT_CONF_SUBST([NO_GETTEXT])
 
 if test -z "$NO_GETTEXT"; then
     test -n "$LIBC_CONTAINS_LIBINTL" || LIBS="$LIBS -lintl"
@@ -681,19 +691,19 @@
 AC_CHECK_HEADER([sys/select.h],
 [NO_SYS_SELECT_H=],
 [NO_SYS_SELECT_H=UnfortunatelyYes])
-AC_SUBST(NO_SYS_SELECT_H)
+GIT_CONF_SUBST([NO_SYS_SELECT_H])
 #
 # Define NO_SYS_POLL_H if you don't have sys/poll.h
 AC_CHECK_HEADER([sys/poll.h],
 [NO_SYS_POLL_H=],
 [NO_SYS_POLL_H=UnfortunatelyYes])
-AC_SUBST(NO_SYS_POLL_H)
+GIT_CONF_SUBST([NO_SYS_POLL_H])
 #
 # Define NO_INTTYPES_H if you don't have inttypes.h
 AC_CHECK_HEADER([inttypes.h],
 [NO_INTTYPES_H=],
 [NO_INTTYPES_H=UnfortunatelyYes])
-AC_SUBST(NO_INTTYPES_H)
+GIT_CONF_SUBST([NO_INTTYPES_H])
 #
 # Define OLD_ICONV if your library has an old iconv(), where the second
 # (input buffer pointer) parameter is declared with type (const char **).
@@ -716,23 +726,24 @@
 
 GIT_UNSTASH_FLAGS($ICONVDIR)
 
-AC_SUBST(OLD_ICONV)
+GIT_CONF_SUBST([OLD_ICONV])
 
 ## Checks for typedefs, structures, and compiler characteristics.
 AC_MSG_NOTICE([CHECKS for typedefs, structures, and compiler characteristics])
 #
 TYPE_SOCKLEN_T
 case $ac_cv_type_socklen_t in
-  yes)	;;
-  *)  	AC_SUBST([SOCKLEN_T], [$git_cv_socklen_t_equiv]) ;;
+  yes)	SOCKLEN_T='';;
+  *)  	SOCKLEN_T=$git_cv_socklen_t_equiv;;
 esac
+GIT_CONF_SUBST([SOCKLEN_T])
 
 # Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
 AC_CHECK_MEMBER(struct dirent.d_ino,
 [NO_D_INO_IN_DIRENT=],
 [NO_D_INO_IN_DIRENT=YesPlease],
 [#include <dirent.h>])
-AC_SUBST(NO_D_INO_IN_DIRENT)
+GIT_CONF_SUBST([NO_D_INO_IN_DIRENT])
 #
 # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
 # d_type in struct dirent (latest Cygwin -- will be fixed soonish).
@@ -740,7 +751,7 @@
 [NO_D_TYPE_IN_DIRENT=],
 [NO_D_TYPE_IN_DIRENT=YesPlease],
 [#include <dirent.h>])
-AC_SUBST(NO_D_TYPE_IN_DIRENT)
+GIT_CONF_SUBST([NO_D_TYPE_IN_DIRENT])
 #
 # Define NO_SOCKADDR_STORAGE if your platform does not have struct
 # sockaddr_storage.
@@ -750,7 +761,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 ])
-AC_SUBST(NO_SOCKADDR_STORAGE)
+GIT_CONF_SUBST([NO_SOCKADDR_STORAGE])
 #
 # Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
 AC_CHECK_TYPE([struct addrinfo],[
@@ -762,7 +773,7 @@
 #include <sys/socket.h>
 #include <netdb.h>
 ])
-AC_SUBST(NO_IPV6)
+GIT_CONF_SUBST([NO_IPV6])
 #
 # Define NO_REGEX if you have no or inferior regex support in your C library.
 AC_CACHE_CHECK([whether the platform regex can handle null bytes],
@@ -783,7 +794,7 @@
 else
 	NO_REGEX=YesPlease
 fi
-AC_SUBST(NO_REGEX)
+GIT_CONF_SUBST([NO_REGEX])
 #
 # Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
 # when attempting to read from an fopen'ed directory.
@@ -803,7 +814,7 @@
 else
 	FREAD_READS_DIRECTORIES=
 fi
-AC_SUBST(FREAD_READS_DIRECTORIES)
+GIT_CONF_SUBST([FREAD_READS_DIRECTORIES])
 #
 # Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
 # or vsnprintf() return -1 instead of number of characters which would
@@ -837,7 +848,7 @@
 else
 	SNPRINTF_RETURNS_BOGUS=
 fi
-AC_SUBST(SNPRINTF_RETURNS_BOGUS)
+GIT_CONF_SUBST([SNPRINTF_RETURNS_BOGUS])
 
 
 ## Checks for library functions.
@@ -848,47 +859,45 @@
 AC_CHECK_HEADER([libgen.h],
 [NO_LIBGEN_H=],
 [NO_LIBGEN_H=YesPlease])
-AC_SUBST(NO_LIBGEN_H)
+GIT_CONF_SUBST([NO_LIBGEN_H])
 #
 # Define HAVE_PATHS_H if you have paths.h.
 AC_CHECK_HEADER([paths.h],
 [HAVE_PATHS_H=YesPlease],
 [HAVE_PATHS_H=])
-AC_SUBST(HAVE_PATHS_H)
+GIT_CONF_SUBST([HAVE_PATHS_H])
 #
 # Define HAVE_LIBCHARSET_H if have libcharset.h
 AC_CHECK_HEADER([libcharset.h],
 [HAVE_LIBCHARSET_H=YesPlease],
 [HAVE_LIBCHARSET_H=])
-AC_SUBST(HAVE_LIBCHARSET_H)
+GIT_CONF_SUBST([HAVE_LIBCHARSET_H])
 # Define CHARSET_LIB if libiconv does not export the locale_charset symbol
 # and libcharset does
 CHARSET_LIB=
 AC_CHECK_LIB([iconv], [locale_charset],
        [],
        [AC_CHECK_LIB([charset], [locale_charset],
-                     [CHARSET_LIB=-lcharset])
-       ]
-)
-AC_SUBST(CHARSET_LIB)
+                     [CHARSET_LIB=-lcharset])])
+GIT_CONF_SUBST([CHARSET_LIB])
 #
 # Define NO_STRCASESTR if you don't have strcasestr.
 GIT_CHECK_FUNC(strcasestr,
 [NO_STRCASESTR=],
 [NO_STRCASESTR=YesPlease])
-AC_SUBST(NO_STRCASESTR)
+GIT_CONF_SUBST([NO_STRCASESTR])
 #
 # Define NO_STRTOK_R if you don't have strtok_r
 GIT_CHECK_FUNC(strtok_r,
 [NO_STRTOK_R=],
 [NO_STRTOK_R=YesPlease])
-AC_SUBST(NO_STRTOK_R)
+GIT_CONF_SUBST([NO_STRTOK_R])
 #
 # Define NO_FNMATCH if you don't have fnmatch
 GIT_CHECK_FUNC(fnmatch,
 [NO_FNMATCH=],
 [NO_FNMATCH=YesPlease])
-AC_SUBST(NO_FNMATCH)
+GIT_CONF_SUBST([NO_FNMATCH])
 #
 # Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the
 # FNM_CASEFOLD GNU extension.
@@ -910,19 +919,19 @@
 else
 	NO_FNMATCH_CASEFOLD=YesPlease
 fi
-AC_SUBST(NO_FNMATCH_CASEFOLD)
+GIT_CONF_SUBST([NO_FNMATCH_CASEFOLD])
 #
 # Define NO_MEMMEM if you don't have memmem.
 GIT_CHECK_FUNC(memmem,
 [NO_MEMMEM=],
 [NO_MEMMEM=YesPlease])
-AC_SUBST(NO_MEMMEM)
+GIT_CONF_SUBST([NO_MEMMEM])
 #
 # Define NO_STRLCPY if you don't have strlcpy.
 GIT_CHECK_FUNC(strlcpy,
 [NO_STRLCPY=],
 [NO_STRLCPY=YesPlease])
-AC_SUBST(NO_STRLCPY)
+GIT_CONF_SUBST([NO_STRLCPY])
 #
 # Define NO_UINTMAX_T if your platform does not have uintmax_t
 AC_CHECK_TYPE(uintmax_t,
@@ -930,43 +939,43 @@
 [NO_UINTMAX_T=YesPlease],[
 #include <inttypes.h>
 ])
-AC_SUBST(NO_UINTMAX_T)
+GIT_CONF_SUBST([NO_UINTMAX_T])
 #
 # Define NO_STRTOUMAX if you don't have strtoumax in the C library.
 GIT_CHECK_FUNC(strtoumax,
 [NO_STRTOUMAX=],
 [NO_STRTOUMAX=YesPlease])
-AC_SUBST(NO_STRTOUMAX)
+GIT_CONF_SUBST([NO_STRTOUMAX])
 #
 # Define NO_SETENV if you don't have setenv in the C library.
 GIT_CHECK_FUNC(setenv,
 [NO_SETENV=],
 [NO_SETENV=YesPlease])
-AC_SUBST(NO_SETENV)
+GIT_CONF_SUBST([NO_SETENV])
 #
 # Define NO_UNSETENV if you don't have unsetenv in the C library.
 GIT_CHECK_FUNC(unsetenv,
 [NO_UNSETENV=],
 [NO_UNSETENV=YesPlease])
-AC_SUBST(NO_UNSETENV)
+GIT_CONF_SUBST([NO_UNSETENV])
 #
 # Define NO_MKDTEMP if you don't have mkdtemp in the C library.
 GIT_CHECK_FUNC(mkdtemp,
 [NO_MKDTEMP=],
 [NO_MKDTEMP=YesPlease])
-AC_SUBST(NO_MKDTEMP)
+GIT_CONF_SUBST([NO_MKDTEMP])
 #
 # Define NO_MKSTEMPS if you don't have mkstemps in the C library.
 GIT_CHECK_FUNC(mkstemps,
 [NO_MKSTEMPS=],
 [NO_MKSTEMPS=YesPlease])
-AC_SUBST(NO_MKSTEMPS)
+GIT_CONF_SUBST([NO_MKSTEMPS])
 #
 # Define NO_INITGROUPS if you don't have initgroups in the C library.
 GIT_CHECK_FUNC(initgroups,
 [NO_INITGROUPS=],
 [NO_INITGROUPS=YesPlease])
-AC_SUBST(NO_INITGROUPS)
+GIT_CONF_SUBST([NO_INITGROUPS])
 #
 #
 # Define NO_MMAP if you want to avoid mmap.
@@ -1048,9 +1057,9 @@
 
 CFLAGS="$old_CFLAGS"
 
-AC_SUBST(PTHREAD_CFLAGS)
-AC_SUBST(PTHREAD_LIBS)
-AC_SUBST(NO_PTHREADS)
+GIT_CONF_SUBST([PTHREAD_CFLAGS])
+GIT_CONF_SUBST([PTHREAD_LIBS])
+GIT_CONF_SUBST([NO_PTHREADS])
 
 ## Output files
 AC_CONFIG_FILES(["${config_file}":"${config_in}"])
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 5b255cb..be800e0 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -875,11 +875,15 @@
 	done
 
 	case "$cur" in
+	--set-upstream-to=*)
+		__gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
+		;;
 	--*)
 		__gitcomp "
 			--color --no-color --verbose --abbrev= --no-abbrev
 			--track --no-track --contains --merged --no-merged
-			--set-upstream --edit-description --list
+			--set-upstream-to= --edit-description --list
+			--unset-upstream
 			"
 		;;
 	*)
@@ -1072,7 +1076,7 @@
 }
 
 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
-			tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
+			tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
 "
 
 _git_difftool ()
diff --git a/contrib/credential/gnome-keyring/.gitignore b/contrib/credential/gnome-keyring/.gitignore
new file mode 100644
index 0000000..88d8fcd
--- /dev/null
+++ b/contrib/credential/gnome-keyring/.gitignore
@@ -0,0 +1 @@
+git-credential-gnome-keyring
diff --git a/contrib/credential/gnome-keyring/Makefile b/contrib/credential/gnome-keyring/Makefile
new file mode 100644
index 0000000..e6561d8
--- /dev/null
+++ b/contrib/credential/gnome-keyring/Makefile
@@ -0,0 +1,24 @@
+MAIN:=git-credential-gnome-keyring
+all:: $(MAIN)
+
+CC = gcc
+RM = rm -f
+CFLAGS = -g -O2 -Wall
+
+-include ../../../config.mak.autogen
+-include ../../../config.mak
+
+INCS:=$(shell pkg-config --cflags gnome-keyring-1)
+LIBS:=$(shell pkg-config --libs gnome-keyring-1)
+
+SRCS:=$(MAIN).c
+OBJS:=$(SRCS:.c=.o)
+
+%.o: %.c
+	$(CC) $(CFLAGS) $(CPPFLAGS) $(INCS) -o $@ -c $<
+
+$(MAIN): $(OBJS)
+	$(CC) -o $@ $(LDFLAGS) $^ $(LIBS)
+
+clean:
+	@$(RM) $(MAIN) $(OBJS)
diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c
new file mode 100644
index 0000000..41f61c5
--- /dev/null
+++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c
@@ -0,0 +1,445 @@
+/*
+ * Copyright (C) 2011 John Szakmeister <john@szakmeister.net>
+ *               2012 Philipp A. Hartmann <pah@qo.cx>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * Credits:
+ * - GNOME Keyring API handling originally written by John Szakmeister
+ * - ported to credential helper API by Philipp A. Hartmann
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <gnome-keyring.h>
+
+/*
+ * This credential struct and API is simplified from git's credential.{h,c}
+ */
+struct credential
+{
+	char          *protocol;
+	char          *host;
+	unsigned short port;
+	char          *path;
+	char          *username;
+	char          *password;
+};
+
+#define CREDENTIAL_INIT \
+  { NULL,NULL,0,NULL,NULL,NULL }
+
+void credential_init(struct credential *c);
+void credential_clear(struct credential *c);
+int  credential_read(struct credential *c);
+void credential_write(const struct credential *c);
+
+typedef int (*credential_op_cb)(struct credential*);
+
+struct credential_operation
+{
+	char             *name;
+	credential_op_cb op;
+};
+
+#define CREDENTIAL_OP_END \
+  { NULL,NULL }
+
+/*
+ * Table with operation callbacks is defined in concrete
+ * credential helper implementation and contains entries
+ * like { "get", function_to_get_credential } terminated
+ * by CREDENTIAL_OP_END.
+ */
+struct credential_operation const credential_helper_ops[];
+
+/* ---------------- common helper functions ----------------- */
+
+static inline void free_password(char *password)
+{
+	char *c = password;
+	if (!password)
+		return;
+
+	while (*c) *c++ = '\0';
+	free(password);
+}
+
+static inline void warning(const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+	fprintf(stderr, "warning: ");
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n" );
+	va_end(ap);
+}
+
+static inline void error(const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+	fprintf(stderr, "error: ");
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n" );
+	va_end(ap);
+}
+
+static inline void die(const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap,fmt);
+	error(fmt, ap);
+	va_end(ap);
+	exit(EXIT_FAILURE);
+}
+
+static inline void die_errno(int err)
+{
+	error("%s", strerror(err));
+	exit(EXIT_FAILURE);
+}
+
+static inline char *xstrdup(const char *str)
+{
+	char *ret = strdup(str);
+	if (!ret)
+		die_errno(errno);
+
+	return ret;
+}
+
+/* ----------------- GNOME Keyring functions ----------------- */
+
+/* create a special keyring option string, if path is given */
+static char* keyring_object(struct credential *c)
+{
+	char* object = NULL;
+
+	if (!c->path)
+		return object;
+
+	object = (char*) malloc(strlen(c->host)+strlen(c->path)+8);
+	if(!object)
+		die_errno(errno);
+
+	if(c->port)
+		sprintf(object,"%s:%hd/%s",c->host,c->port,c->path);
+	else
+		sprintf(object,"%s/%s",c->host,c->path);
+
+	return object;
+}
+
+int keyring_get(struct credential *c)
+{
+	char* object = NULL;
+	GList *entries;
+	GnomeKeyringNetworkPasswordData *password_data;
+	GnomeKeyringResult result;
+
+	if (!c->protocol || !(c->host || c->path))
+		return EXIT_FAILURE;
+
+	object = keyring_object(c);
+
+	result = gnome_keyring_find_network_password_sync(
+				c->username,
+				NULL /* domain */,
+				c->host,
+				object,
+				c->protocol,
+				NULL /* authtype */,
+				c->port,
+				&entries);
+
+	free(object);
+
+	if (result == GNOME_KEYRING_RESULT_NO_MATCH)
+		return EXIT_SUCCESS;
+
+	if (result == GNOME_KEYRING_RESULT_CANCELLED)
+		return EXIT_SUCCESS;
+
+	if (result != GNOME_KEYRING_RESULT_OK) {
+		error("%s",gnome_keyring_result_to_message(result));
+		return EXIT_FAILURE;
+	}
+
+	/* pick the first one from the list */
+	password_data = (GnomeKeyringNetworkPasswordData *) entries->data;
+
+	free_password(c->password);
+	c->password = xstrdup(password_data->password);
+
+	if (!c->username)
+		c->username = xstrdup(password_data->user);
+
+	gnome_keyring_network_password_list_free(entries);
+
+	return EXIT_SUCCESS;
+}
+
+
+int keyring_store(struct credential *c)
+{
+	guint32 item_id;
+	char  *object = NULL;
+
+	/*
+	 * Sanity check that what we are storing is actually sensible.
+	 * In particular, we can't make a URL without a protocol field.
+	 * Without either a host or pathname (depending on the scheme),
+	 * we have no primary key. And without a username and password,
+	 * we are not actually storing a credential.
+	 */
+	if (!c->protocol || !(c->host || c->path) ||
+	    !c->username || !c->password)
+		return EXIT_FAILURE;
+
+	object = keyring_object(c);
+
+	gnome_keyring_set_network_password_sync(
+				GNOME_KEYRING_DEFAULT,
+				c->username,
+				NULL /* domain */,
+				c->host,
+				object,
+				c->protocol,
+				NULL /* authtype */,
+				c->port,
+				c->password,
+				&item_id);
+
+	free(object);
+	return EXIT_SUCCESS;
+}
+
+int keyring_erase(struct credential *c)
+{
+	char  *object = NULL;
+	GList *entries;
+	GnomeKeyringNetworkPasswordData *password_data;
+	GnomeKeyringResult result;
+
+	/*
+	 * Sanity check that we actually have something to match
+	 * against. The input we get is a restrictive pattern,
+	 * so technically a blank credential means "erase everything".
+	 * But it is too easy to accidentally send this, since it is equivalent
+	 * to empty input. So explicitly disallow it, and require that the
+	 * pattern have some actual content to match.
+	 */
+	if (!c->protocol && !c->host && !c->path && !c->username)
+		return EXIT_FAILURE;
+
+	object = keyring_object(c);
+
+	result = gnome_keyring_find_network_password_sync(
+				c->username,
+				NULL /* domain */,
+				c->host,
+				object,
+				c->protocol,
+				NULL /* authtype */,
+				c->port,
+				&entries);
+
+	free(object);
+
+	if (result == GNOME_KEYRING_RESULT_NO_MATCH)
+		return EXIT_SUCCESS;
+
+	if (result == GNOME_KEYRING_RESULT_CANCELLED)
+		return EXIT_SUCCESS;
+
+	if (result != GNOME_KEYRING_RESULT_OK)
+	{
+		error("%s",gnome_keyring_result_to_message(result));
+		return EXIT_FAILURE;
+	}
+
+	/* pick the first one from the list (delete all matches?) */
+	password_data = (GnomeKeyringNetworkPasswordData *) entries->data;
+
+	result = gnome_keyring_item_delete_sync(
+		password_data->keyring, password_data->item_id);
+
+	gnome_keyring_network_password_list_free(entries);
+
+	if (result != GNOME_KEYRING_RESULT_OK)
+	{
+		error("%s",gnome_keyring_result_to_message(result));
+		return EXIT_FAILURE;
+	}
+
+	return EXIT_SUCCESS;
+}
+
+/*
+ * Table with helper operation callbacks, used by generic
+ * credential helper main function.
+ */
+struct credential_operation const credential_helper_ops[] =
+{
+	{ "get",   keyring_get   },
+	{ "store", keyring_store },
+	{ "erase", keyring_erase },
+	CREDENTIAL_OP_END
+};
+
+/* ------------------ credential functions ------------------ */
+
+void credential_init(struct credential *c)
+{
+	memset(c, 0, sizeof(*c));
+}
+
+void credential_clear(struct credential *c)
+{
+	free(c->protocol);
+	free(c->host);
+	free(c->path);
+	free(c->username);
+	free_password(c->password);
+
+	credential_init(c);
+}
+
+int credential_read(struct credential *c)
+{
+	char    buf[1024];
+	ssize_t line_len = 0;
+	char   *key      = buf;
+	char   *value;
+
+	while (fgets(buf, sizeof(buf), stdin))
+	{
+		line_len = strlen(buf);
+
+		if(buf[line_len-1]=='\n')
+			buf[--line_len]='\0';
+
+		if(!line_len)
+			break;
+
+		value = strchr(buf,'=');
+		if(!value) {
+			warning("invalid credential line: %s", key);
+			return -1;
+		}
+		*value++ = '\0';
+
+		if (!strcmp(key, "protocol")) {
+			free(c->protocol);
+			c->protocol = xstrdup(value);
+		} else if (!strcmp(key, "host")) {
+			free(c->host);
+			c->host = xstrdup(value);
+			value = strrchr(c->host,':');
+			if (value) {
+				*value++ = '\0';
+				c->port = atoi(value);
+			}
+		} else if (!strcmp(key, "path")) {
+			free(c->path);
+			c->path = xstrdup(value);
+		} else if (!strcmp(key, "username")) {
+			free(c->username);
+			c->username = xstrdup(value);
+		} else if (!strcmp(key, "password")) {
+			free_password(c->password);
+			c->password = xstrdup(value);
+			while (*value) *value++ = '\0';
+		}
+		/*
+		 * Ignore other lines; we don't know what they mean, but
+		 * this future-proofs us when later versions of git do
+		 * learn new lines, and the helpers are updated to match.
+		 */
+	}
+	return 0;
+}
+
+void credential_write_item(FILE *fp, const char *key, const char *value)
+{
+	if (!value)
+		return;
+	fprintf(fp, "%s=%s\n", key, value);
+}
+
+void credential_write(const struct credential *c)
+{
+	/* only write username/password, if set */
+	credential_write_item(stdout, "username", c->username);
+	credential_write_item(stdout, "password", c->password);
+}
+
+static void usage(const char *name)
+{
+	struct credential_operation const *try_op = credential_helper_ops;
+	const char *basename = strrchr(name,'/');
+
+	basename = (basename) ? basename + 1 : name;
+	fprintf(stderr, "Usage: %s <", basename);
+	while(try_op->name) {
+		fprintf(stderr,"%s",(try_op++)->name);
+		if(try_op->name)
+			fprintf(stderr,"%s","|");
+	}
+	fprintf(stderr,"%s",">\n");
+}
+
+int main(int argc, char *argv[])
+{
+	int ret = EXIT_SUCCESS;
+
+	struct credential_operation const *try_op = credential_helper_ops;
+	struct credential                  cred   = CREDENTIAL_INIT;
+
+	if (!argv[1]) {
+		usage(argv[0]);
+		goto out;
+	}
+
+	/* lookup operation callback */
+	while(try_op->name && strcmp(argv[1], try_op->name))
+		try_op++;
+
+	/* unsupported operation given -- ignore silently */
+	if(!try_op->name || !try_op->op)
+		goto out;
+
+	ret = credential_read(&cred);
+	if(ret)
+		goto out;
+
+	/* perform credential operation */
+	ret = (*try_op->op)(&cred);
+
+	credential_write(&cred);
+
+out:
+	credential_clear(&cred);
+	return ret;
+}
diff --git a/contrib/credential/wincred/Makefile b/contrib/credential/wincred/Makefile
new file mode 100644
index 0000000..bad45ca
--- /dev/null
+++ b/contrib/credential/wincred/Makefile
@@ -0,0 +1,14 @@
+all: git-credential-wincred.exe
+
+CC = gcc
+RM = rm -f
+CFLAGS = -O2 -Wall
+
+-include ../../../config.mak.autogen
+-include ../../../config.mak
+
+git-credential-wincred.exe : git-credential-wincred.c
+	$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
+
+clean:
+	$(RM) git-credential-wincred.exe
diff --git a/contrib/credential/wincred/git-credential-wincred.c b/contrib/credential/wincred/git-credential-wincred.c
new file mode 100644
index 0000000..cbaec5f
--- /dev/null
+++ b/contrib/credential/wincred/git-credential-wincred.c
@@ -0,0 +1,357 @@
+/*
+ * A git credential helper that interface with Windows' Credential Manager
+ *
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+
+/* common helpers */
+
+static void die(const char *err, ...)
+{
+	char msg[4096];
+	va_list params;
+	va_start(params, err);
+	vsnprintf(msg, sizeof(msg), err, params);
+	fprintf(stderr, "%s\n", msg);
+	va_end(params);
+	exit(1);
+}
+
+static void *xmalloc(size_t size)
+{
+	void *ret = malloc(size);
+	if (!ret && !size)
+		ret = malloc(1);
+	if (!ret)
+		 die("Out of memory");
+	return ret;
+}
+
+static char *xstrdup(const char *str)
+{
+	char *ret = strdup(str);
+	if (!ret)
+		die("Out of memory");
+	return ret;
+}
+
+/* MinGW doesn't have wincred.h, so we need to define stuff */
+
+typedef struct _CREDENTIAL_ATTRIBUTEW {
+	LPWSTR Keyword;
+	DWORD  Flags;
+	DWORD  ValueSize;
+	LPBYTE Value;
+} CREDENTIAL_ATTRIBUTEW, *PCREDENTIAL_ATTRIBUTEW;
+
+typedef struct _CREDENTIALW {
+	DWORD                  Flags;
+	DWORD                  Type;
+	LPWSTR                 TargetName;
+	LPWSTR                 Comment;
+	FILETIME               LastWritten;
+	DWORD                  CredentialBlobSize;
+	LPBYTE                 CredentialBlob;
+	DWORD                  Persist;
+	DWORD                  AttributeCount;
+	PCREDENTIAL_ATTRIBUTEW Attributes;
+	LPWSTR                 TargetAlias;
+	LPWSTR                 UserName;
+} CREDENTIALW, *PCREDENTIALW;
+
+#define CRED_TYPE_GENERIC 1
+#define CRED_PERSIST_LOCAL_MACHINE 2
+#define CRED_MAX_ATTRIBUTES 64
+
+typedef BOOL (WINAPI *CredWriteWT)(PCREDENTIALW, DWORD);
+typedef BOOL (WINAPI *CredUnPackAuthenticationBufferWT)(DWORD, PVOID, DWORD,
+    LPWSTR, DWORD *, LPWSTR, DWORD *, LPWSTR, DWORD *);
+typedef BOOL (WINAPI *CredEnumerateWT)(LPCWSTR, DWORD, DWORD *,
+    PCREDENTIALW **);
+typedef BOOL (WINAPI *CredPackAuthenticationBufferWT)(DWORD, LPWSTR, LPWSTR,
+    PBYTE, DWORD *);
+typedef VOID (WINAPI *CredFreeT)(PVOID);
+typedef BOOL (WINAPI *CredDeleteWT)(LPCWSTR, DWORD, DWORD);
+
+static HMODULE advapi, credui;
+static CredWriteWT CredWriteW;
+static CredUnPackAuthenticationBufferWT CredUnPackAuthenticationBufferW;
+static CredEnumerateWT CredEnumerateW;
+static CredPackAuthenticationBufferWT CredPackAuthenticationBufferW;
+static CredFreeT CredFree;
+static CredDeleteWT CredDeleteW;
+
+static void load_cred_funcs(void)
+{
+	/* load DLLs */
+	advapi = LoadLibrary("advapi32.dll");
+	credui = LoadLibrary("credui.dll");
+	if (!advapi || !credui)
+		die("failed to load DLLs");
+
+	/* get function pointers */
+	CredWriteW = (CredWriteWT)GetProcAddress(advapi, "CredWriteW");
+	CredUnPackAuthenticationBufferW = (CredUnPackAuthenticationBufferWT)
+	    GetProcAddress(credui, "CredUnPackAuthenticationBufferW");
+	CredEnumerateW = (CredEnumerateWT)GetProcAddress(advapi,
+	    "CredEnumerateW");
+	CredPackAuthenticationBufferW = (CredPackAuthenticationBufferWT)
+	    GetProcAddress(credui, "CredPackAuthenticationBufferW");
+	CredFree = (CredFreeT)GetProcAddress(advapi, "CredFree");
+	CredDeleteW = (CredDeleteWT)GetProcAddress(advapi, "CredDeleteW");
+	if (!CredWriteW || !CredUnPackAuthenticationBufferW ||
+	    !CredEnumerateW || !CredPackAuthenticationBufferW || !CredFree ||
+	    !CredDeleteW)
+		die("failed to load functions");
+}
+
+static char target_buf[1024];
+static char *protocol, *host, *path, *username;
+static WCHAR *wusername, *password, *target;
+
+static void write_item(const char *what, WCHAR *wbuf)
+{
+	char *buf;
+	int len = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, NULL, 0, NULL,
+	    FALSE);
+	buf = xmalloc(len);
+
+	if (!WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, buf, len, NULL, FALSE))
+		die("WideCharToMultiByte failed!");
+
+	printf("%s=", what);
+	fwrite(buf, 1, len - 1, stdout);
+	putchar('\n');
+	free(buf);
+}
+
+static int match_attr(const CREDENTIALW *cred, const WCHAR *keyword,
+    const char *want)
+{
+	int i;
+	if (!want)
+		return 1;
+
+	for (i = 0; i < cred->AttributeCount; ++i)
+		if (!wcscmp(cred->Attributes[i].Keyword, keyword))
+			return !strcmp((const char *)cred->Attributes[i].Value,
+			    want);
+
+	return 0; /* not found */
+}
+
+static int match_cred(const CREDENTIALW *cred)
+{
+	return (!wusername || !wcscmp(wusername, cred->UserName)) &&
+	    match_attr(cred, L"git_protocol", protocol) &&
+	    match_attr(cred, L"git_host", host) &&
+	    match_attr(cred, L"git_path", path);
+}
+
+static void get_credential(void)
+{
+	WCHAR *user_buf, *pass_buf;
+	DWORD user_buf_size = 0, pass_buf_size = 0;
+	CREDENTIALW **creds, *cred = NULL;
+	DWORD num_creds;
+	int i;
+
+	if (!CredEnumerateW(L"git:*", 0, &num_creds, &creds))
+		return;
+
+	/* search for the first credential that matches username */
+	for (i = 0; i < num_creds; ++i)
+		if (match_cred(creds[i])) {
+			cred = creds[i];
+			break;
+		}
+	if (!cred)
+		return;
+
+	CredUnPackAuthenticationBufferW(0, cred->CredentialBlob,
+	    cred->CredentialBlobSize, NULL, &user_buf_size, NULL, NULL,
+	    NULL, &pass_buf_size);
+
+	user_buf = xmalloc(user_buf_size * sizeof(WCHAR));
+	pass_buf = xmalloc(pass_buf_size * sizeof(WCHAR));
+
+	if (!CredUnPackAuthenticationBufferW(0, cred->CredentialBlob,
+	    cred->CredentialBlobSize, user_buf, &user_buf_size, NULL, NULL,
+	    pass_buf, &pass_buf_size))
+		die("CredUnPackAuthenticationBuffer failed");
+
+	CredFree(creds);
+
+	/* zero-terminate (sizes include zero-termination) */
+	user_buf[user_buf_size - 1] = L'\0';
+	pass_buf[pass_buf_size - 1] = L'\0';
+
+	write_item("username", user_buf);
+	write_item("password", pass_buf);
+
+	free(user_buf);
+	free(pass_buf);
+}
+
+static void write_attr(CREDENTIAL_ATTRIBUTEW *attr, const WCHAR *keyword,
+    const char *value)
+{
+	attr->Keyword = (LPWSTR)keyword;
+	attr->Flags = 0;
+	attr->ValueSize = strlen(value) + 1; /* store zero-termination */
+	attr->Value = (LPBYTE)value;
+}
+
+static void store_credential(void)
+{
+	CREDENTIALW cred;
+	BYTE *auth_buf;
+	DWORD auth_buf_size = 0;
+	CREDENTIAL_ATTRIBUTEW attrs[CRED_MAX_ATTRIBUTES];
+
+	if (!wusername || !password)
+		return;
+
+	/* query buffer size */
+	CredPackAuthenticationBufferW(0, wusername, password,
+	    NULL, &auth_buf_size);
+
+	auth_buf = xmalloc(auth_buf_size);
+
+	if (!CredPackAuthenticationBufferW(0, wusername, password,
+	    auth_buf, &auth_buf_size))
+		die("CredPackAuthenticationBuffer failed");
+
+	cred.Flags = 0;
+	cred.Type = CRED_TYPE_GENERIC;
+	cred.TargetName = target;
+	cred.Comment = L"saved by git-credential-wincred";
+	cred.CredentialBlobSize = auth_buf_size;
+	cred.CredentialBlob = auth_buf;
+	cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
+	cred.AttributeCount = 1;
+	cred.Attributes = attrs;
+	cred.TargetAlias = NULL;
+	cred.UserName = wusername;
+
+	write_attr(attrs, L"git_protocol", protocol);
+
+	if (host) {
+		write_attr(attrs + cred.AttributeCount, L"git_host", host);
+		cred.AttributeCount++;
+	}
+
+	if (path) {
+		write_attr(attrs + cred.AttributeCount, L"git_path", path);
+		cred.AttributeCount++;
+	}
+
+	if (!CredWriteW(&cred, 0))
+		die("CredWrite failed");
+}
+
+static void erase_credential(void)
+{
+	CREDENTIALW **creds;
+	DWORD num_creds;
+	int i;
+
+	if (!CredEnumerateW(L"git:*", 0, &num_creds, &creds))
+		return;
+
+	for (i = 0; i < num_creds; ++i) {
+		if (match_cred(creds[i]))
+			CredDeleteW(creds[i]->TargetName, creds[i]->Type, 0);
+	}
+
+	CredFree(creds);
+}
+
+static WCHAR *utf8_to_utf16_dup(const char *str)
+{
+	int wlen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+	WCHAR *wstr = xmalloc(sizeof(WCHAR) * wlen);
+	MultiByteToWideChar(CP_UTF8, 0, str, -1, wstr, wlen);
+	return wstr;
+}
+
+static void read_credential(void)
+{
+	char buf[1024];
+
+	while (fgets(buf, sizeof(buf), stdin)) {
+		char *v;
+
+		if (!strcmp(buf, "\n"))
+			break;
+		buf[strlen(buf)-1] = '\0';
+
+		v = strchr(buf, '=');
+		if (!v)
+			die("bad input: %s", buf);
+		*v++ = '\0';
+
+		if (!strcmp(buf, "protocol"))
+			protocol = xstrdup(v);
+		else if (!strcmp(buf, "host"))
+			host = xstrdup(v);
+		else if (!strcmp(buf, "path"))
+			path = xstrdup(v);
+		else if (!strcmp(buf, "username")) {
+			username = xstrdup(v);
+			wusername = utf8_to_utf16_dup(v);
+		} else if (!strcmp(buf, "password"))
+			password = utf8_to_utf16_dup(v);
+		else
+			die("unrecognized input");
+	}
+}
+
+int main(int argc, char *argv[])
+{
+	const char *usage =
+	    "Usage: git credential-wincred <get|store|erase>\n";
+
+	if (!argv[1])
+		die(usage);
+
+	/* git use binary pipes to avoid CRLF-issues */
+	_setmode(_fileno(stdin), _O_BINARY);
+	_setmode(_fileno(stdout), _O_BINARY);
+
+	read_credential();
+
+	load_cred_funcs();
+
+	if (!protocol || !(host || path))
+		return 0;
+
+	/* prepare 'target', the unique key for the credential */
+	strncat(target_buf, "git:", sizeof(target_buf));
+	strncat(target_buf, protocol, sizeof(target_buf));
+	strncat(target_buf, "://", sizeof(target_buf));
+	if (username) {
+		strncat(target_buf, username, sizeof(target_buf));
+		strncat(target_buf, "@", sizeof(target_buf));
+	}
+	if (host)
+		strncat(target_buf, host, sizeof(target_buf));
+	if (path) {
+		strncat(target_buf, "/", sizeof(target_buf));
+		strncat(target_buf, path, sizeof(target_buf));
+	}
+
+	target = utf8_to_utf16_dup(target_buf);
+
+	if (!strcmp(argv[1], "get"))
+		get_credential();
+	else if (!strcmp(argv[1], "store"))
+		store_credential();
+	else if (!strcmp(argv[1], "erase"))
+		erase_credential();
+	/* otherwise, ignore unknown action */
+	return 0;
+}
diff --git a/contrib/examples/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c
index 0d54aa7..8bc8c75 100644
--- a/contrib/examples/builtin-fetch--tool.c
+++ b/contrib/examples/builtin-fetch--tool.c
@@ -96,7 +96,7 @@
 	strcpy(oldh, find_unique_abbrev(current->object.sha1, DEFAULT_ABBREV));
 	strcpy(newh, find_unique_abbrev(sha1_new, DEFAULT_ABBREV));
 
-	if (in_merge_bases(current, &updated, 1)) {
+	if (in_merge_bases(current, updated)) {
 		fprintf(stderr, "* %s: fast-forward to %s\n",
 			name, note);
 		fprintf(stderr, "  old..new: %s..%s\n", oldh, newh);
diff --git a/daemon.c b/daemon.c
index ab21e66..4602b46 100644
--- a/daemon.c
+++ b/daemon.c
@@ -30,6 +30,7 @@
 "           [--interpolated-path=<path>]\n"
 "           [--reuseaddr] [--pid-file=<file>]\n"
 "           [--(enable|disable|allow-override|forbid-override)=<service>]\n"
+"           [--access-hook=<path>]\n"
 "           [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n"
 "                      [--detach] [--user=<user> [--group=<group>]]\n"
 "           [<directory>...]";
@@ -256,6 +257,71 @@
 	return -1;
 }
 
+static char *access_hook;
+
+static int run_access_hook(struct daemon_service *service, const char *dir, const char *path)
+{
+	struct child_process child;
+	struct strbuf buf = STRBUF_INIT;
+	const char *argv[8];
+	const char **arg = argv;
+	char *eol;
+	int seen_errors = 0;
+
+#define STRARG(x) ((x) ? (x) : "")
+	*arg++ = access_hook;
+	*arg++ = service->name;
+	*arg++ = path;
+	*arg++ = STRARG(hostname);
+	*arg++ = STRARG(canon_hostname);
+	*arg++ = STRARG(ip_address);
+	*arg++ = STRARG(tcp_port);
+	*arg = NULL;
+#undef STRARG
+
+	memset(&child, 0, sizeof(child));
+	child.use_shell = 1;
+	child.argv = argv;
+	child.no_stdin = 1;
+	child.no_stderr = 1;
+	child.out = -1;
+	if (start_command(&child)) {
+		logerror("daemon access hook '%s' failed to start",
+			 access_hook);
+		goto error_return;
+	}
+	if (strbuf_read(&buf, child.out, 0) < 0) {
+		logerror("failed to read from pipe to daemon access hook '%s'",
+			 access_hook);
+		strbuf_reset(&buf);
+		seen_errors = 1;
+	}
+	if (close(child.out) < 0) {
+		logerror("failed to close pipe to daemon access hook '%s'",
+			 access_hook);
+		seen_errors = 1;
+	}
+	if (finish_command(&child))
+		seen_errors = 1;
+
+	if (!seen_errors) {
+		strbuf_release(&buf);
+		return 0;
+	}
+
+error_return:
+	strbuf_ltrim(&buf);
+	if (!buf.len)
+		strbuf_addstr(&buf, "service rejected");
+	eol = strchr(buf.buf, '\n');
+	if (eol)
+		*eol = '\0';
+	errno = EACCES;
+	daemon_error(dir, buf.buf);
+	strbuf_release(&buf);
+	return -1;
+}
+
 static int run_service(char *dir, struct daemon_service *service)
 {
 	const char *path;
@@ -304,6 +370,13 @@
 	}
 
 	/*
+	 * Optionally, a hook can choose to deny access to the
+	 * repository depending on the phase of the moon.
+	 */
+	if (access_hook && run_access_hook(service, dir, path))
+		return -1;
+
+	/*
 	 * We'll ignore SIGTERM from now on, we have a
 	 * good client.
 	 */
@@ -1142,6 +1215,10 @@
 			export_all_trees = 1;
 			continue;
 		}
+		if (!prefixcmp(arg, "--access-hook=")) {
+			access_hook = arg + 14;
+			continue;
+		}
 		if (!prefixcmp(arg, "--timeout=")) {
 			timeout = atoi(arg+10);
 			continue;
diff --git a/diff.c b/diff.c
index 32142db..35d3f07 100644
--- a/diff.c
+++ b/diff.c
@@ -25,7 +25,7 @@
 static int diff_detect_rename_default;
 static int diff_rename_limit_default = 400;
 static int diff_suppress_blank_empty;
-int diff_use_color_default = -1;
+static int diff_use_color_default = -1;
 static const char *diff_word_regex_cfg;
 static const char *external_diff_cmd_cfg;
 int diff_auto_refresh_index = 1;
diff --git a/diff.h b/diff.h
index e25addb..a658f85 100644
--- a/diff.h
+++ b/diff.h
@@ -243,7 +243,6 @@
 
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
-extern int diff_use_color_default;
 extern void diff_setup(struct diff_options *);
 extern int diff_opt_parse(struct diff_options *, const char **, int);
 extern void diff_setup_done(struct diff_options *);
diff --git a/fast-import.c b/fast-import.c
index eed97c8..c2a814e 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -1691,7 +1691,7 @@
 			return error("Branch %s is missing commits.", b->name);
 		}
 
-		if (!in_merge_bases(old_cmit, &new_cmit, 1)) {
+		if (!in_merge_bases(old_cmit, new_cmit)) {
 			unlock_ref(lock);
 			warning("Not updating %s"
 				" (new tip %s does not contain %s)",
diff --git a/fetch-pack.h b/fetch-pack.h
index 7c2069c..cb14871 100644
--- a/fetch-pack.h
+++ b/fetch-pack.h
@@ -1,6 +1,8 @@
 #ifndef FETCH_PACK_H
 #define FETCH_PACK_H
 
+#include "string-list.h"
+
 struct fetch_pack_args {
 	const char *uploadpack;
 	int unpacklimit;
@@ -17,12 +19,18 @@
 		stateless_rpc:1;
 };
 
+/*
+ * sought contains the full names of remote references that should be
+ * updated from.  On return, the names that were found on the remote
+ * will have been removed from the list.  The util members of the
+ * string_list_items are used internally; they must be NULL on entry
+ * (and will be NULL on exit).
+ */
 struct ref *fetch_pack(struct fetch_pack_args *args,
-		int fd[], struct child_process *conn,
-		const struct ref *ref,
-		const char *dest,
-		int nr_heads,
-		char **heads,
-		char **pack_lockfile);
+		       int fd[], struct child_process *conn,
+		       const struct ref *ref,
+		       const char *dest,
+		       struct string_list *sought,
+		       char **pack_lockfile);
 
 #endif
diff --git a/gettext.c b/gettext.c
index f75bca7..71e9545 100644
--- a/gettext.c
+++ b/gettext.c
@@ -4,6 +4,8 @@
 
 #include "git-compat-util.h"
 #include "gettext.h"
+#include "strbuf.h"
+#include "utf8.h"
 
 #ifndef NO_GETTEXT
 #	include <locale.h>
@@ -27,10 +29,9 @@
 #endif
 
 #ifndef NO_GETTEXT
+static const char *charset;
 static void init_gettext_charset(const char *domain)
 {
-	const char *charset;
-
 	/*
 	   This trick arranges for messages to be emitted in the user's
 	   requested encoding, but avoids setting LC_CTYPE from the
@@ -128,4 +129,14 @@
 	init_gettext_charset("git");
 	textdomain("git");
 }
+
+/* return the number of columns of string 's' in current locale */
+int gettext_width(const char *s)
+{
+	static int is_utf8 = -1;
+	if (is_utf8 == -1)
+		is_utf8 = !strcmp(charset, "UTF-8");
+
+	return is_utf8 ? utf8_strwidth(s) : strlen(s);
+}
 #endif
diff --git a/gettext.h b/gettext.h
index 57ba8bb..7671d09 100644
--- a/gettext.h
+++ b/gettext.h
@@ -30,10 +30,15 @@
 
 #ifndef NO_GETTEXT
 extern void git_setup_gettext(void);
+extern int gettext_width(const char *s);
 #else
 static inline void git_setup_gettext(void)
 {
 }
+static inline int gettext_width(const char *s)
+{
+	return strlen(s);
+}
 #endif
 
 #ifdef GETTEXT_POISON
@@ -44,6 +49,8 @@
 
 static inline FORMAT_PRESERVING(1) const char *_(const char *msgid)
 {
+	if (!*msgid)
+		return "";
 	return use_gettext_poison() ? "# GETTEXT POISON #" : gettext(msgid);
 }
 
diff --git a/git-am.sh b/git-am.sh
index bd9620c..c682d34 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -855,8 +855,8 @@
 		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
 		if test "$(git config --bool advice.amworkdir)" != false
 		then
-			eval_gettextln "The copy of the patch that failed is found in:
-   $dotest/patch"
+			eval_gettextln 'The copy of the patch that failed is found in:
+   $dotest/patch'
 		fi
 		stop_here_user_resolve $this
 	fi
diff --git a/git-compat-util.h b/git-compat-util.h
index 000042d..2fbf1fd 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -74,7 +74,8 @@
 # define _XOPEN_SOURCE 500
 # endif
 #elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \
-      !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__)
+      !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \
+      !defined(__TANDEM)
 #define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */
 #define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */
 #endif
@@ -98,6 +99,9 @@
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
+#ifdef __TANDEM /* or HAVE_STRINGS_H or !NO_STRINGS_H? */
+#include <strings.h> /* for strcasecmp() */
+#endif
 #include <errno.h>
 #include <limits.h>
 #include <sys/param.h>
@@ -141,6 +145,17 @@
 #else
 #include <stdint.h>
 #endif
+#ifdef NO_INTPTR_T
+/*
+ * On I16LP32, ILP32 and LP64 "long" is the save bet, however
+ * on LLP86, IL33LLP64 and P64 it needs to be "long long",
+ * while on IP16 and IP16L32 it is "int" (resp. "short")
+ * Size needs to match (or exceed) 'sizeof(void *)'.
+ * We can't take "long long" here as not everybody has it.
+ */
+typedef long intptr_t;
+typedef unsigned long uintptr_t;
+#endif
 #if defined(__CYGWIN__)
 #undef _XOPEN_SOURCE
 #include <grp.h>
@@ -162,6 +177,22 @@
 #define probe_utf8_pathname_composition(a,b)
 #endif
 
+#ifdef MKDIR_WO_TRAILING_SLASH
+#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b))
+extern int compat_mkdir_wo_trailing_slash(const char*, mode_t);
+#endif
+
+#ifdef NO_STRUCT_ITIMERVAL
+struct itimerval {
+	struct timeval it_interval;
+	struct timeval it_value;
+}
+#endif
+
+#ifdef NO_SETITIMER
+#define setitimer(which,value,ovalue)
+#endif
+
 #ifndef NO_LIBGEN_H
 #include <libgen.h>
 #else
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 8d41610..8032f23 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -889,10 +889,37 @@
 		$xtag =~ s/\s+\*\*.*$//; # Remove stuff like ** INVALID ** and ** FUNKY **
 		$xtag =~ tr/_/\./ if ( $opt_u );
 		$xtag =~ s/[\/]/$opt_s/g;
-		$xtag =~ s/\[//g;
 
-		system('git' , 'tag', '-f', $xtag, $cid) == 0
-			or die "Cannot create tag $xtag: $!\n";
+		# See refs.c for these rules.
+		# Tag cannot contain bad chars. (See bad_ref_char in refs.c.)
+		$xtag =~ s/[ ~\^:\\\*\?\[]//g;
+		# Other bad strings for tags:
+		# (See check_refname_component in refs.c.)
+		1 while $xtag =~ s/
+			(?: \.\.        # Tag cannot contain '..'.
+			|   \@{         # Tag cannot contain '@{'.
+			| ^ -           # Tag cannot begin with '-'.
+			|   \.lock $    # Tag cannot end with '.lock'.
+			| ^ \.          # Tag cannot begin...
+			|   \. $        # ...or end with '.'
+			)//xg;
+		# Tag cannot be empty.
+		if ($xtag eq '') {
+			warn("warning: ignoring tag '$tag'",
+			" with invalid tagname\n");
+			return;
+		}
+
+		if (system('git' , 'tag', '-f', $xtag, $cid) != 0) {
+			# We did our best to sanitize the tag, but still failed
+			# for whatever reason. Bail out, and give the user
+			# enough information to understand if/how we should
+			# improve the translation in the future.
+			if ($tag ne $xtag) {
+				print "Translated '$tag' tag to '$xtag'\n";
+			}
+			die "Cannot create tag $xtag: $!\n";
+		}
 
 		print "Created tag '$xtag' on '$branch'\n" if $opt_v;
 	}
diff --git a/git-difftool.perl b/git-difftool.perl
index c079854..edd0493 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -18,17 +18,11 @@
 use File::Compare;
 use File::Find;
 use File::stat;
-use File::Path qw(mkpath);
+use File::Path qw(mkpath rmtree);
 use File::Temp qw(tempdir);
 use Getopt::Long qw(:config pass_through);
 use Git;
 
-my @tools;
-my @working_tree;
-my $rc;
-my $repo = Git->repository();
-my $repo_path = $repo->repo_path();
-
 sub usage
 {
 	my $exitcode = shift;
@@ -45,6 +39,8 @@
 
 sub find_worktree
 {
+	my ($repo) = @_;
+
 	# Git->repository->wc_path() does not honor changes to the working
 	# tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree'
 	# config variable.
@@ -63,10 +59,9 @@
 	return $worktree;
 }
 
-my $workdir = find_worktree();
-
 sub filter_tool_scripts
 {
+	my ($tools) = @_;
 	if (-d $_) {
 		if ($_ ne ".") {
 			# Ignore files in subdirectories
@@ -74,17 +69,17 @@
 		}
 	} else {
 		if ((-f $_) && ($_ ne "defaults")) {
-			push(@tools, $_);
+			push(@$tools, $_);
 		}
 	}
 }
 
 sub print_tool_help
 {
-	my ($cmd, @found, @notfound);
+	my ($cmd, @found, @notfound, @tools);
 	my $gitpath = Git::exec_path();
 
-	find(\&filter_tool_scripts, "$gitpath/mergetools");
+	find(sub { filter_tool_scripts(\@tools) }, "$gitpath/mergetools");
 
 	foreach my $tool (@tools) {
 		$cmd  = "TOOL_MODE=diff";
@@ -98,34 +93,52 @@
 		}
 	}
 
-	print "'git difftool --tool=<tool>' may be set to one of the following:\n";
+	print << 'EOF';
+'git difftool --tool=<tool>' may be set to one of the following:
+EOF
 	print "\t$_\n" for (sort(@found));
 
-	print "\nThe following tools are valid, but not currently available:\n";
+	print << 'EOF';
+
+The following tools are valid, but not currently available:
+EOF
 	print "\t$_\n" for (sort(@notfound));
 
-	print "\nNOTE: Some of the tools listed above only work in a windowed\n";
-	print "environment. If run in a terminal-only session, they will fail.\n";
+	print << 'EOF';
 
+NOTE: Some of the tools listed above only work in a windowed
+environment. If run in a terminal-only session, they will fail.
+EOF
 	exit(0);
 }
 
+sub exit_cleanup
+{
+	my ($tmpdir, $status) = @_;
+	my $errno = $!;
+	rmtree($tmpdir);
+	if ($status and $errno) {
+		my ($package, $file, $line) = caller();
+		warn "$file line $line: $errno\n";
+	}
+	exit($status | ($status >> 8));
+}
+
 sub setup_dir_diff
 {
+	my ($repo, $workdir, $symlinks) = @_;
+
 	# Run the diff; exit immediately if no diff found
 	# 'Repository' and 'WorkingCopy' must be explicitly set to insure that
 	# if $GIT_DIR and $GIT_WORK_TREE are set in ENV, they are actually used
 	# by Git->repository->command*.
-	my $diffrepo = Git->repository(Repository => $repo_path, WorkingCopy => $workdir);
-	my $diffrtn = $diffrepo->command_oneline('diff', '--raw', '--no-abbrev', '-z', @ARGV);
-	exit(0) if (length($diffrtn) == 0);
+	my $repo_path = $repo->repo_path();
+	my %repo_args = (Repository => $repo_path, WorkingCopy => $workdir);
+	my $diffrepo = Git->repository(%repo_args);
 
-	# Setup temp directories
-	my $tmpdir = tempdir('git-diffall.XXXXX', CLEANUP => 1, TMPDIR => 1);
-	my $ldir = "$tmpdir/left";
-	my $rdir = "$tmpdir/right";
-	mkpath($ldir) or die $!;
-	mkpath($rdir) or die $!;
+	my @gitargs = ('diff', '--raw', '--no-abbrev', '-z', @ARGV);
+	my $diffrtn = $diffrepo->command_oneline(@gitargs);
+	exit(0) unless defined($diffrtn);
 
 	# Build index info for left and right sides of the diff
 	my $submodule_mode = '160000';
@@ -136,16 +149,21 @@
 	my $rindex = '';
 	my %submodule;
 	my %symlink;
+	my @working_tree = ();
 	my @rawdiff = split('\0', $diffrtn);
 
 	my $i = 0;
 	while ($i < $#rawdiff) {
 		if ($rawdiff[$i] =~ /^::/) {
-			print "Combined diff formats ('-c' and '--cc') are not supported in directory diff mode.\n";
+			warn << 'EOF';
+Combined diff formats ('-c' and '--cc') are not supported in
+directory diff mode ('-d' and '--dir-diff').
+EOF
 			exit(1);
 		}
 
-		my ($lmode, $rmode, $lsha1, $rsha1, $status) = split(' ', substr($rawdiff[$i], 1));
+		my ($lmode, $rmode, $lsha1, $rsha1, $status) =
+			split(' ', substr($rawdiff[$i], 1));
 		my $src_path = $rawdiff[$i + 1];
 		my $dst_path;
 
@@ -157,7 +175,7 @@
 			$i += 2;
 		}
 
-		if (($lmode eq $submodule_mode) or ($rmode eq $submodule_mode)) {
+		if ($lmode eq $submodule_mode or $rmode eq $submodule_mode) {
 			$submodule{$src_path}{left} = $lsha1;
 			if ($lsha1 ne $rsha1) {
 				$submodule{$dst_path}{right} = $rsha1;
@@ -168,14 +186,16 @@
 		}
 
 		if ($lmode eq $symlink_mode) {
-			$symlink{$src_path}{left} = $diffrepo->command_oneline('show', "$lsha1");
+			$symlink{$src_path}{left} =
+				$diffrepo->command_oneline('show', "$lsha1");
 		}
 
 		if ($rmode eq $symlink_mode) {
-			$symlink{$dst_path}{right} = $diffrepo->command_oneline('show', "$rsha1");
+			$symlink{$dst_path}{right} =
+				$diffrepo->command_oneline('show', "$rsha1");
 		}
 
-		if (($lmode ne $null_mode) and ($status !~ /^C/)) {
+		if ($lmode ne $null_mode and $status !~ /^C/) {
 			$lindex .= "$lmode $lsha1\t$src_path\0";
 		}
 
@@ -188,6 +208,13 @@
 		}
 	}
 
+	# Setup temp directories
+	my $tmpdir = tempdir('git-difftool.XXXXX', CLEANUP => 0, TMPDIR => 1);
+	my $ldir = "$tmpdir/left";
+	my $rdir = "$tmpdir/right";
+	mkpath($ldir) or exit_cleanup($tmpdir, 1);
+	mkpath($rdir) or exit_cleanup($tmpdir, 1);
+
 	# If $GIT_DIR is not set prior to calling 'git update-index' and
 	# 'git checkout-index', then those commands will fail if difftool
 	# is called from a directory other than the repo root.
@@ -200,18 +227,22 @@
 	# Populate the left and right directories based on each index file
 	my ($inpipe, $ctx);
 	$ENV{GIT_INDEX_FILE} = "$tmpdir/lindex";
-	($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/);
+	($inpipe, $ctx) =
+		$repo->command_input_pipe(qw(update-index -z --index-info));
 	print($inpipe $lindex);
 	$repo->command_close_pipe($inpipe, $ctx);
-	$rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/");
-	exit($rc | ($rc >> 8)) if ($rc != 0);
+
+	my $rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/");
+	exit_cleanup($tmpdir, $rc) if $rc != 0;
 
 	$ENV{GIT_INDEX_FILE} = "$tmpdir/rindex";
-	($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/);
+	($inpipe, $ctx) =
+		$repo->command_input_pipe(qw(update-index -z --index-info));
 	print($inpipe $rindex);
 	$repo->command_close_pipe($inpipe, $ctx);
+
 	$rc = system('git', 'checkout-index', '--all', "--prefix=$rdir/");
-	exit($rc | ($rc >> 8)) if ($rc != 0);
+	exit_cleanup($tmpdir, $rc) if $rc != 0;
 
 	# If $GIT_DIR was explicitly set just for the update/checkout
 	# commands, then it should be unset before continuing.
@@ -223,37 +254,55 @@
 	for my $file (@working_tree) {
 		my $dir = dirname($file);
 		unless (-d "$rdir/$dir") {
-			mkpath("$rdir/$dir") or die $!;
+			mkpath("$rdir/$dir") or
+			exit_cleanup($tmpdir, 1);
 		}
-		copy("$workdir/$file", "$rdir/$file") or die $!;
-		chmod(stat("$workdir/$file")->mode, "$rdir/$file") or die $!;
+		if ($symlinks) {
+			symlink("$workdir/$file", "$rdir/$file") or
+			exit_cleanup($tmpdir, 1);
+		} else {
+			copy("$workdir/$file", "$rdir/$file") or
+			exit_cleanup($tmpdir, 1);
+
+			my $mode = stat("$workdir/$file")->mode;
+			chmod($mode, "$rdir/$file") or
+			exit_cleanup($tmpdir, 1);
+		}
 	}
 
 	# Changes to submodules require special treatment. This loop writes a
 	# temporary file to both the left and right directories to show the
 	# change in the recorded SHA1 for the submodule.
 	for my $path (keys %submodule) {
+		my $ok;
 		if (defined($submodule{$path}{left})) {
-			write_to_file("$ldir/$path", "Subproject commit $submodule{$path}{left}");
+			$ok = write_to_file("$ldir/$path",
+				"Subproject commit $submodule{$path}{left}");
 		}
 		if (defined($submodule{$path}{right})) {
-			write_to_file("$rdir/$path", "Subproject commit $submodule{$path}{right}");
+			$ok = write_to_file("$rdir/$path",
+				"Subproject commit $submodule{$path}{right}");
 		}
+		exit_cleanup($tmpdir, 1) if not $ok;
 	}
 
 	# Symbolic links require special treatment. The standard "git diff"
 	# shows only the link itself, not the contents of the link target.
 	# This loop replicates that behavior.
 	for my $path (keys %symlink) {
+		my $ok;
 		if (defined($symlink{$path}{left})) {
-			write_to_file("$ldir/$path", $symlink{$path}{left});
+			$ok = write_to_file("$ldir/$path",
+					$symlink{$path}{left});
 		}
 		if (defined($symlink{$path}{right})) {
-			write_to_file("$rdir/$path", $symlink{$path}{right});
+			$ok = write_to_file("$rdir/$path",
+					$symlink{$path}{right});
 		}
+		exit_cleanup($tmpdir, 1) if not $ok;
 	}
 
-	return ($ldir, $rdir);
+	return ($ldir, $rdir, $tmpdir, @working_tree);
 }
 
 sub write_to_file
@@ -264,85 +313,141 @@
 	# Make sure the path to the file exists
 	my $dir = dirname($path);
 	unless (-d "$dir") {
-		mkpath("$dir") or die $!;
+		mkpath("$dir") or return 0;
 	}
 
 	# If the file already exists in that location, delete it.  This
 	# is required in the case of symbolic links.
-	unlink("$path");
+	unlink($path);
 
-	open(my $fh, '>', "$path") or die $!;
+	open(my $fh, '>', $path) or return 0;
 	print($fh $value);
 	close($fh);
+
+	return 1;
 }
 
-# parse command-line options. all unrecognized options and arguments
-# are passed through to the 'git diff' command.
-my ($difftool_cmd, $dirdiff, $extcmd, $gui, $help, $prompt, $tool_help);
-GetOptions('g|gui!' => \$gui,
-	'd|dir-diff' => \$dirdiff,
-	'h' => \$help,
-	'prompt!' => \$prompt,
-	'y' => sub { $prompt = 0; },
-	't|tool:s' => \$difftool_cmd,
-	'tool-help' => \$tool_help,
-	'x|extcmd:s' => \$extcmd);
+sub main
+{
+	# parse command-line options. all unrecognized options and arguments
+	# are passed through to the 'git diff' command.
+	my %opts = (
+		difftool_cmd => undef,
+		dirdiff => undef,
+		extcmd => undef,
+		gui => undef,
+		help => undef,
+		prompt => undef,
+		symlinks => $^O ne 'cygwin' &&
+				$^O ne 'MSWin32' && $^O ne 'msys',
+		tool_help => undef,
+	);
+	GetOptions('g|gui!' => \$opts{gui},
+		'd|dir-diff' => \$opts{dirdiff},
+		'h' => \$opts{help},
+		'prompt!' => \$opts{prompt},
+		'y' => sub { $opts{prompt} = 0; },
+		'symlinks' => \$opts{symlinks},
+		'no-symlinks' => sub { $opts{symlinks} = 0; },
+		't|tool:s' => \$opts{difftool_cmd},
+		'tool-help' => \$opts{tool_help},
+		'x|extcmd:s' => \$opts{extcmd});
 
-if (defined($help)) {
-	usage(0);
-}
-if (defined($tool_help)) {
-	print_tool_help();
-}
-if (defined($difftool_cmd)) {
-	if (length($difftool_cmd) > 0) {
-		$ENV{GIT_DIFF_TOOL} = $difftool_cmd;
+	if (defined($opts{help})) {
+		usage(0);
+	}
+	if (defined($opts{tool_help})) {
+		print_tool_help();
+	}
+	if (defined($opts{difftool_cmd})) {
+		if (length($opts{difftool_cmd}) > 0) {
+			$ENV{GIT_DIFF_TOOL} = $opts{difftool_cmd};
+		} else {
+			print "No <tool> given for --tool=<tool>\n";
+			usage(1);
+		}
+	}
+	if (defined($opts{extcmd})) {
+		if (length($opts{extcmd}) > 0) {
+			$ENV{GIT_DIFFTOOL_EXTCMD} = $opts{extcmd};
+		} else {
+			print "No <cmd> given for --extcmd=<cmd>\n";
+			usage(1);
+		}
+	}
+	if ($opts{gui}) {
+		my $guitool = Git::config('diff.guitool');
+		if (length($guitool) > 0) {
+			$ENV{GIT_DIFF_TOOL} = $guitool;
+		}
+	}
+
+	# In directory diff mode, 'git-difftool--helper' is called once
+	# to compare the a/b directories.  In file diff mode, 'git diff'
+	# will invoke a separate instance of 'git-difftool--helper' for
+	# each file that changed.
+	if (defined($opts{dirdiff})) {
+		dir_diff($opts{extcmd}, $opts{symlinks});
 	} else {
-		print "No <tool> given for --tool=<tool>\n";
-		usage(1);
-	}
-}
-if (defined($extcmd)) {
-	if (length($extcmd) > 0) {
-		$ENV{GIT_DIFFTOOL_EXTCMD} = $extcmd;
-	} else {
-		print "No <cmd> given for --extcmd=<cmd>\n";
-		usage(1);
-	}
-}
-if ($gui) {
-	my $guitool = '';
-	$guitool = Git::config('diff.guitool');
-	if (length($guitool) > 0) {
-		$ENV{GIT_DIFF_TOOL} = $guitool;
+		file_diff($opts{prompt});
 	}
 }
 
-# In directory diff mode, 'git-difftool--helper' is called once
-# to compare the a/b directories.  In file diff mode, 'git diff'
-# will invoke a separate instance of 'git-difftool--helper' for
-# each file that changed.
-if (defined($dirdiff)) {
-	my ($a, $b) = setup_dir_diff();
+sub dir_diff
+{
+	my ($extcmd, $symlinks) = @_;
+	my $rc;
+	my $error = 0;
+	my $repo = Git->repository();
+	my $workdir = find_worktree($repo);
+	my ($a, $b, $tmpdir, @worktree) =
+		setup_dir_diff($repo, $workdir, $symlinks);
+
 	if (defined($extcmd)) {
 		$rc = system($extcmd, $a, $b);
 	} else {
 		$ENV{GIT_DIFFTOOL_DIRDIFF} = 'true';
 		$rc = system('git', 'difftool--helper', $a, $b);
 	}
-
-	exit($rc | ($rc >> 8)) if ($rc != 0);
-
 	# If the diff including working copy files and those
 	# files were modified during the diff, then the changes
-	# should be copied back to the working tree
-	for my $file (@working_tree) {
-		if (-e "$b/$file" && compare("$b/$file", "$workdir/$file")) {
-			copy("$b/$file", "$workdir/$file") or die $!;
-			chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!;
+	# should be copied back to the working tree.
+	# Do not copy back files when symlinks are used and the
+	# external tool did not replace the original link with a file.
+	for my $file (@worktree) {
+		next if $symlinks && -l "$b/$file";
+		next if ! -f "$b/$file";
+
+		my $diff = compare("$b/$file", "$workdir/$file");
+		if ($diff == 0) {
+			next;
+		} elsif ($diff == -1) {
+			my $errmsg = "warning: Could not compare ";
+			$errmsg += "'$b/$file' with '$workdir/$file'\n";
+			warn $errmsg;
+			$error = 1;
+		} elsif ($diff == 1) {
+			my $mode = stat("$b/$file")->mode;
+			copy("$b/$file", "$workdir/$file") or
+			exit_cleanup($tmpdir, 1);
+
+			chmod($mode, "$workdir/$file") or
+			exit_cleanup($tmpdir, 1);
 		}
 	}
-} else {
+	if ($error) {
+		warn "warning: Temporary files exist in '$tmpdir'.\n";
+		warn "warning: You may want to cleanup or recover these.\n";
+		exit(1);
+	} else {
+		exit_cleanup($tmpdir, $rc);
+	}
+}
+
+sub file_diff
+{
+	my ($prompt) = @_;
+
 	if (defined($prompt)) {
 		if ($prompt) {
 			$ENV{GIT_DIFFTOOL_PROMPT} = 'true';
@@ -362,3 +467,5 @@
 	my $rc = system('git', 'diff', @ARGV);
 	exit($rc | ($rc >> 8));
 }
+
+main();
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index f730253..f013a03 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -104,11 +104,47 @@
 
 	if merge_mode
 	then
-		merge_cmd "$1"
+		run_merge_cmd "$1"
+	else
+		run_diff_cmd "$1"
+	fi
+	return $status
+}
+
+# Run a either a configured or built-in diff tool
+run_diff_cmd () {
+	merge_tool_cmd="$(get_merge_tool_cmd "$1")"
+	if test -n "$merge_tool_cmd"
+	then
+		( eval $merge_tool_cmd )
+		status=$?
+		return $status
 	else
 		diff_cmd "$1"
 	fi
-	return $status
+}
+
+# Run a either a configured or built-in merge tool
+run_merge_cmd () {
+	merge_tool_cmd="$(get_merge_tool_cmd "$1")"
+	if test -n "$merge_tool_cmd"
+	then
+		trust_exit_code="$(git config --bool \
+			mergetool."$1".trustExitCode || echo false)"
+		if test "$trust_exit_code" = "false"
+		then
+			touch "$BACKUP"
+			( eval $merge_tool_cmd )
+			status=$?
+			check_unchanged
+		else
+			( eval $merge_tool_cmd )
+			status=$?
+		fi
+		return $status
+	else
+		merge_cmd "$1"
+	fi
 }
 
 list_merge_tool_candidates () {
@@ -126,7 +162,7 @@
 		else
 			tools="opendiff kdiff3 tkdiff xxdiff meld $tools"
 		fi
-		tools="$tools gvimdiff diffuse ecmerge p4merge araxis bc3"
+		tools="$tools gvimdiff diffuse ecmerge p4merge araxis bc3 codecompare"
 	fi
 	case "${VISUAL:-$EDITOR}" in
 	*vim*)
diff --git a/git-p4.py b/git-p4.py
index e67d37d..882b1bb 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -844,6 +844,9 @@
         return True
 
 class P4Submit(Command, P4UserMap):
+
+    conflict_behavior_choices = ("ask", "skip", "quit")
+
     def __init__(self):
         Command.__init__(self)
         P4UserMap.__init__(self)
@@ -853,12 +856,19 @@
                 # preserve the user, requires relevant p4 permissions
                 optparse.make_option("--preserve-user", dest="preserveUser", action="store_true"),
                 optparse.make_option("--export-labels", dest="exportLabels", action="store_true"),
+                optparse.make_option("--dry-run", "-n", dest="dry_run", action="store_true"),
+                optparse.make_option("--prepare-p4-only", dest="prepare_p4_only", action="store_true"),
+                optparse.make_option("--conflict", dest="conflict_behavior",
+                                     choices=self.conflict_behavior_choices)
         ]
         self.description = "Submit changes from git to the perforce depot."
         self.usage += " [name of git branch to submit into perforce depot]"
         self.origin = ""
         self.detectRenames = False
         self.preserveUser = gitConfig("git-p4.preserveUser").lower() == "true"
+        self.dry_run = False
+        self.prepare_p4_only = False
+        self.conflict_behavior = None
         self.isWindows = (platform.system() == "Windows")
         self.exportLabels = False
         self.p4HasMoveCommand = p4_has_command("move")
@@ -1088,7 +1098,10 @@
                 return False
 
     def applyCommit(self, id):
-        print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id))
+        """Apply one commit, return True if it succeeded."""
+
+        print "Applying", read_pipe(["git", "show", "-s",
+                                     "--format=format:%h %s", id])
 
         (p4User, gitEmail) = self.p4UserForCommit(id)
 
@@ -1195,34 +1208,13 @@
                     patch_succeeded = True
 
         if not patch_succeeded:
-            print "What do you want to do?"
-            response = "x"
-            while response != "s" and response != "a" and response != "w":
-                response = raw_input("[s]kip this patch / [a]pply the patch forcibly "
-                                     "and with .rej files / [w]rite the patch to a file (patch.txt) ")
-            if response == "s":
-                print "Skipping! Good luck with the next patches..."
-                for f in editedFiles:
-                    p4_revert(f)
-                for f in filesToAdd:
-                    os.remove(f)
-                return
-            elif response == "a":
-                os.system(applyPatchCmd)
-                if len(filesToAdd) > 0:
-                    print "You may also want to call p4 add on the following files:"
-                    print " ".join(filesToAdd)
-                if len(filesToDelete):
-                    print "The following files should be scheduled for deletion with p4 delete:"
-                    print " ".join(filesToDelete)
-                die("Please resolve and submit the conflict manually and "
-                    + "continue afterwards with git p4 submit --continue")
-            elif response == "w":
-                system(diffcmd + " > patch.txt")
-                print "Patch saved to patch.txt in %s !" % self.clientPath
-                die("Please resolve and submit the conflict manually and "
-                    "continue afterwards with git p4 submit --continue")
+            for f in editedFiles:
+                p4_revert(f)
+            return False
 
+        #
+        # Apply the patch for real, and do add/delete/+x handling.
+        #
         system(applyPatchCmd)
 
         for f in filesToAdd:
@@ -1236,6 +1228,10 @@
             mode = filesToChangeExecBit[f]
             setP4ExecBit(f, mode)
 
+        #
+        # Build p4 change description, starting with the contents
+        # of the git commit message.
+        #
         logMessage = extractLogMessageFromGitCommit(id)
         logMessage = logMessage.strip()
         (logMessage, jobs) = self.separate_jobs_from_description(logMessage)
@@ -1244,8 +1240,16 @@
         submitTemplate = self.prepareLogMessage(template, logMessage, jobs)
 
         if self.preserveUser:
-           submitTemplate = submitTemplate + ("\n######## Actual user %s, modified after commit\n" % p4User)
+           submitTemplate += "\n######## Actual user %s, modified after commit\n" % p4User
 
+        if self.checkAuthorship and not self.p4UserIsMe(p4User):
+            submitTemplate += "######## git author %s does not match your p4 account.\n" % gitEmail
+            submitTemplate += "######## Use option --preserve-user to modify authorship.\n"
+            submitTemplate += "######## Variable git-p4.skipUserNameCheck hides this message.\n"
+
+        separatorLine = "######## everything below this line is just the diff #######\n"
+
+        # diff
         if os.environ.has_key("P4DIFF"):
             del(os.environ["P4DIFF"])
         diff = ""
@@ -1253,6 +1257,7 @@
             diff += p4_read_pipe(['diff', '-du',
                                   wildcard_encode(editedFile)])
 
+        # new file diff
         newdiff = ""
         for newFile in filesToAdd:
             newdiff += "==== new file ====\n"
@@ -1263,13 +1268,7 @@
                 newdiff += "+" + line
             f.close()
 
-        if self.checkAuthorship and not self.p4UserIsMe(p4User):
-            submitTemplate += "######## git author %s does not match your p4 account.\n" % gitEmail
-            submitTemplate += "######## Use option --preserve-user to modify authorship.\n"
-            submitTemplate += "######## Variable git-p4.skipUserNameCheck hides this message.\n"
-
-        separatorLine = "######## everything below this line is just the diff #######\n"
-
+        # change description file: submitTemplate, separatorLine, diff, newdiff
         (handle, fileName) = tempfile.mkstemp()
         tmpFile = os.fdopen(handle, "w+")
         if self.isWindows:
@@ -1279,8 +1278,47 @@
         tmpFile.write(submitTemplate + separatorLine + diff + newdiff)
         tmpFile.close()
 
+        if self.prepare_p4_only:
+            #
+            # Leave the p4 tree prepared, and the submit template around
+            # and let the user decide what to do next
+            #
+            print
+            print "P4 workspace prepared for submission."
+            print "To submit or revert, go to client workspace"
+            print "  " + self.clientPath
+            print
+            print "To submit, use \"p4 submit\" to write a new description,"
+            print "or \"p4 submit -i %s\" to use the one prepared by" \
+                  " \"git p4\"." % fileName
+            print "You can delete the file \"%s\" when finished." % fileName
+
+            if self.preserveUser and p4User and not self.p4UserIsMe(p4User):
+                print "To preserve change ownership by user %s, you must\n" \
+                      "do \"p4 change -f <change>\" after submitting and\n" \
+                      "edit the User field."
+            if pureRenameCopy:
+                print "After submitting, renamed files must be re-synced."
+                print "Invoke \"p4 sync -f\" on each of these files:"
+                for f in pureRenameCopy:
+                    print "  " + f
+
+            print
+            print "To revert the changes, use \"p4 revert ...\", and delete"
+            print "the submit template file \"%s\"" % fileName
+            if filesToAdd:
+                print "Since the commit adds new files, they must be deleted:"
+                for f in filesToAdd:
+                    print "  " + f
+            print
+            return True
+
+        #
+        # Let the user edit the change description, then submit it.
+        #
         if self.edit_template(fileName):
             # read the edited message and submit
+            ret = True
             tmpFile = open(fileName, "rb")
             message = tmpFile.read()
             tmpFile.close()
@@ -1304,14 +1342,18 @@
 
         else:
             # skip this patch
+            ret = False
             print "Submission cancelled, undoing p4 changes."
             for f in editedFiles:
                 p4_revert(f)
             for f in filesToAdd:
                 p4_revert(f)
                 os.remove(f)
+            for f in filesToDelete:
+                p4_revert(f)
 
         os.remove(fileName)
+        return ret
 
     # Export git tags as p4 labels. Create a p4 label and then tag
     # with that.
@@ -1369,14 +1411,20 @@
             for mapping in clientSpec.mappings:
                 labelTemplate += "\t%s\n" % mapping.depot_side.path
 
-            p4_write_pipe(["label", "-i"], labelTemplate)
+            if self.dry_run:
+                print "Would create p4 label %s for tag" % name
+            elif self.prepare_p4_only:
+                print "Not creating p4 label %s for tag due to option" \
+                      " --prepare-p4-only" % name
+            else:
+                p4_write_pipe(["label", "-i"], labelTemplate)
 
-            # Use the label
-            p4_system(["tag", "-l", name] +
-                      ["%s@%s" % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings])
+                # Use the label
+                p4_system(["tag", "-l", name] +
+                          ["%s@%s" % (mapping.depot_side.path, changelist) for mapping in clientSpec.mappings])
 
-            if verbose:
-                print "created p4 label for tag %s" % name
+                if verbose:
+                    print "created p4 label for tag %s" % name
 
     def run(self, args):
         if len(args) == 0:
@@ -1403,6 +1451,16 @@
             if not self.canChangeChangelists():
                 die("Cannot preserve user names without p4 super-user or admin permissions")
 
+        # if not set from the command line, try the config file
+        if self.conflict_behavior is None:
+            val = gitConfig("git-p4.conflict")
+            if val:
+                if val not in self.conflict_behavior_choices:
+                    die("Invalid value '%s' for config git-p4.conflict" % val)
+            else:
+                val = "ask"
+            self.conflict_behavior = val
+
         if self.verbose:
             print "Origin branch is " + self.origin
 
@@ -1435,12 +1493,15 @@
             os.makedirs(self.clientPath)
 
         chdir(self.clientPath)
-        print "Synchronizing p4 checkout..."
-        if new_client_dir:
-            # old one was destroyed, and maybe nobody told p4
-            p4_sync("...", "-f")
+        if self.dry_run:
+            print "Would synchronize p4 checkout in %s" % self.clientPath
         else:
-            p4_sync("...")
+            print "Synchronizing p4 checkout..."
+            if new_client_dir:
+                # old one was destroyed, and maybe nobody told p4
+                p4_sync("...", "-f")
+            else:
+                p4_sync("...")
         self.check()
 
         commits = []
@@ -1487,14 +1548,64 @@
         if gitConfig("git-p4.detectCopiesHarder", "--bool") == "true":
             self.diffOpts += " --find-copies-harder"
 
-        while len(commits) > 0:
-            commit = commits[0]
-            commits = commits[1:]
-            self.applyCommit(commit)
+        #
+        # Apply the commits, one at a time.  On failure, ask if should
+        # continue to try the rest of the patches, or quit.
+        #
+        if self.dry_run:
+            print "Would apply"
+        applied = []
+        last = len(commits) - 1
+        for i, commit in enumerate(commits):
+            if self.dry_run:
+                print " ", read_pipe(["git", "show", "-s",
+                                      "--format=format:%h %s", commit])
+                ok = True
+            else:
+                ok = self.applyCommit(commit)
+            if ok:
+                applied.append(commit)
+            else:
+                if self.prepare_p4_only and i < last:
+                    print "Processing only the first commit due to option" \
+                          " --prepare-p4-only"
+                    break
+                if i < last:
+                    quit = False
+                    while True:
+                        # prompt for what to do, or use the option/variable
+                        if self.conflict_behavior == "ask":
+                            print "What do you want to do?"
+                            response = raw_input("[s]kip this commit but apply"
+                                                 " the rest, or [q]uit? ")
+                            if not response:
+                                continue
+                        elif self.conflict_behavior == "skip":
+                            response = "s"
+                        elif self.conflict_behavior == "quit":
+                            response = "q"
+                        else:
+                            die("Unknown conflict_behavior '%s'" %
+                                self.conflict_behavior)
 
-        if len(commits) == 0:
-            print "All changes applied!"
-            chdir(self.oldWorkingDirectory)
+                        if response[0] == "s":
+                            print "Skipping this commit, but applying the rest"
+                            break
+                        if response[0] == "q":
+                            print "Quitting"
+                            quit = True
+                            break
+                    if quit:
+                        break
+
+        chdir(self.oldWorkingDirectory)
+
+        if self.dry_run:
+            pass
+        elif self.prepare_p4_only:
+            pass
+        elif len(commits) == len(applied):
+            print "All commits applied!"
 
             sync = P4Sync()
             sync.run([])
@@ -1502,6 +1613,20 @@
             rebase = P4Rebase()
             rebase.rebase()
 
+        else:
+            if len(applied) == 0:
+                print "No commits applied."
+            else:
+                print "Applied only the commits marked with '*':"
+                for c in commits:
+                    if c in applied:
+                        star = "*"
+                    else:
+                        star = " "
+                    print star, read_pipe(["git", "show", "-s",
+                                           "--format=format:%h %s",  c])
+                print "You will have to do 'git p4 sync' and rebase."
+
         if gitConfig("git-p4.exportLabels", "--bool") == "true":
             self.exportLabels = True
 
@@ -1512,6 +1637,10 @@
             missingGitTags = gitTags - p4Labels
             self.exportGitTags(missingGitTags)
 
+        # exit with error unless everything applied perfecly
+        if len(commits) != len(applied):
+                sys.exit(1)
+
         return True
 
 class View(object):
@@ -1818,19 +1947,41 @@
         return files
 
     def stripRepoPath(self, path, prefixes):
+        """When streaming files, this is called to map a p4 depot path
+           to where it should go in git.  The prefixes are either
+           self.depotPaths, or self.branchPrefixes in the case of
+           branch detection."""
+
         if self.useClientSpec:
-            return self.clientSpecDirs.map_in_client(path)
+            # branch detection moves files up a level (the branch name)
+            # from what client spec interpretation gives
+            path = self.clientSpecDirs.map_in_client(path)
+            if self.detectBranches:
+                for b in self.knownBranches:
+                    if path.startswith(b + "/"):
+                        path = path[len(b)+1:]
 
-        if self.keepRepoPath:
-            prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]
+        elif self.keepRepoPath:
+            # Preserve everything in relative path name except leading
+            # //depot/; just look at first prefix as they all should
+            # be in the same depot.
+            depot = re.sub("^(//[^/]+/).*", r'\1', prefixes[0])
+            if p4PathStartsWith(path, depot):
+                path = path[len(depot):]
 
-        for p in prefixes:
-            if p4PathStartsWith(path, p):
-                path = path[len(p):]
+        else:
+            for p in prefixes:
+                if p4PathStartsWith(path, p):
+                    path = path[len(p):]
+                    break
 
+        path = wildcard_decode(path)
         return path
 
     def splitFilesIntoBranches(self, commit):
+        """Look at each depotFile in the commit to figure out to what
+           branch it belongs."""
+
         branches = {}
         fnum = 0
         while commit.has_key("depotFile%s" % fnum):
@@ -1848,12 +1999,16 @@
             file["type"] = commit["type%s" % fnum]
             fnum = fnum + 1
 
-            relPath = self.stripRepoPath(path, self.depotPaths)
-            relPath = wildcard_decode(relPath)
+            # start with the full relative path where this file would
+            # go in a p4 client
+            if self.useClientSpec:
+                relPath = self.clientSpecDirs.map_in_client(path)
+            else:
+                relPath = self.stripRepoPath(path, self.depotPaths)
 
             for branch in self.knownBranches.keys():
-
-                # add a trailing slash so that a commit into qt/4.2foo doesn't end up in qt/4.2
+                # add a trailing slash so that a commit into qt/4.2foo
+                # doesn't end up in qt/4.2, e.g.
                 if relPath.startswith(branch + "/"):
                     if branch not in branches:
                         branches[branch] = []
@@ -1867,7 +2022,6 @@
 
     def streamOneP4File(self, file, contents):
         relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes)
-        relPath = wildcard_decode(relPath)
         if verbose:
             sys.stderr.write("%s\n" % relPath)
 
@@ -1936,7 +2090,6 @@
 
     def streamOneP4Deletion(self, file):
         relPath = self.stripRepoPath(file['path'], self.branchPrefixes)
-        relPath = wildcard_decode(relPath)
         if verbose:
             sys.stderr.write("delete %s\n" % relPath)
         self.gitStream.write("D %s\n" % relPath)
@@ -2041,10 +2194,9 @@
         gitStream.write(description)
         gitStream.write("\n")
 
-    def commit(self, details, files, branch, branchPrefixes, parent = ""):
+    def commit(self, details, files, branch, parent = ""):
         epoch = details["time"]
         author = details["user"]
-        self.branchPrefixes = branchPrefixes
 
         if self.verbose:
             print "commit into %s" % branch
@@ -2053,7 +2205,7 @@
         # create a commit.
         new_files = []
         for f in files:
-            if [p for p in branchPrefixes if p4PathStartsWith(f['path'], p)]:
+            if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]:
                 new_files.append (f)
             else:
                 sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path'])
@@ -2070,8 +2222,8 @@
 
         self.gitStream.write("data <<EOT\n")
         self.gitStream.write(details["desc"])
-        self.gitStream.write("\n[git-p4: depot-paths = \"%s\": change = %s"
-                             % (','.join (branchPrefixes), details["change"]))
+        self.gitStream.write("\n[git-p4: depot-paths = \"%s\": change = %s" %
+                             (','.join(self.branchPrefixes), details["change"]))
         if len(details['options']) > 0:
             self.gitStream.write(": options = %s" % details['options'])
         self.gitStream.write("]\nEOT\n\n")
@@ -2094,7 +2246,7 @@
                 print "Change %s is labelled %s" % (change, labelDetails)
 
             files = p4CmdList(["files"] + ["%s...@%s" % (p, change)
-                                                    for p in branchPrefixes])
+                                                for p in self.branchPrefixes])
 
             if len(files) == len(labelRevisions):
 
@@ -2405,6 +2557,7 @@
                     for branch in branches.keys():
                         ## HACK  --hwn
                         branchPrefix = self.depotPaths[0] + branch + "/"
+                        self.branchPrefixes = [ branchPrefix ]
 
                         parent = ""
 
@@ -2449,19 +2602,19 @@
                             tempBranch = os.path.join(self.tempBranchLocation, "%d" % (change))
                             if self.verbose:
                                 print "Creating temporary branch: " + tempBranch
-                            self.commit(description, filesForCommit, tempBranch, [branchPrefix])
+                            self.commit(description, filesForCommit, tempBranch)
                             self.tempBranches.append(tempBranch)
                             self.checkpoint()
                             blob = self.searchParent(parent, branch, tempBranch)
                         if blob:
-                            self.commit(description, filesForCommit, branch, [branchPrefix], blob)
+                            self.commit(description, filesForCommit, branch, blob)
                         else:
                             if self.verbose:
                                 print "Parent of %s not found. Committing into head of %s" % (branch, parent)
-                            self.commit(description, filesForCommit, branch, [branchPrefix], parent)
+                            self.commit(description, filesForCommit, branch, parent)
                 else:
                     files = self.extractFilesFromCommit(description)
-                    self.commit(description, files, self.branch, self.depotPaths,
+                    self.commit(description, files, self.branch,
                                 self.initialParent)
                     self.initialParent = ""
             except IOError:
@@ -2525,7 +2678,7 @@
 
         self.updateOptionDict(details)
         try:
-            self.commit(details, self.extractFilesFromCommit(details), self.branch, self.depotPaths)
+            self.commit(details, self.extractFilesFromCommit(details), self.branch)
         except IOError:
             print "IO error with git fast-import. Is your git version recent enough?"
             print self.gitError.read()
@@ -2683,6 +2836,9 @@
 
         self.depotPaths = newPaths
 
+        # --detect-branches may change this for each branch
+        self.branchPrefixes = self.depotPaths
+
         self.loadUserMapFromCache()
         self.labels = {}
         if self.detectLabels:
@@ -2988,7 +3144,7 @@
 
     args = sys.argv[2:]
 
-    options.append(optparse.make_option("--verbose", dest="verbose", action="store_true"))
+    options.append(optparse.make_option("--verbose", "-v", dest="verbose", action="store_true"))
     if cmd.needsGit:
         options.append(optparse.make_option("--git-dir", dest="gitdir"))
 
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index a09e842..44901d5 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -115,6 +115,23 @@
 	fi
 }
 
+append_todo_help () {
+	cat >> "$todo" << EOF
+#
+# Commands:
+#  p, pick = use commit
+#  r, reword = use commit, but edit the commit message
+#  e, edit = use commit, but stop for amending
+#  s, squash = use commit, but meld into previous commit
+#  f, fixup = like "squash", but discard this commit's log message
+#  x, exec = run command (the rest of the line) using shell
+#
+# These lines can be re-ordered; they are executed from top to bottom.
+#
+# If you remove a line here THAT COMMIT WILL BE LOST.
+EOF
+}
+
 make_patch () {
 	sha1_and_parents="$(git rev-list --parents -1 "$1")"
 	case "$sha1_and_parents" in
@@ -544,6 +561,10 @@
 			warn
 			warn "	git rebase --continue"
 			warn
+			if test $status -eq 127		# command not found
+			then
+				status=1
+			fi
 			exit "$status"
 		elif test "$dirty" = t
 		then
@@ -558,11 +579,12 @@
 		;;
 	*)
 		warn "Unknown command: $command $sha1 $rest"
+		fixtodo="Please fix this using 'git rebase --edit-todo'."
 		if git rev-parse --verify -q "$sha1" >/dev/null
 		then
-			die_with_patch $sha1 "Please fix this in the file $todo."
+			die_with_patch $sha1 "$fixtodo"
 		else
-			die "Please fix this in the file $todo."
+			die "$fixtodo"
 		fi
 		;;
 	esac
@@ -775,6 +797,23 @@
 
 	do_rest
 	;;
+edit-todo)
+	sed -e '/^#/d' < "$todo" > "$todo".new
+	mv -f "$todo".new "$todo"
+	append_todo_help
+	cat >> "$todo" << EOF
+#
+# You are editing the todo file of an ongoing interactive rebase.
+# To continue rebase after editing, run:
+#     git rebase --continue
+#
+EOF
+
+	git_sequence_editor "$todo" ||
+		die "Could not execute editor"
+
+	exit
+	;;
 esac
 
 git var GIT_COMMITTER_IDENT >/dev/null ||
@@ -901,18 +940,10 @@
 cat >> "$todo" << EOF
 
 # Rebase $shortrevisions onto $shortonto
+EOF
+append_todo_help
+cat >> "$todo" << EOF
 #
-# Commands:
-#  p, pick = use commit
-#  r, reword = use commit, but edit the commit message
-#  e, edit = use commit, but stop for amending
-#  s, squash = use commit, but meld into previous commit
-#  f, fixup = like "squash", but discard this commit's log message
-#  x, exec = run command (the rest of the line) using shell
-#
-# These lines can be re-ordered; they are executed from top to bottom.
-#
-# If you remove a line here THAT COMMIT WILL BE LOST.
 # However, if you remove everything, the rebase will be aborted.
 #
 EOF
diff --git a/git-rebase.sh b/git-rebase.sh
index 15da926..b2f1c76 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -8,7 +8,7 @@
 OPTIONS_SPEC="\
 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
 git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
-git-rebase [-i] --continue | --abort | --skip
+git-rebase --continue | --abort | --skip | --edit-todo
 --
  Available options are
 v,verbose!         display a diffstat of what changed upstream
@@ -38,6 +38,7 @@
 continue!          continue
 abort!             abort and check out the original branch
 skip!              skip current patch and continue
+edit-todo!         edit the todo list during an interactive rebase
 "
 . git-sh-setup
 . git-sh-i18n
@@ -190,7 +191,7 @@
 	--verify)
 		ok_to_skip_pre_rebase=
 		;;
-	--continue|--skip|--abort)
+	--continue|--skip|--abort|--edit-todo)
 		test $total_argc -eq 2 || usage
 		action=${1##--}
 		;;
@@ -306,6 +307,11 @@
 	fi
 fi
 
+if test "$action" = "edit-todo" && test "$type" != "interactive"
+then
+	die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
+fi
+
 case "$action" in
 continue)
 	# Sanity check
@@ -338,6 +344,9 @@
 	rm -r "$state_dir"
 	exit
 	;;
+edit-todo)
+	run_specific_rebase
+	;;
 esac
 
 # Make sure no rebase is in progress
diff --git a/git-submodule.sh b/git-submodule.sh
index 3e2045e..ab6b110 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -1107,7 +1107,15 @@
 done
 
 # No command word defaults to "status"
-test -n "$command" || command=status
+if test -z "$command"
+then
+    if test $# = 0
+    then
+	command=status
+    else
+	usage
+    fi
+fi
 
 # "-b branch" is accepted only by "add"
 if test -n "$branch" && test "$command" != add
diff --git a/git-svn.perl b/git-svn.perl
index 828b8f0..0d77ffb 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -29,7 +29,16 @@
 use Git::SVN::Log;
 use Git::SVN::Migration;
 
-use Git::SVN::Utils qw(fatal can_compress);
+use Git::SVN::Utils qw(
+	fatal
+	can_compress
+	canonicalize_path
+	canonicalize_url
+	join_paths
+	add_path_to_url
+	join_paths
+);
+
 use Git qw(
 	git_cmd_try
 	command
@@ -1231,7 +1240,7 @@
 	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
 	$gs ||= Git::SVN->new;
 	my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum);
-	$gs->prop_walk($gs->{path}, $r, sub {
+	$gs->prop_walk($gs->path, $r, sub {
 		my ($gs, $path, $props) = @_;
 		print STDOUT "\n# $path\n";
 		my $s = $props->{'svn:ignore'} or return;
@@ -1247,7 +1256,7 @@
 	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
 	$gs ||= Git::SVN->new;
 	my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum);
-	$gs->prop_walk($gs->{path}, $r, sub {
+	$gs->prop_walk($gs->path, $r, sub {
 		my ($gs, $path, $props) = @_;
 		print STDOUT "\n# $path\n";
 		my $s = $props->{'svn:externals'} or return;
@@ -1262,7 +1271,7 @@
 	my ($url, $rev, $uuid, $gs) = working_head_info('HEAD');
 	$gs ||= Git::SVN->new;
 	my $r = (defined $_revision ? $_revision : $gs->ra->get_latest_revnum);
-	$gs->prop_walk($gs->{path}, $r, sub {
+	$gs->prop_walk($gs->path, $r, sub {
 		my ($gs, $path, $props) = @_;
 		# $path is of the form /path/to/dir/
 		$path = '.' . $path;
@@ -1292,31 +1301,6 @@
 	$gs->mkemptydirs($_revision);
 }
 
-sub canonicalize_path {
-	my ($path) = @_;
-	my $dot_slash_added = 0;
-	if (substr($path, 0, 1) ne "/") {
-		$path = "./" . $path;
-		$dot_slash_added = 1;
-	}
-	# File::Spec->canonpath doesn't collapse x/../y into y (for a
-	# good reason), so let's do this manually.
-	$path =~ s#/+#/#g;
-	$path =~ s#/\.(?:/|$)#/#g;
-	$path =~ s#/[^/]+/\.\.##g;
-	$path =~ s#/$##g;
-	$path =~ s#^\./## if $dot_slash_added;
-	$path =~ s#^/##;
-	$path =~ s#^\.$##;
-	return $path;
-}
-
-sub canonicalize_url {
-	my ($url) = @_;
-	$url =~ s#^([^:]+://[^/]*/)(.*)$#$1 . canonicalize_path($2)#e;
-	return $url;
-}
-
 # get_svnprops(PATH)
 # ------------------
 # Helper for cmd_propget and cmd_proplist below.
@@ -1330,7 +1314,7 @@
 	$path = $cmd_dir_prefix . $path;
 	fatal("No such file or directory: $path") unless -e $path;
 	my $is_dir = -d $path ? 1 : 0;
-	$path = $gs->{path} . '/' . $path;
+	$path = join_paths($gs->{path}, $path);
 
 	# canonicalize the path (otherwise libsvn will abort or fail to
 	# find the file)
@@ -1431,8 +1415,8 @@
 			fatal("Needed URL or usable git-svn --id in ",
 			      "the command-line\n", $usage);
 		}
-		$url = $gs->{url};
-		$svn_path = $gs->{path};
+		$url = $gs->url;
+		$svn_path = $gs->path;
 	}
 	unless (defined $_revision) {
 		fatal("-r|--revision is a required argument\n", $usage);
@@ -1466,24 +1450,6 @@
 	}
 }
 
-sub escape_uri_only {
-	my ($uri) = @_;
-	my @tmp;
-	foreach (split m{/}, $uri) {
-		s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
-		push @tmp, $_;
-	}
-	join('/', @tmp);
-}
-
-sub escape_url {
-	my ($url) = @_;
-	if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
-		my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3));
-		$url = "$scheme://$domain$uri";
-	}
-	$url;
-}
 
 sub cmd_info {
 	my $path = canonicalize_path(defined($_[0]) ? $_[0] : ".");
@@ -1508,21 +1474,21 @@
 	# canonicalize_path() will return "" to make libsvn 1.5.x happy,
 	$path = "." if $path eq "";
 
-	my $full_url = $url . ($fullpath eq "" ? "" : "/$fullpath");
+	my $full_url = canonicalize_url( add_path_to_url( $url, $fullpath ) );
 
 	if ($_url) {
-		print escape_url($full_url), "\n";
+		print "$full_url\n";
 		return;
 	}
 
 	my $result = "Path: $path\n";
 	$result .= "Name: " . basename($path) . "\n" if $file_type ne "dir";
-	$result .= "URL: " . escape_url($full_url) . "\n";
+	$result .= "URL: $full_url\n";
 
 	eval {
 		my $repos_root = $gs->repos_root;
 		Git::SVN::remove_username($repos_root);
-		$result .= "Repository Root: " . escape_url($repos_root) . "\n";
+		$result .= "Repository Root: " . canonicalize_url($repos_root) . "\n";
 	};
 	if ($@) {
 		$result .= "Repository Root: (offline)\n";
@@ -1669,7 +1635,9 @@
 
 sub complete_svn_url {
 	my ($url, $path) = @_;
-	$path =~ s#/+$##;
+	$path = canonicalize_path($path);
+
+	# If the path is not a URL...
 	if ($path !~ m#^[a-z\+]+://#) {
 		if (!defined $url || $url !~ m#^[a-z\+]+://#) {
 			fatal("E: '$path' is not a complete URL ",
@@ -1686,7 +1654,7 @@
 		print STDERR "W: $switch not specified\n";
 		return;
 	}
-	$repo_path =~ s#/+$##;
+	$repo_path = canonicalize_path($repo_path);
 	if ($repo_path =~ m#^[a-z\+]+://#) {
 		$ra = Git::SVN::Ra->new($repo_path);
 		$repo_path = '';
@@ -1697,18 +1665,18 @@
 			      "and a separate URL is not specified");
 		}
 	}
-	my $url = $ra->{url};
+	my $url = $ra->url;
 	my $gs = Git::SVN->init($url, undef, undef, undef, 1);
 	my $k = "svn-remote.$gs->{repo_id}.url";
 	my $orig_url = eval { command_oneline(qw/config --get/, $k) };
-	if ($orig_url && ($orig_url ne $gs->{url})) {
+	if ($orig_url && ($orig_url ne $gs->url)) {
 		die "$k already set: $orig_url\n",
-		    "wanted to set to: $gs->{url}\n";
+		    "wanted to set to: $gs->url\n";
 	}
-	command_oneline('config', $k, $gs->{url}) unless $orig_url;
-	my $remote_path = "$gs->{path}/$repo_path";
+	command_oneline('config', $k, $gs->url) unless $orig_url;
+
+	my $remote_path = join_paths( $gs->path, $repo_path );
 	$remote_path =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg;
-	$remote_path =~ s#/+#/#g;
 	$remote_path =~ s#^/##g;
 	$remote_path .= "/*" if $remote_path !~ /\*/;
 	my ($n) = ($switch =~ /^--(\w+)/);
diff --git a/gitk-git/gitk b/gitk-git/gitk
index 6f24f53..d93bd99 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -11533,6 +11533,11 @@
     exit 1
 }
 
+# Unset GIT_TRACE var if set
+if { [info exists ::env(GIT_TRACE)] } {
+    unset ::env(GIT_TRACE)
+}
+
 # defaults...
 set wrcomcmd "git diff-tree --stdin -p --pretty"
 
diff --git a/graph.c b/graph.c
index 7e0a099..e864fe2 100644
--- a/graph.c
+++ b/graph.c
@@ -8,6 +8,34 @@
 /* Internal API */
 
 /*
+ * Output the next line for a graph.
+ * This formats the next graph line into the specified strbuf.  It is not
+ * terminated with a newline.
+ *
+ * Returns 1 if the line includes the current commit, and 0 otherwise.
+ * graph_next_line() will return 1 exactly once for each time
+ * graph_update() is called.
+ */
+static int graph_next_line(struct git_graph *graph, struct strbuf *sb);
+
+/*
+ * Set up a custom scheme for column colors.
+ *
+ * The default column color scheme inserts ANSI color escapes to colorize
+ * the graph. The various color escapes are stored in an array of strings
+ * where each entry corresponds to a color, except for the last entry,
+ * which denotes the escape for resetting the color back to the default.
+ * When generating the graph, strings from this array are inserted before
+ * and after the various column characters.
+ *
+ * This function allows you to enable a custom array of color escapes.
+ * The 'colors_max' argument is the index of the last "reset" entry.
+ *
+ * This functions must be called BEFORE graph_init() is called.
+ */
+static void graph_set_column_colors(const char **colors, unsigned short colors_max);
+
+/*
  * Output a padding line in the graph.
  * This is similar to graph_next_line().  However, it is guaranteed to
  * never print the current commit line.  Instead, if the commit line is
@@ -62,7 +90,7 @@
 static const char **column_colors;
 static unsigned short column_colors_max;
 
-void graph_set_column_colors(const char **colors, unsigned short colors_max)
+static void graph_set_column_colors(const char **colors, unsigned short colors_max)
 {
 	column_colors = colors;
 	column_colors_max = colors_max;
@@ -1116,7 +1144,7 @@
 		graph_update_state(graph, GRAPH_PADDING);
 }
 
-int graph_next_line(struct git_graph *graph, struct strbuf *sb)
+static int graph_next_line(struct git_graph *graph, struct strbuf *sb)
 {
 	switch (graph->state) {
 	case GRAPH_PADDING:
diff --git a/graph.h b/graph.h
index aff960c..19b0f66 100644
--- a/graph.h
+++ b/graph.h
@@ -4,22 +4,6 @@
 /* A graph is a pointer to this opaque structure */
 struct git_graph;
 
-/*
- * Set up a custom scheme for column colors.
- *
- * The default column color scheme inserts ANSI color escapes to colorize
- * the graph. The various color escapes are stored in an array of strings
- * where each entry corresponds to a color, except for the last entry,
- * which denotes the escape for resetting the color back to the default.
- * When generating the graph, strings from this array are inserted before
- * and after the various column characters.
- *
- * This function allows you to enable a custom array of color escapes.
- * The 'colors_max' argument is the index of the last "reset" entry.
- *
- * This functions must be called BEFORE graph_init() is called.
- */
-void graph_set_column_colors(const char **colors, unsigned short colors_max);
 
 /*
  * Create a new struct git_graph.
@@ -49,17 +33,6 @@
  */
 int graph_is_commit_finished(struct git_graph const *graph);
 
-/*
- * Output the next line for a graph.
- * This formats the next graph line into the specified strbuf.  It is not
- * terminated with a newline.
- *
- * Returns 1 if the line includes the current commit, and 0 otherwise.
- * graph_next_line() will return 1 exactly once for each time
- * graph_update() is called.
- */
-int graph_next_line(struct git_graph *graph, struct strbuf *sb);
-
 
 /*
  * graph_show_*: helper functions for printing to stdout
diff --git a/grep.c b/grep.c
index 04e3ec6..898be6e 100644
--- a/grep.c
+++ b/grep.c
@@ -3,6 +3,10 @@
 #include "userdiff.h"
 #include "xdiff-interface.h"
 
+static int grep_source_load(struct grep_source *gs);
+static int grep_source_is_binary(struct grep_source *gs);
+
+
 static struct grep_pat *create_grep_pat(const char *pat, size_t patlen,
 					const char *origin, int no,
 					enum grep_pat_token t,
@@ -332,6 +336,87 @@
 	return compile_pattern_or(list);
 }
 
+static void indent(int in)
+{
+	while (in-- > 0)
+		fputc(' ', stderr);
+}
+
+static void dump_grep_pat(struct grep_pat *p)
+{
+	switch (p->token) {
+	case GREP_AND: fprintf(stderr, "*and*"); break;
+	case GREP_OPEN_PAREN: fprintf(stderr, "*(*"); break;
+	case GREP_CLOSE_PAREN: fprintf(stderr, "*)*"); break;
+	case GREP_NOT: fprintf(stderr, "*not*"); break;
+	case GREP_OR: fprintf(stderr, "*or*"); break;
+
+	case GREP_PATTERN: fprintf(stderr, "pattern"); break;
+	case GREP_PATTERN_HEAD: fprintf(stderr, "pattern_head"); break;
+	case GREP_PATTERN_BODY: fprintf(stderr, "pattern_body"); break;
+	}
+
+	switch (p->token) {
+	default: break;
+	case GREP_PATTERN_HEAD:
+		fprintf(stderr, "<head %d>", p->field); break;
+	case GREP_PATTERN_BODY:
+		fprintf(stderr, "<body>"); break;
+	}
+	switch (p->token) {
+	default: break;
+	case GREP_PATTERN_HEAD:
+	case GREP_PATTERN_BODY:
+	case GREP_PATTERN:
+		fprintf(stderr, "%.*s", (int)p->patternlen, p->pattern);
+		break;
+	}
+	fputc('\n', stderr);
+}
+
+static void dump_grep_expression_1(struct grep_expr *x, int in)
+{
+	indent(in);
+	switch (x->node) {
+	case GREP_NODE_TRUE:
+		fprintf(stderr, "true\n");
+		break;
+	case GREP_NODE_ATOM:
+		dump_grep_pat(x->u.atom);
+		break;
+	case GREP_NODE_NOT:
+		fprintf(stderr, "(not\n");
+		dump_grep_expression_1(x->u.unary, in+1);
+		indent(in);
+		fprintf(stderr, ")\n");
+		break;
+	case GREP_NODE_AND:
+		fprintf(stderr, "(and\n");
+		dump_grep_expression_1(x->u.binary.left, in+1);
+		dump_grep_expression_1(x->u.binary.right, in+1);
+		indent(in);
+		fprintf(stderr, ")\n");
+		break;
+	case GREP_NODE_OR:
+		fprintf(stderr, "(or\n");
+		dump_grep_expression_1(x->u.binary.left, in+1);
+		dump_grep_expression_1(x->u.binary.right, in+1);
+		indent(in);
+		fprintf(stderr, ")\n");
+		break;
+	}
+}
+
+static void dump_grep_expression(struct grep_opt *opt)
+{
+	struct grep_expr *x = opt->pattern_expression;
+
+	if (opt->all_match)
+		fprintf(stderr, "[all-match]\n");
+	dump_grep_expression_1(x, 0);
+	fflush(NULL);
+}
+
 static struct grep_expr *grep_true_expr(void)
 {
 	struct grep_expr *z = xcalloc(1, sizeof(*z));
@@ -395,7 +480,23 @@
 	return header_expr;
 }
 
-void compile_grep_patterns(struct grep_opt *opt)
+static struct grep_expr *grep_splice_or(struct grep_expr *x, struct grep_expr *y)
+{
+	struct grep_expr *z = x;
+
+	while (x) {
+		assert(x->node == GREP_NODE_OR);
+		if (x->u.binary.right &&
+		    x->u.binary.right->node == GREP_NODE_TRUE) {
+			x->u.binary.right = y;
+			break;
+		}
+		x = x->u.binary.right;
+	}
+	return z;
+}
+
+static void compile_grep_patterns_real(struct grep_opt *opt)
 {
 	struct grep_pat *p;
 	struct grep_expr *header_expr = prep_header_patterns(opt);
@@ -415,7 +516,7 @@
 
 	if (opt->all_match || header_expr)
 		opt->extended = 1;
-	else if (!opt->extended)
+	else if (!opt->extended && !opt->debug)
 		return;
 
 	p = opt->pattern_list;
@@ -429,12 +530,22 @@
 
 	if (!opt->pattern_expression)
 		opt->pattern_expression = header_expr;
+	else if (opt->all_match)
+		opt->pattern_expression = grep_splice_or(header_expr,
+							 opt->pattern_expression);
 	else
 		opt->pattern_expression = grep_or_expr(opt->pattern_expression,
 						       header_expr);
 	opt->all_match = 1;
 }
 
+void compile_grep_patterns(struct grep_opt *opt)
+{
+	compile_grep_patterns_real(opt);
+	if (opt->debug)
+		dump_grep_expression(opt);
+}
+
 static void free_pattern_expr(struct grep_expr *x)
 {
 	switch (x->node) {
@@ -1358,7 +1469,7 @@
 	return 0;
 }
 
-int grep_source_load(struct grep_source *gs)
+static int grep_source_load(struct grep_source *gs)
 {
 	if (gs->buf)
 		return 0;
@@ -1386,7 +1497,7 @@
 	grep_attr_unlock();
 }
 
-int grep_source_is_binary(struct grep_source *gs)
+static int grep_source_is_binary(struct grep_source *gs)
 {
 	grep_source_load_driver(gs);
 	if (gs->driver->binary != -1)
diff --git a/grep.h b/grep.h
index ed7de6b..8a28a67 100644
--- a/grep.h
+++ b/grep.h
@@ -58,6 +58,14 @@
 	GREP_NODE_OR
 };
 
+enum grep_pattern_type {
+	GREP_PATTERN_TYPE_UNSPECIFIED = 0,
+	GREP_PATTERN_TYPE_BRE,
+	GREP_PATTERN_TYPE_ERE,
+	GREP_PATTERN_TYPE_FIXED,
+	GREP_PATTERN_TYPE_PCRE
+};
+
 struct grep_expr {
 	enum grep_expr_node node;
 	unsigned hit;
@@ -90,6 +98,7 @@
 	int word_regexp;
 	int fixed;
 	int all_match;
+	int debug;
 #define GREP_BINARY_DEFAULT	0
 #define GREP_BINARY_NOMATCH	1
 #define GREP_BINARY_TEXT	2
@@ -103,6 +112,8 @@
 	int max_depth;
 	int funcname;
 	int funcbody;
+	int extended_regexp_option;
+	int pattern_type_option;
 	char color_context[COLOR_MAXLEN];
 	char color_filename[COLOR_MAXLEN];
 	char color_function[COLOR_MAXLEN];
@@ -148,11 +159,10 @@
 
 void grep_source_init(struct grep_source *gs, enum grep_source_type type,
 		      const char *name, const void *identifier);
-int grep_source_load(struct grep_source *gs);
 void grep_source_clear_data(struct grep_source *gs);
 void grep_source_clear(struct grep_source *gs);
 void grep_source_load_driver(struct grep_source *gs);
-int grep_source_is_binary(struct grep_source *gs);
+
 
 int grep_source(struct grep_opt *opt, struct grep_source *gs);
 
diff --git a/http-push.c b/http-push.c
index a832ca7..8701c12 100644
--- a/http-push.c
+++ b/http-push.c
@@ -1610,9 +1610,8 @@
 {
 	struct commit *head = lookup_commit_or_die(head_sha1, "HEAD");
 	struct commit *branch = lookup_commit_or_die(remote->old_sha1, remote->name);
-	struct commit_list *merge_bases = get_merge_bases(head, branch, 1);
 
-	return (merge_bases && !merge_bases->next && merge_bases->item == branch);
+	return in_merge_bases(branch, head);
 }
 
 static int delete_remote_branch(const char *pattern, int force)
diff --git a/http-walker.c b/http-walker.c
index 51a906e..1516c5e 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -396,7 +396,7 @@
 	return ret;
 }
 
-static int fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
+static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1)
 {
 	struct packed_git *target;
 	int ret;
@@ -524,7 +524,7 @@
 	if (!fetch_object(walker, altbase, sha1))
 		return 0;
 	while (altbase) {
-		if (!fetch_pack(walker, altbase, sha1))
+		if (!http_fetch_pack(walker, altbase, sha1))
 			return 0;
 		fetch_alternates(walker, data->alt->base);
 		altbase = altbase->next;
diff --git a/http.c b/http.c
index 9bac1d8..345c171 100644
--- a/http.c
+++ b/http.c
@@ -818,6 +818,7 @@
 
 	curl_easy_setopt(slot->curl, CURLOPT_URL, url);
 	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
+	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip");
 
 	if (start_active_slot(slot)) {
 		run_active_slot(slot);
diff --git a/ident.c b/ident.c
index 484e0a9..a4bf206 100644
--- a/ident.c
+++ b/ident.c
@@ -93,7 +93,7 @@
 	add_domainname(email);
 }
 
-const char *ident_default_name(void)
+static const char *ident_default_name(void)
 {
 	if (!git_default_name.len) {
 		copy_gecos(xgetpwuid_self(), &git_default_name);
@@ -117,7 +117,7 @@
 	return git_default_email.buf;
 }
 
-const char *ident_default_date(void)
+static const char *ident_default_date(void)
 {
 	if (!git_default_date[0])
 		datestamp(git_default_date, sizeof(git_default_date));
diff --git a/ll-merge.c b/ll-merge.c
index f3f7692..acea33b 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -35,7 +35,7 @@
  */
 static int ll_binary_merge(const struct ll_merge_driver *drv_unused,
 			   mmbuffer_t *result,
-			   const char *path_unused,
+			   const char *path,
 			   mmfile_t *orig, const char *orig_name,
 			   mmfile_t *src1, const char *name1,
 			   mmfile_t *src2, const char *name2,
@@ -46,16 +46,34 @@
 	assert(opts);
 
 	/*
-	 * The tentative merge result is "ours" for the final round,
-	 * or common ancestor for an internal merge.  Still return
-	 * "conflicted merge" status.
+	 * The tentative merge result is the or common ancestor for an internal merge.
 	 */
-	stolen = opts->virtual_ancestor ? orig : src1;
+	if (opts->virtual_ancestor) {
+		stolen = orig;
+	} else {
+		switch (opts->variant) {
+		default:
+			warning("Cannot merge binary files: %s (%s vs. %s)",
+				path, name1, name2);
+			/* fallthru */
+		case XDL_MERGE_FAVOR_OURS:
+			stolen = src1;
+			break;
+		case XDL_MERGE_FAVOR_THEIRS:
+			stolen = src2;
+			break;
+		}
+	}
 
 	result->ptr = stolen->ptr;
 	result->size = stolen->size;
 	stolen->ptr = NULL;
-	return 1;
+
+	/*
+	 * With -Xtheirs or -Xours, we have cleanly merged;
+	 * otherwise we got a conflict.
+	 */
+	return (opts->variant ? 0 : 1);
 }
 
 static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
@@ -73,8 +91,6 @@
 	if (buffer_is_binary(orig->ptr, orig->size) ||
 	    buffer_is_binary(src1->ptr, src1->size) ||
 	    buffer_is_binary(src2->ptr, src2->size)) {
-		warning("Cannot merge binary files: %s (%s vs. %s)",
-			path, name1, name2);
 		return ll_binary_merge(drv_unused, result,
 				       path,
 				       orig, orig_name,
diff --git a/merge-recursive.c b/merge-recursive.c
index 7866ca1..d882060 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -844,14 +844,14 @@
 	if (strcmp(a->path, b->path) ||
 	    (o->ancestor != NULL && strcmp(a->path, one->path) != 0)) {
 		base_name = o->ancestor == NULL ? NULL :
-			xstrdup(mkpath("%s:%s", o->ancestor, one->path));
-		name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
-		name2 = xstrdup(mkpath("%s:%s", branch2, b->path));
+			mkpathdup("%s:%s", o->ancestor, one->path);
+		name1 = mkpathdup("%s:%s", branch1, a->path);
+		name2 = mkpathdup("%s:%s", branch2, b->path);
 	} else {
 		base_name = o->ancestor == NULL ? NULL :
-			xstrdup(mkpath("%s", o->ancestor));
-		name1 = xstrdup(mkpath("%s", branch1));
-		name2 = xstrdup(mkpath("%s", branch2));
+			mkpathdup("%s", o->ancestor);
+		name1 = mkpathdup("%s", branch1);
+		name2 = mkpathdup("%s", branch2);
 	}
 
 	read_mmblob(&orig, one->sha1);
@@ -861,6 +861,7 @@
 	merge_status = ll_merge(result_buf, a->path, &orig, base_name,
 				&src1, name1, &src2, name2, &ll_opts);
 
+	free(base_name);
 	free(name1);
 	free(name2);
 	free(orig.ptr);
diff --git a/mergetools/codecompare b/mergetools/codecompare
new file mode 100644
index 0000000..3f0486b
--- /dev/null
+++ b/mergetools/codecompare
@@ -0,0 +1,25 @@
+diff_cmd () {
+	"$merge_tool_path" "$LOCAL" "$REMOTE"
+}
+
+merge_cmd () {
+	touch "$BACKUP"
+	if $base_present
+	then
+		"$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" -BF="$BASE" \
+			-RF="$MERGED"
+	else
+		"$merge_tool_path" -MF="$LOCAL" -TF="$REMOTE" \
+			-RF="$MERGED"
+	fi
+	check_unchanged
+}
+
+translate_merge_tool_path() {
+	if merge_mode
+	then
+		echo CodeMerge
+	else
+		echo CodeCompare
+	fi
+}
diff --git a/mergetools/defaults b/mergetools/defaults
index 1d8f2a3..21e63ec 100644
--- a/mergetools/defaults
+++ b/mergetools/defaults
@@ -8,36 +8,12 @@
 }
 
 diff_cmd () {
-	merge_tool_cmd="$(get_merge_tool_cmd "$1")"
-	if test -z "$merge_tool_cmd"
-	then
-		status=1
-		break
-	fi
-	( eval $merge_tool_cmd )
-	status=$?
+	status=1
 	return $status
 }
 
 merge_cmd () {
-	merge_tool_cmd="$(get_merge_tool_cmd "$1")"
-	if test -z "$merge_tool_cmd"
-	then
-		status=1
-		break
-	fi
-	trust_exit_code="$(git config --bool \
-		mergetool."$1".trustExitCode || echo false)"
-	if test "$trust_exit_code" = "false"
-	then
-		touch "$BACKUP"
-		( eval $merge_tool_cmd )
-		status=$?
-		check_unchanged
-	else
-		( eval $merge_tool_cmd )
-		status=$?
-	fi
+	status=1
 	return $status
 }
 
diff --git a/notes.c b/notes.c
index 93e9868..bc454e1 100644
--- a/notes.c
+++ b/notes.c
@@ -1196,8 +1196,18 @@
 	memset(t, 0, sizeof(struct notes_tree));
 }
 
-void format_note(struct notes_tree *t, const unsigned char *object_sha1,
-		struct strbuf *sb, const char *output_encoding, int flags)
+/*
+ * Fill the given strbuf with the notes associated with the given object.
+ *
+ * If the given notes_tree structure is not initialized, it will be auto-
+ * initialized to the default value (see documentation for init_notes() above).
+ * If the given notes_tree is NULL, the internal/default notes_tree will be
+ * used instead.
+ *
+ * 'flags' is a bitwise combination of the flags for format_display_notes.
+ */
+static void format_note(struct notes_tree *t, const unsigned char *object_sha1,
+			struct strbuf *sb, const char *output_encoding, int flags)
 {
 	static const char utf8[] = "utf-8";
 	const unsigned char *sha1;
diff --git a/notes.h b/notes.h
index c716694..3592b19 100644
--- a/notes.h
+++ b/notes.h
@@ -241,20 +241,6 @@
 #define NOTES_SHOW_HEADER 1
 #define NOTES_INDENT 2
 
-/*
- * Fill the given strbuf with the notes associated with the given object.
- *
- * If the given notes_tree structure is not initialized, it will be auto-
- * initialized to the default value (see documentation for init_notes() above).
- * If the given notes_tree is NULL, the internal/default notes_tree will be
- * used instead.
- *
- * 'flags' is a bitwise combination of the above formatting flags.
- */
-void format_note(struct notes_tree *t, const unsigned char *object_sha1,
-		struct strbuf *sb, const char *output_encoding, int flags);
-
-
 struct string_list;
 
 struct display_notes_opt {
diff --git a/parse-options.h b/parse-options.h
index 77a4a8b..71a39c6 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -238,6 +238,6 @@
 #define OPT__COLOR(var, h) \
 	OPT_COLOR_FLAG(0, "color", (var), (h))
 #define OPT_COLUMN(s, l, v, h) \
-	{ OPTION_CALLBACK, (s), (l), (v), "style", (h), PARSE_OPT_OPTARG, parseopt_column_callback }
+	{ OPTION_CALLBACK, (s), (l), (v), N_("style"), (h), PARSE_OPT_OPTARG, parseopt_column_callback }
 
 #endif
diff --git a/path.c b/path.c
index 66acd24..cbbdf7d 100644
--- a/path.c
+++ b/path.c
@@ -48,7 +48,7 @@
 	return cleanup_path(buf);
 }
 
-static char *git_vsnpath(char *buf, size_t n, const char *fmt, va_list args)
+static char *vsnpath(char *buf, size_t n, const char *fmt, va_list args)
 {
 	const char *git_dir = get_git_dir();
 	size_t len;
@@ -70,21 +70,22 @@
 
 char *git_snpath(char *buf, size_t n, const char *fmt, ...)
 {
+	char *ret;
 	va_list args;
 	va_start(args, fmt);
-	(void)git_vsnpath(buf, n, fmt, args);
+	ret = vsnpath(buf, n, fmt, args);
 	va_end(args);
-	return buf;
+	return ret;
 }
 
 char *git_pathdup(const char *fmt, ...)
 {
-	char path[PATH_MAX];
+	char path[PATH_MAX], *ret;
 	va_list args;
 	va_start(args, fmt);
-	(void)git_vsnpath(path, sizeof(path), fmt, args);
+	ret = vsnpath(path, sizeof(path), fmt, args);
 	va_end(args);
-	return xstrdup(path);
+	return xstrdup(ret);
 }
 
 char *mkpathdup(const char *fmt, ...)
@@ -118,23 +119,14 @@
 
 char *git_path(const char *fmt, ...)
 {
-	const char *git_dir = get_git_dir();
 	char *pathname = get_pathname();
 	va_list args;
-	unsigned len;
+	char *ret;
 
-	len = strlen(git_dir);
-	if (len > PATH_MAX-100)
-		return bad_path;
-	memcpy(pathname, git_dir, len);
-	if (len && git_dir[len-1] != '/')
-		pathname[len++] = '/';
 	va_start(args, fmt);
-	len += vsnprintf(pathname + len, PATH_MAX - len, fmt, args);
+	ret = vsnpath(pathname, PATH_MAX, fmt, args);
 	va_end(args);
-	if (len >= PATH_MAX)
-		return bad_path;
-	return cleanup_path(pathname);
+	return ret;
 }
 
 void home_config_paths(char **global, char **xdg, char *file)
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index 8478d0c..acb2539 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -23,7 +23,14 @@
     command_output_pipe
     command_close_pipe
 );
-use Git::SVN::Utils qw(fatal can_compress);
+use Git::SVN::Utils qw(
+	fatal
+	can_compress
+	join_paths
+	canonicalize_path
+	canonicalize_url
+	add_path_to_url
+);
 
 my $can_use_yaml;
 BEGIN {
@@ -195,9 +202,9 @@
 		} elsif (m!^(.+)\.usesvmprops=\s*(.*)\s*$!) {
 			$r->{$1}->{svm} = {};
 		} elsif (m!^(.+)\.url=\s*(.*)\s*$!) {
-			$r->{$1}->{url} = $2;
+			$r->{$1}->{url} = canonicalize_url($2);
 		} elsif (m!^(.+)\.pushurl=\s*(.*)\s*$!) {
-			$r->{$1}->{pushurl} = $2;
+			$r->{$1}->{pushurl} = canonicalize_url($2);
 		} elsif (m!^(.+)\.ignore-refs=\s*(.*)\s*$!) {
 			$r->{$1}->{ignore_refs_regex} = $2;
 		} elsif (m!^(.+)\.(branches|tags)=$svn_refspec$!) {
@@ -290,7 +297,7 @@
 
 sub init_remote_config {
 	my ($self, $url, $no_write) = @_;
-	$url =~ s!/+$!!; # strip trailing slash
+	$url = canonicalize_url($url);
 	my $r = read_all_remotes();
 	my $existing = find_existing_remote($url, $r);
 	if ($existing) {
@@ -314,12 +321,10 @@
 				print STDERR "Using higher level of URL: ",
 					     "$url => $min_url\n";
 			}
-			my $old_path = $self->{path};
-			$self->{path} = $url;
-			$self->{path} =~ s!^\Q$min_url\E(/|$)!!;
-			if (length $old_path) {
-				$self->{path} .= "/$old_path";
-			}
+			my $old_path = $self->path;
+			$url =~ s!^\Q$min_url\E(/|$)!!;
+			$url = join_paths($url, $old_path);
+			$self->path($url);
 			$url = $min_url;
 		}
 	}
@@ -343,18 +348,22 @@
 	unless ($no_write) {
 		command_noisy('config',
 			      "svn-remote.$self->{repo_id}.url", $url);
-		$self->{path} =~ s{^/}{};
-		$self->{path} =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg;
+		my $path = $self->path;
+		$path =~ s{^/}{};
+		$path =~ s{%([0-9A-F]{2})}{chr hex($1)}ieg;
+		$self->path($path);
 		command_noisy('config', '--add',
 			      "svn-remote.$self->{repo_id}.fetch",
-			      "$self->{path}:".$self->refname);
+			      $self->path.":".$self->refname);
 	}
-	$self->{url} = $url;
+	$self->url($url);
 }
 
 sub find_by_url { # repos_root and, path are optional
 	my ($class, $full_url, $repos_root, $path) = @_;
 
+	$full_url = canonicalize_url($full_url);
+
 	return undef unless defined $full_url;
 	remove_username($full_url);
 	remove_username($repos_root) if defined $repos_root;
@@ -393,6 +402,11 @@
 			}
 			$p =~ s#^\Q$z\E(?:/|$)#$prefix# or next;
 		}
+
+		# remote fetch paths are not URI escaped.  Decode ours
+		# so they match
+		$p = uri_decode($p);
+
 		foreach my $f (keys %$fetch) {
 			next if $f ne $p;
 			return Git::SVN->new($fetch->{$f}, $repo_id, $f);
@@ -435,20 +449,25 @@
 		}
 	}
 	my $self = _new($class, $repo_id, $ref_id, $path);
-	if (!defined $self->{path} || !length $self->{path}) {
+	if (!defined $self->path || !length $self->path) {
 		my $fetch = command_oneline('config', '--get',
 		                            "svn-remote.$repo_id.fetch",
 		                            ":$ref_id\$") or
 		     die "Failed to read \"svn-remote.$repo_id.fetch\" ",
 		         "\":$ref_id\$\" in config\n";
-		($self->{path}, undef) = split(/\s*:\s*/, $fetch);
+		my($path) = split(/\s*:\s*/, $fetch);
+		$self->path($path);
 	}
-	$self->{path} =~ s{/+}{/}g;
-	$self->{path} =~ s{\A/}{};
-	$self->{path} =~ s{/\z}{};
-	$self->{url} = command_oneline('config', '--get',
-	                               "svn-remote.$repo_id.url") or
+	{
+		my $path = $self->path;
+		$path =~ s{\A/}{};
+		$path =~ s{/\z}{};
+		$self->path($path);
+	}
+	my $url = command_oneline('config', '--get',
+	                          "svn-remote.$repo_id.url") or
                   die "Failed to read \"svn-remote.$repo_id.url\" in config\n";
+	$self->url($url);
 	$self->{pushurl} = eval { command_oneline('config', '--get',
 	                          "svn-remote.$repo_id.pushurl") };
 	$self->rebuild;
@@ -552,8 +571,7 @@
 		# username is of no interest
 		$src =~ s{(^[a-z\+]*://)[^/@]*@}{$1};
 
-		my $replace = $ra->{url};
-		$replace .= "/$path" if length $path;
+		my $replace = add_path_to_url($ra->url, $path);
 
 		my $section = "svn-remote.$self->{repo_id}";
 		tmp_config("$section.svm-source", $src);
@@ -567,20 +585,21 @@
 	}
 
 	my $r = $ra->get_latest_revnum;
-	my $path = $self->{path};
+	my $path = $self->path;
 	my %tried;
 	while (length $path) {
-		unless ($tried{"$self->{url}/$path"}) {
+		my $try = add_path_to_url($self->url, $path);
+		unless ($tried{$try}) {
 			return $ra if $self->read_svm_props($ra, $path, $r);
-			$tried{"$self->{url}/$path"} = 1;
+			$tried{$try} = 1;
 		}
 		$path =~ s#/?[^/]+$##;
 	}
 	die "Path: '$path' should be ''\n" if $path ne '';
 	return $ra if $self->read_svm_props($ra, $path, $r);
-	$tried{"$self->{url}/$path"} = 1;
+	$tried{ add_path_to_url($self->url, $path) } = 1;
 
-	if ($ra->{repos_root} eq $self->{url}) {
+	if ($ra->{repos_root} eq $self->url) {
 		die @err, (map { "  $_\n" } keys %tried), "\n";
 	}
 
@@ -590,20 +609,21 @@
 	$path = $ra->{svn_path};
 	$ra = Git::SVN::Ra->new($ra->{repos_root});
 	while (length $path) {
-		unless ($tried{"$ra->{url}/$path"}) {
+		my $try = add_path_to_url($ra->url, $path);
+		unless ($tried{$try}) {
 			$ok = $self->read_svm_props($ra, $path, $r);
 			last if $ok;
-			$tried{"$ra->{url}/$path"} = 1;
+			$tried{$try} = 1;
 		}
 		$path =~ s#/?[^/]+$##;
 	}
 	die "Path: '$path' should be ''\n" if $path ne '';
 	$ok ||= $self->read_svm_props($ra, $path, $r);
-	$tried{"$ra->{url}/$path"} = 1;
+	$tried{ add_path_to_url($ra->url, $path) } = 1;
 	if (!$ok) {
 		die @err, (map { "  $_\n" } keys %tried), "\n";
 	}
-	Git::SVN::Ra->new($self->{url});
+	Git::SVN::Ra->new($self->url);
 }
 
 sub svnsync {
@@ -670,7 +690,7 @@
 		if (!$@ && $uuid && $uuid =~ /^([a-f\d\-]{30,})$/i) {
 			$self->{ra_uuid} = $uuid;
 		} else {
-			die "ra_uuid called without URL\n" unless $self->{url};
+			die "ra_uuid called without URL\n" unless $self->url;
 			$self->{ra_uuid} = $self->ra->get_uuid;
 			tmp_config('--add', $key, $self->{ra_uuid});
 		}
@@ -694,7 +714,7 @@
 
 sub ra {
 	my ($self) = shift;
-	my $ra = Git::SVN::Ra->new($self->{url});
+	my $ra = Git::SVN::Ra->new($self->url);
 	$self->_set_repos_root($ra->{repos_root});
 	if ($self->use_svm_props && !$self->{svm}) {
 		if ($self->no_metadata) {
@@ -728,7 +748,7 @@
 	$path =~ s#^/*#/#g;
 	my $p = $path;
 	# Strip the irrelevant part of the path.
-	$p =~ s#^/+\Q$self->{path}\E(/|$)#/#;
+	$p =~ s#^/+\Q@{[$self->path]}\E(/|$)#/#;
 	# Ensure the path is terminated by a `/'.
 	$p =~ s#/*$#/#;
 
@@ -749,7 +769,7 @@
 
 	foreach (sort keys %$dirent) {
 		next if $dirent->{$_}->{kind} != $SVN::Node::dir;
-		$self->prop_walk($self->{path} . $p . $_, $rev, $sub);
+		$self->prop_walk($self->path . $p . $_, $rev, $sub);
 	}
 }
 
@@ -919,20 +939,19 @@
 
 sub metadata_url {
 	my ($self) = @_;
-	($self->rewrite_root || $self->{url}) .
-	   (length $self->{path} ? '/' . $self->{path} : '');
+	my $url = $self->rewrite_root || $self->url;
+	return canonicalize_url( add_path_to_url( $url, $self->path ) );
 }
 
 sub full_url {
 	my ($self) = @_;
-	$self->{url} . (length $self->{path} ? '/' . $self->{path} : '');
+	return canonicalize_url( add_path_to_url( $self->url, $self->path ) );
 }
 
 sub full_pushurl {
 	my ($self) = @_;
 	if ($self->{pushurl}) {
-		return $self->{pushurl} . (length $self->{path} ? '/' .
-		       $self->{path} : '');
+		return canonicalize_url( add_path_to_url( $self->{pushurl}, $self->path ) );
 	} else {
 		return $self->full_url;
 	}
@@ -1048,20 +1067,20 @@
 
 sub match_paths {
 	my ($self, $paths, $r) = @_;
-	return 1 if $self->{path} eq '';
-	if (my $path = $paths->{"/$self->{path}"}) {
+	return 1 if $self->path eq '';
+	if (my $path = $paths->{"/".$self->path}) {
 		return ($path->{action} eq 'D') ? 0 : 1;
 	}
-	$self->{path_regex} ||= qr/^\/\Q$self->{path}\E\//;
+	$self->{path_regex} ||= qr{^/\Q@{[$self->path]}\E/};
 	if (grep /$self->{path_regex}/, keys %$paths) {
 		return 1;
 	}
 	my $c = '';
-	foreach (split m#/#, $self->{path}) {
+	foreach (split m#/#, $self->path) {
 		$c .= "/$_";
 		next unless ($paths->{$c} &&
 		             ($paths->{$c}->{action} =~ /^[AR]$/));
-		if ($self->ra->check_path($self->{path}, $r) ==
+		if ($self->ra->check_path($self->path, $r) ==
 		    $SVN::Node::dir) {
 			return 1;
 		}
@@ -1075,14 +1094,14 @@
 	unless (defined $paths) {
 		my $err_handler = $SVN::Error::handler;
 		$SVN::Error::handler = \&Git::SVN::Ra::skip_unknown_revs;
-		$self->ra->get_log([$self->{path}], $rev, $rev, 0, 1, 1,
+		$self->ra->get_log([$self->path], $rev, $rev, 0, 1, 1,
 				   sub { $paths = $_[0] });
 		$SVN::Error::handler = $err_handler;
 	}
 	return undef unless defined $paths;
 
 	# look for a parent from another branch:
-	my @b_path_components = split m#/#, $self->{path};
+	my @b_path_components = split m#/#, $self->path;
 	my @a_path_components;
 	my $i;
 	while (@b_path_components) {
@@ -1099,8 +1118,8 @@
 	}
 	my $r = $i->{copyfrom_rev};
 	my $repos_root = $self->ra->{repos_root};
-	my $url = $self->ra->{url};
-	my $new_url = $url . $branch_from;
+	my $url = $self->ra->url;
+	my $new_url = canonicalize_url( add_path_to_url( $url, $branch_from ) );
 	print STDERR  "Found possible branch point: ",
 	              "$new_url => ", $self->full_url, ", $r\n"
 	              unless $::_q > 1;
@@ -1114,7 +1133,7 @@
 			($base, $head) = parse_revision_argument(0, $r);
 		} else {
 			if ($r0 < $r) {
-				$gs->ra->get_log([$gs->{path}], $r0 + 1, $r, 1,
+				$gs->ra->get_log([$gs->path], $r0 + 1, $r, 1,
 					0, 1, sub { $base = $_[1] - 1 });
 			}
 		}
@@ -1136,7 +1155,7 @@
 			# at the moment), so we can't rely on it
 			$self->{last_rev} = $r0;
 			$self->{last_commit} = $parent;
-			$ed = Git::SVN::Fetcher->new($self, $gs->{path});
+			$ed = Git::SVN::Fetcher->new($self, $gs->path);
 			$gs->ra->gs_do_switch($r0, $rev, $gs,
 					      $self->full_url, $ed)
 			  or die "SVN connection failed somewhere...\n";
@@ -1235,7 +1254,7 @@
 		close $fh;
 	}
 
-	my $strip = qr/\A\Q$self->{path}\E(?:\/|$)/;
+	my $strip = qr/\A\Q@{[$self->path]}\E(?:\/|$)/;
 	foreach my $d (sort keys %empty_dirs) {
 		$d = uri_decode($d);
 		$d =~ s/$strip//;
@@ -1429,12 +1448,11 @@
 	for my $ticket ( @tickets ) {
 		my ($uuid, $path, $rev) = split /:/, $ticket;
 		if ( $uuid eq $self->ra_uuid ) {
-			my $url = $self->{url};
-			my $repos_root = $url;
+			my $repos_root = $self->url;
 			my $branch_from = $path;
 			$branch_from =~ s{^/}{};
-			my $gs = $self->other_gs($repos_root."/".$branch_from,
-			                         $url,
+			my $gs = $self->other_gs(add_path_to_url( $repos_root, $branch_from ),
+			                         $repos_root,
 			                         $branch_from,
 			                         $rev,
 			                         $self->{ref_id});
@@ -1693,7 +1711,7 @@
 	# are now marked as merge, we can add the tip as a parent.
 	my @merges = split "\n", $mergeinfo;
 	my @merge_tips;
-	my $url = $self->{url};
+	my $url = $self->url;
 	my $uuid = $self->ra_uuid;
 	my %ranges;
 	for my $merge ( @merges ) {
@@ -1875,8 +1893,9 @@
 		$email ||= "$author\@$uuid";
 		$commit_email ||= "$author\@$uuid";
 	} elsif ($self->use_svnsync_props) {
-		my $full_url = $self->svnsync->{url};
-		$full_url .= "/$self->{path}" if length $self->{path};
+		my $full_url = canonicalize_url(
+			add_path_to_url( $self->svnsync->{url}, $self->path )
+		);
 		remove_username($full_url);
 		my $uuid = $self->svnsync->{uuid};
 		$log_entry{metadata} = "$full_url\@$rev $uuid";
@@ -1923,7 +1942,7 @@
 	                tree_b => $tree,
 	                editor_cb => sub {
 			       $self->set_tree_cb($log_entry, $tree, @_) },
-	                svn_path => $self->{path} );
+	                svn_path => $self->path );
 	if (!Git::SVN::Editor->new(\%ed_opts)->apply_diff) {
 		print "No changes\nr$self->{last_rev} = $tree\n";
 	}
@@ -2299,10 +2318,39 @@
 
 	$_[3] = $path = '' unless (defined $path);
 	mkpath([$dir]);
-	bless {
+	my $obj = bless {
 		ref_id => $ref_id, dir => $dir, index => "$dir/index",
-	        path => $path, config => "$ENV{GIT_DIR}/svn/config",
+	        config => "$ENV{GIT_DIR}/svn/config",
 	        map_root => "$dir/.rev_map", repo_id => $repo_id }, $class;
+
+	# Ensure it gets canonicalized
+	$obj->path($path);
+
+	return $obj;
+}
+
+sub path {
+	my $self = shift;
+
+	if (@_) {
+		my $path = shift;
+		$self->{path} = canonicalize_path($path);
+		return;
+	}
+
+	return $self->{path};
+}
+
+sub url {
+	my $self = shift;
+
+	if (@_) {
+		my $url = shift;
+		$self->{url} = canonicalize_url($url);
+		return;
+	}
+
+	return $self->{url};
 }
 
 # for read-only access of old .rev_db formats
diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
index 76fae9b..046a7a2 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/perl/Git/SVN/Fetcher.pm
@@ -83,7 +83,7 @@
 	chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`);
 	my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt);
 	local $/ = "\0";
-	my $pfx = defined($switch_path) ? $switch_path : $git_svn->{path};
+	my $pfx = defined($switch_path) ? $switch_path : $git_svn->path;
 	$pfx .= '/' if length($pfx);
 	while (<$ls>) {
 		chomp;
diff --git a/perl/Git/SVN/Migration.pm b/perl/Git/SVN/Migration.pm
index 75d7429..30daf35 100644
--- a/perl/Git/SVN/Migration.pm
+++ b/perl/Git/SVN/Migration.pm
@@ -177,14 +177,14 @@
 		my $ra = Git::SVN::Ra->new($url);
 
 		# skip existing cases where we already connect to the root
-		if (($ra->{url} eq $ra->{repos_root}) ||
+		if (($ra->url eq $ra->{repos_root}) ||
 		    ($ra->{repos_root} eq $repo_id)) {
-			$root_repos->{$ra->{url}} = $repo_id;
+			$root_repos->{$ra->url} = $repo_id;
 			next;
 		}
 
 		my $root_ra = Git::SVN::Ra->new($ra->{repos_root});
-		my $root_path = $ra->{url};
+		my $root_path = $ra->url;
 		$root_path =~ s#^\Q$ra->{repos_root}\E(/|$)##;
 		foreach my $path (keys %$fetch) {
 			my $ref_id = $fetch->{$path};
diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
index 23ff43e..90ec30b 100644
--- a/perl/Git/SVN/Ra.pm
+++ b/perl/Git/SVN/Ra.pm
@@ -3,6 +3,12 @@
 use strict;
 use warnings;
 use SVN::Client;
+use Git::SVN::Utils qw(
+	canonicalize_url
+	canonicalize_path
+	add_path_to_url
+);
+
 use SVN::Ra;
 BEGIN {
 	@ISA = qw(SVN::Ra);
@@ -62,29 +68,11 @@
 	\@rv;
 }
 
-sub escape_uri_only {
-	my ($uri) = @_;
-	my @tmp;
-	foreach (split m{/}, $uri) {
-		s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
-		push @tmp, $_;
-	}
-	join('/', @tmp);
-}
-
-sub escape_url {
-	my ($url) = @_;
-	if ($url =~ m#^(https?)://([^/]+)(.*)$#) {
-		my ($scheme, $domain, $uri) = ($1, $2, escape_uri_only($3));
-		$url = "$scheme://$domain$uri";
-	}
-	$url;
-}
 
 sub new {
 	my ($class, $url) = @_;
-	$url =~ s!/+$!!;
-	return $RA if ($RA && $RA->{url} eq $url);
+	$url = canonicalize_url($url);
+	return $RA if ($RA && $RA->url eq $url);
 
 	::_req_svn();
 
@@ -115,17 +103,34 @@
 			$Git::SVN::Prompt::_no_auth_cache = 1;
 		}
 	} # no warnings 'once'
-	my $self = SVN::Ra->new(url => escape_url($url), auth => $baton,
+
+	my $self = SVN::Ra->new(url => $url, auth => $baton,
 	                      config => $config,
 			      pool => SVN::Pool->new,
 	                      auth_provider_callbacks => $callbacks);
-	$self->{url} = $url;
+	$RA = bless $self, $class;
+
+	# Make sure its canonicalized
+	$self->url($url);
 	$self->{svn_path} = $url;
 	$self->{repos_root} = $self->get_repos_root;
 	$self->{svn_path} =~ s#^\Q$self->{repos_root}\E(/|$)##;
 	$self->{cache} = { check_path => { r => 0, data => {} },
 	                   get_dir => { r => 0, data => {} } };
-	$RA = bless $self, $class;
+
+	return $RA;
+}
+
+sub url {
+	my $self = shift;
+
+	if (@_) {
+		my $url = shift;
+		$self->{url} = canonicalize_url($url);
+		return;
+	}
+
+	return $self->{url};
 }
 
 sub check_path {
@@ -195,6 +200,7 @@
 				qw/copyfrom_path copyfrom_rev action/;
 			if ($s{'copyfrom_path'}) {
 				$s{'copyfrom_path'} =~ s/$prefix_regex//;
+				$s{'copyfrom_path'} = canonicalize_path($s{'copyfrom_path'});
 			}
 			$_[0]{$p} = \%s;
 		}
@@ -246,7 +252,7 @@
 sub gs_do_update {
 	my ($self, $rev_a, $rev_b, $gs, $editor) = @_;
 	my $new = ($rev_a == $rev_b);
-	my $path = $gs->{path};
+	my $path = $gs->path;
 
 	if ($new && -e $gs->{index}) {
 		unlink $gs->{index} or die
@@ -282,30 +288,33 @@
 # svn_ra_reparent didn't work before 1.4)
 sub gs_do_switch {
 	my ($self, $rev_a, $rev_b, $gs, $url_b, $editor) = @_;
-	my $path = $gs->{path};
+	my $path = $gs->path;
 	my $pool = SVN::Pool->new;
 
-	my $full_url = $self->{url};
-	my $old_url = $full_url;
-	$full_url .= '/' . $path if length $path;
+	my $old_url = $self->url;
+	my $full_url = add_path_to_url( $self->url, $path );
 	my ($ra, $reparented);
 
 	if ($old_url =~ m#^svn(\+ssh)?://# ||
 	    ($full_url =~ m#^https?://# &&
-	     escape_url($full_url) ne $full_url)) {
+	     canonicalize_url($full_url) ne $full_url)) {
 		$_[0] = undef;
 		$self = undef;
 		$RA = undef;
 		$ra = Git::SVN::Ra->new($full_url);
 		$ra_invalid = 1;
 	} elsif ($old_url ne $full_url) {
-		SVN::_Ra::svn_ra_reparent($self->{session}, $full_url, $pool);
-		$self->{url} = $full_url;
+		SVN::_Ra::svn_ra_reparent(
+			$self->{session},
+			canonicalize_url($full_url),
+			$pool
+		);
+		$self->url($full_url);
 		$reparented = 1;
 	}
 
 	$ra ||= $self;
-	$url_b = escape_url($url_b);
+	$url_b = canonicalize_url($url_b);
 	my $reporter = $ra->do_switch($rev_b, '', 1, $url_b, $editor, $pool);
 	my @lock = (::compare_svn_version('1.2.0') >= 0) ? (undef) : ();
 	$reporter->set_path('', $rev_a, 0, @lock, $pool);
@@ -313,7 +322,7 @@
 
 	if ($reparented) {
 		SVN::_Ra::svn_ra_reparent($self->{session}, $old_url, $pool);
-		$self->{url} = $old_url;
+		$self->url($old_url);
 	}
 
 	$pool->clear;
@@ -326,7 +335,7 @@
 	my $common_max = scalar @$gsv;
 
 	foreach my $gs (@$gsv) {
-		my @tmp = split m#/#, $gs->{path};
+		my @tmp = split m#/#, $gs->path;
 		my $p = '';
 		foreach (@tmp) {
 			$p .= length($p) ? "/$_" : $_;
@@ -362,7 +371,7 @@
 	my $inc = $_log_window_size;
 	my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc);
 	my $longest_path = longest_common_path($gsv, $globs);
-	my $ra_url = $self->{url};
+	my $ra_url = $self->url;
 	my $find_trailing_edge;
 	while (1) {
 		my %revs;
@@ -508,7 +517,7 @@
 				 ($self->check_path($p, $r) !=
 				  $SVN::Node::dir));
 			next unless $p =~ /$g->{path}->{regex}/;
-			$exists->{$p} = Git::SVN->init($self->{url}, $p, undef,
+			$exists->{$p} = Git::SVN->init($self->url, $p, undef,
 					 $g->{ref}->full_path($de), 1);
 		}
 	}
@@ -532,7 +541,7 @@
 			next if ($self->check_path($pathname, $r) !=
 			         $SVN::Node::dir);
 			$exists->{$pathname} = Git::SVN->init(
-			                      $self->{url}, $pathname, undef,
+			                      $self->url, $pathname, undef,
 			                      $g->{ref}->full_path($p), 1);
 		}
 		my $c = '';
@@ -548,19 +557,20 @@
 
 sub minimize_url {
 	my ($self) = @_;
-	return $self->{url} if ($self->{url} eq $self->{repos_root});
+	return $self->url if ($self->url eq $self->{repos_root});
 	my $url = $self->{repos_root};
 	my @components = split(m!/!, $self->{svn_path});
 	my $c = '';
 	do {
-		$url .= "/$c" if length $c;
+		$url = add_path_to_url($url, $c);
 		eval {
 			my $ra = (ref $self)->new($url);
 			my $latest = $ra->get_latest_revnum;
 			$ra->get_log("", $latest, 0, 1, 0, 1, sub {});
 		};
 	} while ($@ && ($c = shift @components));
-	$url;
+
+	return canonicalize_url($url);
 }
 
 sub can_do_switch {
@@ -568,7 +578,7 @@
 	unless (defined $can_do_switch) {
 		my $pool = SVN::Pool->new;
 		my $rep = eval {
-			$self->do_switch(1, '', 0, $self->{url},
+			$self->do_switch(1, '', 0, $self->url,
 			                 SVN::Delta::Editor->new, $pool);
 		};
 		if ($@) {
diff --git a/perl/Git/SVN/Utils.pm b/perl/Git/SVN/Utils.pm
index 496006b..4bb4dde 100644
--- a/perl/Git/SVN/Utils.pm
+++ b/perl/Git/SVN/Utils.pm
@@ -3,9 +3,18 @@
 use strict;
 use warnings;
 
+use SVN::Core;
+
 use base qw(Exporter);
 
-our @EXPORT_OK = qw(fatal can_compress);
+our @EXPORT_OK = qw(
+	fatal
+	can_compress
+	canonicalize_path
+	canonicalize_url
+	join_paths
+	add_path_to_url
+);
 
 
 =head1 NAME
@@ -56,4 +65,169 @@
 }
 
 
+=head3 canonicalize_path
+
+    my $canoncalized_path = canonicalize_path($path);
+
+Converts $path into a canonical form which is safe to pass to the SVN
+API as a file path.
+
+=cut
+
+# Turn foo/../bar into bar
+sub _collapse_dotdot {
+	my $path = shift;
+
+	1 while $path =~ s{/[^/]+/+\.\.}{};
+	1 while $path =~ s{[^/]+/+\.\./}{};
+	1 while $path =~ s{[^/]+/+\.\.}{};
+
+	return $path;
+}
+
+
+sub canonicalize_path {
+	my $path = shift;
+	my $rv;
+
+	# The 1.7 way to do it
+	if ( defined &SVN::_Core::svn_dirent_canonicalize ) {
+		$path = _collapse_dotdot($path);
+		$rv = SVN::_Core::svn_dirent_canonicalize($path);
+	}
+	# The 1.6 way to do it
+	# This can return undef on subversion-perl-1.4.2-2.el5 (CentOS 5.2)
+	elsif ( defined &SVN::_Core::svn_path_canonicalize ) {
+		$path = _collapse_dotdot($path);
+		$rv = SVN::_Core::svn_path_canonicalize($path);
+	}
+
+	return $rv if defined $rv;
+
+	# No SVN API canonicalization is available, or the SVN API
+	# didn't return a successful result, do it ourselves
+	return _canonicalize_path_ourselves($path);
+}
+
+
+sub _canonicalize_path_ourselves {
+	my ($path) = @_;
+	my $dot_slash_added = 0;
+	if (substr($path, 0, 1) ne "/") {
+		$path = "./" . $path;
+		$dot_slash_added = 1;
+	}
+	$path =~ s#/+#/#g;
+	$path =~ s#/\.(?:/|$)#/#g;
+	$path = _collapse_dotdot($path);
+	$path =~ s#/$##g;
+	$path =~ s#^\./## if $dot_slash_added;
+	$path =~ s#^/##;
+	$path =~ s#^\.$##;
+	return $path;
+}
+
+
+=head3 canonicalize_url
+
+    my $canonicalized_url = canonicalize_url($url);
+
+Converts $url into a canonical form which is safe to pass to the SVN
+API as a URL.
+
+=cut
+
+sub canonicalize_url {
+	my $url = shift;
+
+	# The 1.7 way to do it
+	if ( defined &SVN::_Core::svn_uri_canonicalize ) {
+		return SVN::_Core::svn_uri_canonicalize($url);
+	}
+	# There wasn't a 1.6 way to do it, so we do it ourself.
+	else {
+		return _canonicalize_url_ourselves($url);
+	}
+}
+
+
+sub _canonicalize_url_path {
+	my ($uri_path) = @_;
+
+	my @parts;
+	foreach my $part (split m{/+}, $uri_path) {
+		$part =~ s/([^~\w.%+-]|%(?![a-fA-F0-9]{2}))/sprintf("%%%02X",ord($1))/eg;
+		push @parts, $part;
+	}
+
+	return join('/', @parts);
+}
+
+sub _canonicalize_url_ourselves {
+	my ($url) = @_;
+	if ($url =~ m#^([^:]+)://([^/]*)(.*)$#) {
+		my ($scheme, $domain, $uri) = ($1, $2, _canonicalize_url_path(canonicalize_path($3)));
+		$url = "$scheme://$domain$uri";
+	}
+	$url;
+}
+
+
+=head3 join_paths
+
+    my $new_path = join_paths(@paths);
+
+Appends @paths together into a single path.  Any empty paths are ignored.
+
+=cut
+
+sub join_paths {
+	my @paths = @_;
+
+	@paths = grep { defined $_ && length $_ } @paths;
+
+	return '' unless @paths;
+	return $paths[0] if @paths == 1;
+
+	my $new_path = shift @paths;
+	$new_path =~ s{/+$}{};
+
+	my $last_path = pop @paths;
+	$last_path =~ s{^/+}{};
+
+	for my $path (@paths) {
+		$path =~ s{^/+}{};
+		$path =~ s{/+$}{};
+		$new_path .= "/$path";
+	}
+
+	return $new_path .= "/$last_path";
+}
+
+
+=head3 add_path_to_url
+
+    my $new_url = add_path_to_url($url, $path);
+
+Appends $path onto the $url.  If $path is empty, $url is returned unchanged.
+
+=cut
+
+sub add_path_to_url {
+	my($url, $path) = @_;
+
+	return $url if !defined $path or !length $path;
+
+	# Strip trailing and leading slashes so we don't
+	# wind up with http://x.com///path
+	$url  =~ s{/+$}{};
+	$path =~ s{^/+}{};
+
+	# If a path has a % in it, URI escape it so it's not
+	# mistaken for a URI escape later.
+	$path =~ s{%}{%25}g;
+
+	return join '/', $url, $path;
+}
+
 1;
diff --git a/po/TEAMS b/po/TEAMS
index e9ebc8c..1b9e994 100644
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -33,8 +33,9 @@
 Leader:		Peter Krefting <peter@softwolves.pp.se>
 
 Language:	vi (Vietnamese)
-Repository:	https://github.com/vnwildman/git.git
+Repository:	https://github.com/vnwildman/git/
 Leader:		Trần Ngọc Quân <vnwildman AT gmail.com>
+Members:	Nguyễn Thái Ngọc Duy <pclouds AT gmail.com>
 
 Language:	zh_CN (Simplified Chinese)
 Repository:	https://github.com/gotgit/git-po-zh_CN/
diff --git a/po/de.po b/po/de.po
index 2739bc0..a77eedb 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: git 1.7.12\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2012-08-06 23:47+0800\n"
+"POT-Creation-Date: 2012-09-05 06:20+0800\n"
 "PO-Revision-Date: 2012-03-28 18:46+0200\n"
 "Last-Translator: Ralf Thielow <ralf.thielow@googlemail.com>\n"
 "Language-Team: German\n"
@@ -58,7 +58,7 @@
 msgstr "Dem Projektarchiv fehlen folgende vorrausgesetzte Versionen:"
 
 #: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290
-#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347
+#: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347
 #: builtin/shortlog.c:181
 msgid "revision walk setup failed"
 msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
@@ -85,7 +85,7 @@
 msgid "rev-list died"
 msgstr "\"rev-list\" abgebrochen"
 
-#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284
+#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "nicht erkanntes Argument: %s"
@@ -231,32 +231,32 @@
 "Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
 "%s"
 
-#: diff.c:1400
+#: diff.c:1401
 msgid " 0 files changed"
 msgstr " 0 Dateien geändert"
 
-#: diff.c:1404
+#: diff.c:1405
 #, c-format
 msgid " %d file changed"
 msgid_plural " %d files changed"
 msgstr[0] " %d Datei geändert"
 msgstr[1] " %d Dateien geändert"
 
-#: diff.c:1421
+#: diff.c:1422
 #, c-format
 msgid ", %d insertion(+)"
 msgid_plural ", %d insertions(+)"
 msgstr[0] ", %d Zeile hinzugefügt(+)"
 msgstr[1] ", %d Zeilen hinzugefügt(+)"
 
-#: diff.c:1432
+#: diff.c:1433
 #, c-format
 msgid ", %d deletion(-)"
 msgid_plural ", %d deletions(-)"
 msgstr[0] ", %d Zeile entfernt(-)"
 msgstr[1] ", %d Zeilen entfernt(-)"
 
-#: diff.c:3461
+#: diff.c:3460
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -361,74 +361,66 @@
 msgid "error building trees"
 msgstr "Fehler beim Erstellen der Bäume"
 
-#: merge-recursive.c:497
-msgid "diff setup failed"
-msgstr "diff_setup_done fehlgeschlagen"
-
-#: merge-recursive.c:627
-msgid "merge-recursive: disk full?"
-msgstr "merge-recursive: Festplatte voll?"
-
-#: merge-recursive.c:690
+#: merge-recursive.c:672
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "Fehler beim Erstellen des Pfades '%s'%s"
 
-#: merge-recursive.c:701
+#: merge-recursive.c:683
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Entferne %s um Platz für Unterverzeichnis zu schaffen\n"
 
 #. something else exists
 #. .. but not some other error (who really cares what?)
-#: merge-recursive.c:715 merge-recursive.c:736
+#: merge-recursive.c:697 merge-recursive.c:718
 msgid ": perhaps a D/F conflict?"
 msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
 
-#: merge-recursive.c:726
+#: merge-recursive.c:708
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "verweigere, da unbeobachtete Dateien in '%s' verloren gehen würden"
 
-#: merge-recursive.c:766
+#: merge-recursive.c:748
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
-#: merge-recursive.c:768
+#: merge-recursive.c:750
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
-#: merge-recursive.c:791 builtin/clone.c:302
+#: merge-recursive.c:773 builtin/clone.c:302
 #, c-format
 msgid "failed to open '%s'"
 msgstr "Fehler beim Öffnen von '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'"
 
-#: merge-recursive.c:802
+#: merge-recursive.c:784
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:921
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung der internen Zusammenführung"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:925
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Konnte %s nicht zur Datenbank hinzufügen"
 
-#: merge-recursive.c:959
+#: merge-recursive.c:941
 msgid "unsupported object type in the tree"
 msgstr "nicht unterstützter Objekttyp im Baum"
 
-#: merge-recursive.c:1038 merge-recursive.c:1052
+#: merge-recursive.c:1020 merge-recursive.c:1034
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -437,7 +429,7 @@
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich gelassen."
 
-#: merge-recursive.c:1044 merge-recursive.c:1057
+#: merge-recursive.c:1026 merge-recursive.c:1039
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -446,20 +438,20 @@
 "KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
 "im Arbeitsbereich bei %s gelassen."
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1080
 msgid "rename"
 msgstr "umbenennen"
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1080
 msgid "renamed"
 msgstr "umbenannt"
 
-#: merge-recursive.c:1154
+#: merge-recursive.c:1136
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu"
 
-#: merge-recursive.c:1176
+#: merge-recursive.c:1158
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -468,148 +460,148 @@
 "KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Zweig \"%s\" "
 "und \"%s\"->\"%s\" in Zweig \"%s\"%s"
 
-#: merge-recursive.c:1181
+#: merge-recursive.c:1163
 msgid " (left unresolved)"
 msgstr " (bleibt unaufgelöst)"
 
-#: merge-recursive.c:1235
+#: merge-recursive.c:1217
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s "
 "in %s"
 
-#: merge-recursive.c:1265
+#: merge-recursive.c:1247
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
 
-#: merge-recursive.c:1464
+#: merge-recursive.c:1446
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 "KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in "
 "%s"
 
-#: merge-recursive.c:1474
+#: merge-recursive.c:1456
 #, c-format
 msgid "Adding merged %s"
 msgstr "Füge zusammengeführte Datei %s hinzu"
 
-#: merge-recursive.c:1479 merge-recursive.c:1677
+#: merge-recursive.c:1461 merge-recursive.c:1659
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Füge stattdessen als %s hinzu"
 
-#: merge-recursive.c:1530
+#: merge-recursive.c:1512
 #, c-format
 msgid "cannot read object %s"
 msgstr "kann Objekt %s nicht lesen"
 
-#: merge-recursive.c:1533
+#: merge-recursive.c:1515
 #, c-format
 msgid "object %s is not a blob"
 msgstr "Objekt %s ist kein Blob"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1563
 msgid "modify"
 msgstr "ändern"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1563
 msgid "modified"
 msgstr "geändert"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1573
 msgid "content"
 msgstr "Inhalt"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1580
 msgid "add/add"
 msgstr "hinzufügen/hinzufügen"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1614
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "%s ausgelassen (Ergebnis der Zusammenführung existiert bereits)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1628
 #, c-format
 msgid "Auto-merging %s"
 msgstr "automatische Zusammenführung von %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:844
+#: merge-recursive.c:1632 git-submodule.sh:869
 msgid "submodule"
 msgstr "Unterprojekt"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1633
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Zusammenführungskonflikt in %s"
 
-#: merge-recursive.c:1741
+#: merge-recursive.c:1723
 #, c-format
 msgid "Removing %s"
 msgstr "Entferne %s"
 
-#: merge-recursive.c:1766
+#: merge-recursive.c:1748
 msgid "file/directory"
 msgstr "Datei/Verzeichnis"
 
-#: merge-recursive.c:1772
+#: merge-recursive.c:1754
 msgid "directory/file"
 msgstr "Verzeichnis/Datei"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1759
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s "
 "hinzu."
 
-#: merge-recursive.c:1787
+#: merge-recursive.c:1769
 #, c-format
 msgid "Adding %s"
 msgstr "Füge %s hinzu"
 
-#: merge-recursive.c:1804
+#: merge-recursive.c:1786
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Fataler Fehler bei der Zusammenführung. Sollte nicht passieren."
 
-#: merge-recursive.c:1823
+#: merge-recursive.c:1805
 msgid "Already up-to-date!"
 msgstr "Bereits aktuell!"
 
-#: merge-recursive.c:1832
+#: merge-recursive.c:1814
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "Zusammenführen der Bäume %s und %s fehlgeschlagen"
 
-#: merge-recursive.c:1862
+#: merge-recursive.c:1844
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "unverarbeiteter Pfad??? %s"
 
-#: merge-recursive.c:1907
+#: merge-recursive.c:1889
 msgid "Merging:"
 msgstr "Zusammenführung:"
 
-#: merge-recursive.c:1920
+#: merge-recursive.c:1902
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "%u gemeinsamen Vorfahren gefunden"
 msgstr[1] "%u gemeinsame Vorfahren gefunden"
 
-#: merge-recursive.c:1957
+#: merge-recursive.c:1939
 msgid "merge returned no commit"
 msgstr "Zusammenführung hat keine Version zurückgegeben"
 
-#: merge-recursive.c:2014
+#: merge-recursive.c:1996
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Konnte Objekt '%s' nicht parsen."
 
-#: merge-recursive.c:2026 builtin/merge.c:697
+#: merge-recursive.c:2008 builtin/merge.c:696
 msgid "Unable to write index."
 msgstr "Konnte Bereitstellung nicht schreiben."
 
@@ -667,14 +659,14 @@
 "Dein Zweig und '%s' sind divergiert,\n"
 "und haben jeweils %d und %d unterschiedliche Versionen.\n"
 
-#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978
-#: builtin/merge.c:1088 builtin/merge.c:1098
+#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977
+#: builtin/merge.c:1087 builtin/merge.c:1097
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
-#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868
-#: builtin/merge.c:1090 builtin/merge.c:1103
+#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867
+#: builtin/merge.c:1089 builtin/merge.c:1102
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Konnte nicht nach '%s' schreiben."
@@ -880,7 +872,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "kann nicht abbrechen: bin auf einem Zweig, der noch geboren wird"
 
-#: sequencer.c:805 builtin/apply.c:3988
+#: sequencer.c:805 builtin/apply.c:3987
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "Kann %s nicht öffnen: %s"
@@ -1293,6 +1285,11 @@
 msgid ", behind "
 msgstr ", hinterher "
 
+#: compat/precompose_utf8.c:58 builtin/clone.c:341
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "Konnte '%s' nicht entfernen"
+
 #: builtin/add.c:62
 #, c-format
 msgid "unexpected diff status %c"
@@ -1397,7 +1394,7 @@
 msgid "index file corrupt"
 msgstr "Bereitstellungsdatei beschädigt"
 
-#: builtin/add.c:480 builtin/apply.c:4433 builtin/mv.c:229 builtin/rm.c:260
+#: builtin/add.c:480 builtin/apply.c:4432 builtin/mv.c:229 builtin/rm.c:260
 msgid "Unable to write new index file"
 msgstr "Konnte neue Bereitstellungsdatei nicht schreiben."
 
@@ -1415,56 +1412,56 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "nicht erkannte Option zum Ignorieren von Leerzeichen: '%s'"
 
-#: builtin/apply.c:824
+#: builtin/apply.c:823
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten"
 
-#: builtin/apply.c:833
+#: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s"
 
-#: builtin/apply.c:914
+#: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden."
 
-#: builtin/apply.c:946
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile "
 "%d"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d"
 
-#: builtin/apply.c:951
+#: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 "git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d"
 
-#: builtin/apply.c:958
+#: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d"
 
-#: builtin/apply.c:1403
+#: builtin/apply.c:1402
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: unerwartete Zeile: %.*s"
 
-#: builtin/apply.c:1460
+#: builtin/apply.c:1459
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s"
 
-#: builtin/apply.c:1477
+#: builtin/apply.c:1476
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -1479,70 +1476,70 @@
 "Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn "
 "%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)"
 
-#: builtin/apply.c:1637
+#: builtin/apply.c:1636
 msgid "new file depends on old contents"
 msgstr "neue Datei hängt von alten Inhalten ab"
 
-#: builtin/apply.c:1639
+#: builtin/apply.c:1638
 msgid "deleted file still has contents"
 msgstr "entfernte Datei hat noch Inhalte"
 
-#: builtin/apply.c:1665
+#: builtin/apply.c:1664
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "fehlerhafter Patch bei Zeile %d"
 
-#: builtin/apply.c:1701
+#: builtin/apply.c:1700
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "neue Datei %s hängt von alten Inhalten ab"
 
-#: builtin/apply.c:1703
+#: builtin/apply.c:1702
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "entfernte Datei %s hat noch Inhalte"
 
-#: builtin/apply.c:1706
+#: builtin/apply.c:1705
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
 
-#: builtin/apply.c:1852
+#: builtin/apply.c:1851
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
 
 #. there has to be one hunk (forward hunk)
-#: builtin/apply.c:1881
+#: builtin/apply.c:1880
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "nicht erkannter Binär-Patch bei Zeile %d"
 
-#: builtin/apply.c:1967
+#: builtin/apply.c:1966
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "Patch mit nutzlosen Informationen bei Zeile %d"
 
-#: builtin/apply.c:2057
+#: builtin/apply.c:2056
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "konnte symbolische Verknüpfung %s nicht lesen"
 
-#: builtin/apply.c:2061
+#: builtin/apply.c:2060
 #, c-format
 msgid "unable to open or read %s"
 msgstr "konnte %s nicht öffnen oder lesen"
 
-#: builtin/apply.c:2132
+#: builtin/apply.c:2131
 msgid "oops"
 msgstr "Ups"
 
-#: builtin/apply.c:2654
+#: builtin/apply.c:2653
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "Ungültiger Zeilenanfang: '%c'"
 
-#: builtin/apply.c:2772
+#: builtin/apply.c:2771
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
@@ -1550,12 +1547,12 @@
 msgstr[1] ""
 "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)"
 
-#: builtin/apply.c:2784
+#: builtin/apply.c:2783
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Kontext reduziert zu (%ld/%ld) um Patch-Bereich bei %d anzuwenden"
 
-#: builtin/apply.c:2790
+#: builtin/apply.c:2789
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -1564,339 +1561,339 @@
 "bei der Suche nach:\n"
 "%.*s"
 
-#: builtin/apply.c:2809
+#: builtin/apply.c:2808
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "keine Daten in Binär-Patch für '%s'"
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2911
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "Konnte Binär-Patch nicht auf '%s' anwenden"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2917
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 "Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)"
 
-#: builtin/apply.c:2939
+#: builtin/apply.c:2938
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld"
 
-#: builtin/apply.c:3061
+#: builtin/apply.c:3060
 #, c-format
 msgid "cannot checkout %s"
 msgstr "kann %s nicht auschecken"
 
-#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159
+#: builtin/apply.c:3105 builtin/apply.c:3114 builtin/apply.c:3158
 #, c-format
 msgid "read of %s failed"
 msgstr "Konnte %s nicht lesen"
 
-#: builtin/apply.c:3139 builtin/apply.c:3361
+#: builtin/apply.c:3138 builtin/apply.c:3360
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "Pfad %s wurde umbenannt/gelöscht"
 
-#: builtin/apply.c:3220 builtin/apply.c:3375
+#: builtin/apply.c:3219 builtin/apply.c:3374
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s ist nicht bereitgestellt"
 
-#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389
+#: builtin/apply.c:3223 builtin/apply.c:3366 builtin/apply.c:3388
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3229 builtin/apply.c:3383
+#: builtin/apply.c:3228 builtin/apply.c:3382
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s entspricht nicht der Bereitstellung"
 
-#: builtin/apply.c:3331
+#: builtin/apply.c:3330
 msgid "removal patch leaves file contents"
 msgstr "Lösch-Patch hinterlässt Dateiinhalte"
 
-#: builtin/apply.c:3400
+#: builtin/apply.c:3399
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: falscher Typ"
 
-#: builtin/apply.c:3402
+#: builtin/apply.c:3401
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s ist vom Typ %o, erwartete %o"
 
-#: builtin/apply.c:3503
+#: builtin/apply.c:3502
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s ist bereits bereitgestellt"
 
-#: builtin/apply.c:3506
+#: builtin/apply.c:3505
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s existiert bereits im Arbeitsverzeichnis"
 
-#: builtin/apply.c:3526
+#: builtin/apply.c:3525
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)"
 
-#: builtin/apply.c:3531
+#: builtin/apply.c:3530
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s"
 
-#: builtin/apply.c:3539
+#: builtin/apply.c:3538
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: Patch konnte nicht angewendet werden"
 
-#: builtin/apply.c:3552
+#: builtin/apply.c:3551
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Prüfe Patch %s..."
 
-#: builtin/apply.c:3607 builtin/checkout.c:213 builtin/reset.c:158
+#: builtin/apply.c:3606 builtin/checkout.c:213 builtin/reset.c:158
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3749
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "konnte %s nicht aus der Bereitstellung entfernen"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3777
 #, c-format
 msgid "corrupt patch for subproject %s"
 msgstr "fehlerhafter Patch für Unterprojekt %s"
 
-#: builtin/apply.c:3782
+#: builtin/apply.c:3781
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "konnte neu erstellte Datei '%s' nicht lesen"
 
-#: builtin/apply.c:3787
+#: builtin/apply.c:3786
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen"
 
-#: builtin/apply.c:3790 builtin/apply.c:3898
+#: builtin/apply.c:3789 builtin/apply.c:3897
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3822
 #, c-format
 msgid "closing file '%s'"
 msgstr "schließe Datei '%s'"
 
-#: builtin/apply.c:3872
+#: builtin/apply.c:3871
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "konnte Datei '%s' mit Modus %o nicht schreiben"
 
-#: builtin/apply.c:3959
+#: builtin/apply.c:3958
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Patch %s sauber angewendet"
 
-#: builtin/apply.c:3967
+#: builtin/apply.c:3966
 msgid "internal error"
 msgstr "interner Fehler"
 
 #. Say this even without --verbose
-#: builtin/apply.c:3970
+#: builtin/apply.c:3969
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..."
 msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..."
 
-#: builtin/apply.c:3980
+#: builtin/apply.c:3979
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "Verkürze Name von .rej Datei zu %.*s.rej"
 
-#: builtin/apply.c:4001
+#: builtin/apply.c:4000
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Patch-Bereich #%d sauber angewendet."
 
-#: builtin/apply.c:4004
+#: builtin/apply.c:4003
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Patch-Bereich #%d zurückgewiesen."
 
-#: builtin/apply.c:4154
+#: builtin/apply.c:4153
 msgid "unrecognized input"
 msgstr "nicht erkannte Eingabe"
 
-#: builtin/apply.c:4165
+#: builtin/apply.c:4164
 msgid "unable to read index file"
 msgstr "Konnte Bereitstellungsdatei nicht lesen"
 
-#: builtin/apply.c:4284 builtin/apply.c:4287
+#: builtin/apply.c:4283 builtin/apply.c:4286
 msgid "path"
 msgstr "Pfad"
 
-#: builtin/apply.c:4285
+#: builtin/apply.c:4284
 msgid "don't apply changes matching the given path"
 msgstr "wendet keine Änderungen im angegebenen Pfad an"
 
-#: builtin/apply.c:4288
+#: builtin/apply.c:4287
 msgid "apply changes matching the given path"
 msgstr "wendet Änderungen nur im angegebenen Pfad an"
 
-#: builtin/apply.c:4290
+#: builtin/apply.c:4289
 msgid "num"
 msgstr "Anzahl"
 
-#: builtin/apply.c:4291
+#: builtin/apply.c:4290
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 "entfernt <Anzahl> vorrangestellte Schrägstriche von herkömmlichen "
 "Differenzpfaden"
 
-#: builtin/apply.c:4294
+#: builtin/apply.c:4293
 msgid "ignore additions made by the patch"
 msgstr "ignoriert hinzugefügte Zeilen des Patches"
 
-#: builtin/apply.c:4296
+#: builtin/apply.c:4295
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, wird der \"diffstat\" für die Eingabe "
 "ausgegeben"
 
-#: builtin/apply.c:4300
+#: builtin/apply.c:4299
 msgid "shows number of added and deleted lines in decimal notation"
 msgstr ""
 "zeigt die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation"
 
-#: builtin/apply.c:4302
+#: builtin/apply.c:4301
 msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 "anstatt der Anwendung des Patches, wird eine Zusammenfassung für die Eingabe "
 "ausgegeben"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4303
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 "anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann"
 
-#: builtin/apply.c:4306
+#: builtin/apply.c:4305
 msgid "make sure the patch is applicable to the current index"
 msgstr ""
 "stellt sicher, dass der Patch in der aktuellen Bereitstellung angewendet "
 "werden kann"
 
-#: builtin/apply.c:4308
+#: builtin/apply.c:4307
 msgid "apply a patch without touching the working tree"
 msgstr "wendet einen Patch an, ohne Änderungen im Arbeitszweig vorzunehmen"
 
-#: builtin/apply.c:4310
+#: builtin/apply.c:4309
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "wendet den Patch an (Benutzung mit --stat/--summary/--check)"
 
-#: builtin/apply.c:4312
+#: builtin/apply.c:4311
 msgid "attempt three-way merge if a patch does not apply"
 msgstr ""
 "versucht 3-Wege-Zusammenführung, wenn der Patch nicht angewendet werden "
 "konnte"
 
-#: builtin/apply.c:4314
+#: builtin/apply.c:4313
 msgid "build a temporary index based on embedded index information"
 msgstr ""
 "erstellt eine temporäre Bereitstellung basierend auf den integrierten "
 "Bereitstellungsinformationen"
 
-#: builtin/apply.c:4316
+#: builtin/apply.c:4315
 msgid "paths are separated with NUL character"
 msgstr "Pfade sind getrennt durch NUL Zeichen"
 
-#: builtin/apply.c:4319
+#: builtin/apply.c:4318
 msgid "ensure at least <n> lines of context match"
 msgstr ""
 "stellt sicher, dass mindestens <Anzahl> Zeilen des Kontextes übereinstimmen"
 
-#: builtin/apply.c:4320
+#: builtin/apply.c:4319
 msgid "action"
 msgstr "Aktion"
 
-#: builtin/apply.c:4321
+#: builtin/apply.c:4320
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "ermittelt neue oder geänderte Zeilen die Fehler in Leerzeichen haben"
 
-#: builtin/apply.c:4324 builtin/apply.c:4327
+#: builtin/apply.c:4323 builtin/apply.c:4326
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignoriert Änderungen in Leerzeichen bei der Suche des Kontextes"
 
-#: builtin/apply.c:4330
+#: builtin/apply.c:4329
 msgid "apply the patch in reverse"
 msgstr "wendet den Patch in umgekehrter Reihenfolge an"
 
-#: builtin/apply.c:4332
+#: builtin/apply.c:4331
 msgid "don't expect at least one line of context"
 msgstr "erwartet keinen Kontext"
 
-#: builtin/apply.c:4334
+#: builtin/apply.c:4333
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr ""
 "hinterlässt zurückgewiesene Patch-Bereiche in den entsprechenden *.rej "
 "Dateien"
 
-#: builtin/apply.c:4336
+#: builtin/apply.c:4335
 msgid "allow overlapping hunks"
 msgstr "erlaubt sich überlappende Patch-Bereiche"
 
-#: builtin/apply.c:4337
+#: builtin/apply.c:4336
 msgid "be verbose"
 msgstr "erweiterte Ausgaben"
 
-#: builtin/apply.c:4339
+#: builtin/apply.c:4338
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "toleriert fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende"
 
-#: builtin/apply.c:4342
+#: builtin/apply.c:4341
 msgid "do not trust the line counts in the hunk headers"
 msgstr "vertraut nicht den Zeilennummern im Kopf des Patch-Bereiches"
 
-#: builtin/apply.c:4344
+#: builtin/apply.c:4343
 msgid "root"
 msgstr "Wurzelverzeichnis"
 
-#: builtin/apply.c:4345
+#: builtin/apply.c:4344
 msgid "prepend <root> to all filenames"
 msgstr "stellt <Wurzelverzeichnis> vor alle Dateinamen"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4366
 msgid "--3way outside a repository"
 msgstr "--3way außerhalb eines Projektarchivs"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4374
 msgid "--index outside a repository"
 msgstr "--index außerhalb eines Projektarchivs"
 
-#: builtin/apply.c:4378
+#: builtin/apply.c:4377
 msgid "--cached outside a repository"
 msgstr "--cached außerhalb eines Projektarchivs"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4393
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kann Patch '%s' nicht öffnen"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4407
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "unterdrückte %d Fehler in Leerzeichen"
 msgstr[1] "unterdrückte %d Fehler in Leerzeichen"
 
-#: builtin/apply.c:4414 builtin/apply.c:4424
+#: builtin/apply.c:4413 builtin/apply.c:4423
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -2163,7 +2160,7 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Konnte Ergebnis der Zusammenführung von '%s' nicht hinzufügen."
 
-#: builtin/checkout.c:235 builtin/checkout.c:393
+#: builtin/checkout.c:235 builtin/checkout.c:392
 msgid "corrupt index file"
 msgstr "beschädigte Bereitstellungsdatei"
 
@@ -2172,60 +2169,56 @@
 msgid "path '%s' is unmerged"
 msgstr "Pfad '%s' ist nicht zusammengeführt."
 
-#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586
-#: builtin/merge.c:812
+#: builtin/checkout.c:303 builtin/checkout.c:498 builtin/clone.c:586
+#: builtin/merge.c:811
 msgid "unable to write new index file"
 msgstr "Konnte neue Bereitstellungsdatei nicht schreiben."
 
-#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408
-msgid "diff_setup_done failed"
-msgstr "diff_setup_done fehlgeschlagen"
-
-#: builtin/checkout.c:415
+#: builtin/checkout.c:414
 msgid "you need to resolve your current index first"
 msgstr "Du musst zuerst deine aktuelle Bereitstellung auflösen."
 
-#: builtin/checkout.c:534
+#: builtin/checkout.c:533
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n"
 
-#: builtin/checkout.c:567
+#: builtin/checkout.c:566
 msgid "HEAD is now at"
 msgstr "Zweigspitze (HEAD) ist jetzt bei"
 
-#: builtin/checkout.c:574
+#: builtin/checkout.c:573
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Setze Zweig '%s' zurück\n"
 
-#: builtin/checkout.c:577
+#: builtin/checkout.c:576
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Bereits auf '%s'\n"
 
-#: builtin/checkout.c:581
+#: builtin/checkout.c:580
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Gewechselt zu zurückgesetztem Zweig '%s'\n"
 
-#: builtin/checkout.c:583
+#: builtin/checkout.c:582
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Gewechselt zu einem neuen Zweig '%s'\n"
 
-#: builtin/checkout.c:585
+#: builtin/checkout.c:584
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Gewechselt zu Zweig '%s'\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:640
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... und %d weitere.\n"
 
 #. The singular version
-#: builtin/checkout.c:647
+#: builtin/checkout.c:646
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -2248,7 +2241,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:665
+#: builtin/checkout.c:664
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -2263,71 +2256,71 @@
 " git branch neuer_zweig_name %s\n"
 "\n"
 
-#: builtin/checkout.c:695
+#: builtin/checkout.c:694
 msgid "internal error in revision walk"
 msgstr "interner Fehler im Revisionsgang"
 
-#: builtin/checkout.c:699
+#: builtin/checkout.c:698
 msgid "Previous HEAD position was"
 msgstr "Vorherige Position der Zweigspitze (HEAD) war"
 
-#: builtin/checkout.c:725 builtin/checkout.c:920
+#: builtin/checkout.c:724 builtin/checkout.c:919
 msgid "You are on a branch yet to be born"
 msgstr "du bist auf einem Zweig, der noch geboren wird"
 
 #. case (1)
-#: builtin/checkout.c:856
+#: builtin/checkout.c:855
 #, c-format
 msgid "invalid reference: %s"
 msgstr "Ungültige Referenz: %s"
 
 #. case (1): want a tree
-#: builtin/checkout.c:895
+#: builtin/checkout.c:894
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "Referenz ist kein Baum: %s"
 
-#: builtin/checkout.c:977
+#: builtin/checkout.c:976
 msgid "-B cannot be used with -b"
 msgstr "-B kann nicht mit -b benutzt werden"
 
-#: builtin/checkout.c:986
+#: builtin/checkout.c:985
 msgid "--patch is incompatible with all other options"
 msgstr "--patch ist inkompatibel mit allen anderen Optionen"
 
-#: builtin/checkout.c:989
+#: builtin/checkout.c:988
 msgid "--detach cannot be used with -b/-B/--orphan"
 msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden"
 
-#: builtin/checkout.c:991
+#: builtin/checkout.c:990
 msgid "--detach cannot be used with -t"
 msgstr "--detach kann nicht mit -t benutzt werden"
 
-#: builtin/checkout.c:997
+#: builtin/checkout.c:996
 msgid "--track needs a branch name"
 msgstr "--track benötigt einen Zweignamen"
 
-#: builtin/checkout.c:1004
+#: builtin/checkout.c:1003
 msgid "Missing branch name; try -b"
 msgstr "Vermisse Zweignamen; versuche -b"
 
-#: builtin/checkout.c:1010
+#: builtin/checkout.c:1009
 msgid "--orphan and -b|-B are mutually exclusive"
 msgstr "--orphan und -b|-B sind gegenseitig exklusiv"
 
-#: builtin/checkout.c:1012
+#: builtin/checkout.c:1011
 msgid "--orphan cannot be used with -t"
 msgstr "--orphan kann nicht mit -t benutzt werden"
 
-#: builtin/checkout.c:1022
+#: builtin/checkout.c:1021
 msgid "git checkout: -f and -m are incompatible"
 msgstr "git checkout: -f und -m sind inkompatibel"
 
-#: builtin/checkout.c:1056
+#: builtin/checkout.c:1055
 msgid "invalid path specification"
 msgstr "ungültige Pfadspezifikation"
 
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1063
 #, c-format
 msgid ""
 "git checkout: updating paths is incompatible with switching branches.\n"
@@ -2338,17 +2331,17 @@
 "Hast du beabsichtigt '%s' auszuchecken, welcher nicht als Version aufgelöst "
 "werden kann?"
 
-#: builtin/checkout.c:1066
+#: builtin/checkout.c:1065
 msgid "git checkout: updating paths is incompatible with switching branches."
 msgstr ""
 "git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem Wechsel "
 "von Zweigen."
 
-#: builtin/checkout.c:1071
+#: builtin/checkout.c:1070
 msgid "git checkout: --detach does not take a path argument"
 msgstr "git checkout: --detach nimmt kein Pfad-Argument"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1073
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -2356,11 +2349,11 @@
 "git checkout: --ours/--theirs, --force and --merge sind inkompatibel wenn\n"
 "du aus der Bereitstellung auscheckst."
 
-#: builtin/checkout.c:1093
+#: builtin/checkout.c:1092
 msgid "Cannot switch branch to a non-commit."
 msgstr "Kann Zweig nur zu einer Version wechseln."
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "--ours/--theirs is incompatible with switching branches."
 msgstr "--ours/--theirs ist inkompatibel mit den Wechseln von Zweigen."
 
@@ -2418,7 +2411,7 @@
 msgid "failed to create directory '%s'"
 msgstr "Fehler beim Erstellen von Verzeichnis '%s'"
 
-#: builtin/clone.c:308 builtin/diff.c:75
+#: builtin/clone.c:308 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "Konnte '%s' nicht lesen"
@@ -2433,11 +2426,6 @@
 msgid "failed to stat %s\n"
 msgstr "Konnte %s nicht lesen\n"
 
-#: builtin/clone.c:341
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "Konnte '%s' nicht entfernen"
-
 #: builtin/clone.c:346
 #, c-format
 msgid "failed to create link '%s'"
@@ -2843,7 +2831,7 @@
 msgid "could not parse HEAD commit"
 msgstr "Konnte Version der Zweigspitze (HEAD) nicht analysieren."
 
-#: builtin/commit.c:1487 builtin/merge.c:509
+#: builtin/commit.c:1487 builtin/merge.c:508
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "Konnte '%s' nicht zum Lesen öffnen."
@@ -2872,7 +2860,7 @@
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Eintragung aufgrund leerer Versionsbeschreibung abgebrochen.\n"
 
-#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961
+#: builtin/commit.c:1554 builtin/merge.c:935 builtin/merge.c:960
 msgid "failed to write commit object"
 msgstr "Fehler beim Schreiben des Versionsobjektes."
 
@@ -2979,36 +2967,36 @@
 msgid "--dirty is incompatible with committishes"
 msgstr "--dirty ist inkompatibel mit Versionen"
 
-#: builtin/diff.c:77
+#: builtin/diff.c:79
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': keine reguläre Datei oder symbolischer Link"
 
-#: builtin/diff.c:220
+#: builtin/diff.c:224
 #, c-format
 msgid "invalid option: %s"
 msgstr "Ungültige Option: %s"
 
-#: builtin/diff.c:297
+#: builtin/diff.c:301
 msgid "Not a git repository"
 msgstr "Kein Git-Projektarchiv"
 
-#: builtin/diff.c:341
+#: builtin/diff.c:344
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "Objekt '%s' ist ungültig."
 
-#: builtin/diff.c:346
+#: builtin/diff.c:349
 #, c-format
 msgid "more than %d trees given: '%s'"
 msgstr "Mehr als %d Zweige angegeben: '%s'"
 
-#: builtin/diff.c:356
+#: builtin/diff.c:359
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "Mehr als zwei Blobs angegeben: '%s'"
 
-#: builtin/diff.c:364
+#: builtin/diff.c:367
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "unbehandeltes Objekt '%s' angegeben"
@@ -3212,58 +3200,58 @@
 msgid "grep: failed to create thread: %s"
 msgstr "grep: Fehler beim Erzeugen eines Thread: %s"
 
-#: builtin/grep.c:402
+#: builtin/grep.c:454
 #, c-format
 msgid "Failed to chdir: %s"
 msgstr "Fehler beim Verzeichniswechsel: %s"
 
-#: builtin/grep.c:478 builtin/grep.c:512
+#: builtin/grep.c:530 builtin/grep.c:564
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "konnte Zweig (%s) nicht lesen"
 
-#: builtin/grep.c:526
+#: builtin/grep.c:578
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
 
-#: builtin/grep.c:584
+#: builtin/grep.c:636
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "Schalter '%c' erwartet einen numerischen Wert"
 
-#: builtin/grep.c:601
+#: builtin/grep.c:653
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kann '%s' nicht öffnen"
 
-#: builtin/grep.c:885
+#: builtin/grep.c:917
 msgid "no pattern given."
 msgstr "keine Muster angegeben"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:931
 #, c-format
 msgid "bad object %s"
 msgstr "ungültiges Objekt %s"
 
-#: builtin/grep.c:940
+#: builtin/grep.c:972
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager arbeitet nur innerhalb des Arbeitsbaums"
 
-#: builtin/grep.c:963
+#: builtin/grep.c:995
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached oder --untracked kann nicht mit --no-index benutzt werden"
 
-#: builtin/grep.c:968
+#: builtin/grep.c:1000
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index oder --untracked kann nicht mit Versionen benutzt werden"
 
-#: builtin/grep.c:971
+#: builtin/grep.c:1003
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 "--[no-]exlude-standard kann nicht mit beobachteten Inhalten benutzt werden"
 
-#: builtin/grep.c:979
+#: builtin/grep.c:1011
 msgid "both --cached and trees are given."
 msgstr "sowohl --cached als auch Zweige gegeben"
 
@@ -3758,58 +3746,58 @@
 msgid "Not a range."
 msgstr "Kein Versionsbereich."
 
-#: builtin/log.c:792
+#: builtin/log.c:789
 msgid "Cover letter needs email format"
 msgstr "Anschreiben benötigt E-Mail-Format"
 
-#: builtin/log.c:865
+#: builtin/log.c:862
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "ungültiges in-reply-to: %s"
 
-#: builtin/log.c:938
+#: builtin/log.c:935
 msgid "Two output directories?"
 msgstr "Zwei Ausgabeverzeichnisse?"
 
-#: builtin/log.c:1160
+#: builtin/log.c:1157
 #, c-format
 msgid "bogus committer info %s"
 msgstr "unechte Einreicher-Informationen %s"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1202
 msgid "-n and -k are mutually exclusive."
 msgstr "-n und -k schliessen sich gegenseitig aus"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1204
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix und -k schliessen sich gegenseitig aus"
 
-#: builtin/log.c:1215
+#: builtin/log.c:1212
 msgid "--name-only does not make sense"
 msgstr "--name-only macht keinen Sinn"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1214
 msgid "--name-status does not make sense"
 msgstr "--name-status macht keinen Sinn"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1216
 msgid "--check does not make sense"
 msgstr "--check macht keinen Sinn"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1239
 msgid "standard output, or directory, which one?"
 msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1241
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Konnte Verzeichnis '%s' nicht erstellen."
 
-#: builtin/log.c:1397
+#: builtin/log.c:1394
 msgid "Failed to create output files"
 msgstr "Fehler beim Erstellen der Ausgabedateien."
 
-#: builtin/log.c:1501
+#: builtin/log.c:1498
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
@@ -3817,7 +3805,7 @@
 "Konnte gefolgten, externen Zweig nicht finden, bitte gebe <upstream> manuell "
 "an.\n"
 
-#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531
+#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Unbekannte Version %s"
@@ -3882,51 +3870,51 @@
 "Keine Zusammenführungsbeschreibung -- Zweigspitze (HEAD) wird nicht "
 "aktualisiert\n"
 
-#: builtin/merge.c:437
+#: builtin/merge.c:436
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' zeigt auf keine Version"
 
-#: builtin/merge.c:536
+#: builtin/merge.c:535
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Ungültiger branch.%s.mergeoptions String: %s"
 
-#: builtin/merge.c:629
+#: builtin/merge.c:628
 msgid "git write-tree failed to write a tree"
 msgstr "\"git write-tree\" schlug beim Schreiben eines Baumes fehl"
 
-#: builtin/merge.c:679
+#: builtin/merge.c:678
 msgid "failed to read the cache"
 msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
 
-#: builtin/merge.c:710
+#: builtin/merge.c:709
 msgid "Not handling anything other than two heads merge."
 msgstr "Es wird nur die Zusammenführung von zwei Zweigen behandelt."
 
-#: builtin/merge.c:724
+#: builtin/merge.c:723
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Unbekannte Option für merge-recursive: -X%s"
 
-#: builtin/merge.c:738
+#: builtin/merge.c:737
 #, c-format
 msgid "unable to write %s"
 msgstr "konnte %s nicht schreiben"
 
-#: builtin/merge.c:877
+#: builtin/merge.c:876
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "konnte nicht von '%s' lesen"
 
-#: builtin/merge.c:886
+#: builtin/merge.c:885
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Zusammenführung wurde nicht eingetragen; benutze 'git commit' um die "
 "Zusammenführung abzuschließen.\n"
 
-#: builtin/merge.c:892
+#: builtin/merge.c:891
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
 "especially if it merges an updated upstream into a topic branch.\n"
@@ -3942,56 +3930,56 @@
 "Zeilen beginnend mit '#' werden ignoriert, und eine leere Beschreibung "
 "bricht die Eintragung ab.\n"
 
-#: builtin/merge.c:916
+#: builtin/merge.c:915
 msgid "Empty commit message."
 msgstr "Leere Versionsbeschreibung"
 
-#: builtin/merge.c:928
+#: builtin/merge.c:927
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Wunderbar.\n"
 
-#: builtin/merge.c:993
+#: builtin/merge.c:992
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Automatische Zusammenführung fehlgeschlagen; behebe die Konflikte und trage "
 "dann das Ergebnis ein.\n"
 
-#: builtin/merge.c:1009
+#: builtin/merge.c:1008
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' ist keine Version"
 
-#: builtin/merge.c:1050
+#: builtin/merge.c:1049
 msgid "No current branch."
 msgstr "Du befindest dich auf keinem Zweig."
 
-#: builtin/merge.c:1052
+#: builtin/merge.c:1051
 msgid "No remote for the current branch."
 msgstr "Kein externes Archiv für den aktuellen Zweig."
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1053
 msgid "No default upstream defined for the current branch."
 msgstr ""
 "Es ist kein externes Standard-Projektarchiv für den aktuellen Zweig "
 "definiert."
 
-#: builtin/merge.c:1059
+#: builtin/merge.c:1058
 #, c-format
 msgid "No remote tracking branch for %s from %s"
 msgstr "Kein externer Übernahmezweig für %s von %s"
 
-#: builtin/merge.c:1146 builtin/merge.c:1303
+#: builtin/merge.c:1145 builtin/merge.c:1302
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - nichts was wir zusammenführen können"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1213
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keine Zusammenführung zum Abbrechen (vermisse MERGE_HEAD)"
 
-#: builtin/merge.c:1230 git-pull.sh:31
+#: builtin/merge.c:1229 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3999,12 +3987,12 @@
 "Du hast deine Zusammenführung nicht abgeschlossen (MERGE_HEAD existiert).\n"
 "Bitte trage deine Änderungen ein, bevor du zusammenführen kannst."
 
-#: builtin/merge.c:1233 git-pull.sh:34
+#: builtin/merge.c:1232 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 "Du hast deine Zusammenführung nicht abgeschlossen (MERGE_HEAD existiert)."
 
-#: builtin/merge.c:1237
+#: builtin/merge.c:1236
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -4012,80 +4000,80 @@
 "Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n"
 "Bitte trage deine Änderungen ein, bevor du zusammenführen kannst."
 
-#: builtin/merge.c:1240
+#: builtin/merge.c:1239
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 "Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)."
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1248
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kannst --squash nicht mit --no-ff kombinieren."
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1253
 msgid "You cannot combine --no-ff with --ff-only."
 msgstr "Du kannst --no-ff nicht mit --ff--only kombinieren."
 
-#: builtin/merge.c:1261
+#: builtin/merge.c:1260
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Keine Version angegeben und merge.defaultToUpstream ist nicht gesetzt."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1292
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Kann nur exakt eine Version in einem leeren Zweig zusammenführen."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1295
 msgid "Squash commit into empty head not supported yet"
 msgstr "Bin auf einem Zweig, der noch geboren wird; kann nicht quetschen."
 
-#: builtin/merge.c:1298
+#: builtin/merge.c:1297
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "nicht vorzuspulende Version macht in einem leeren Zweig keinen Sinn"
 
-#: builtin/merge.c:1413
+#: builtin/merge.c:1412
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich triviale \"in-index\"-Zusammenführung...\n"
 
-#: builtin/merge.c:1458
+#: builtin/merge.c:1457
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
-#: builtin/merge.c:1490
+#: builtin/merge.c:1489
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
-#: builtin/merge.c:1513 builtin/merge.c:1592
+#: builtin/merge.c:1512 builtin/merge.c:1591
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Zweiges bis zum Ursprung...\n"
 
-#: builtin/merge.c:1517
+#: builtin/merge.c:1516
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Probiere Zusammenführungsstrategie %s...\n"
 
-#: builtin/merge.c:1583
+#: builtin/merge.c:1582
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Keine Zusammenführungsstrategie behandelt diese Zusammenführung.\n"
 
-#: builtin/merge.c:1585
+#: builtin/merge.c:1584
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Zusammenführung mit Strategie %s fehlgeschlagen.\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1593
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Benutze \"%s\" um die Auflösung per Hand vorzubereiten.\n"
 
-#: builtin/merge.c:1606
+#: builtin/merge.c:1605
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
@@ -4426,14 +4414,49 @@
 "aktuellen Zweiges '%s' ist, ohne mir mitzuteilen, was ich versenden\n"
 "soll, um welchen externen Zweig zu aktualisieren."
 
-#: builtin/push.c:174
+#: builtin/push.c:151
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n"
+"wird in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n"
+"unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n"
+"beizubehalten, benutze:"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"Um diese Meldung zu unterdrücken und das neue Verhalten jetzt zu übernehmen,\n"
+"benutze:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"Führe 'git help config' aus und suche nach 'push.default' für weitere "
+"Informationen.\n"
+"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutze den ähnlichen"
+" Modus 'current' anstatt 'simple', falls du gelegentlich ältere Versionen von"
+" Git benutzt.)"
+
+#: builtin/push.c:199
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Du hast keine Referenzspezifikationen zum Versenden angegeben, und push."
 "default ist \"nothing\"."
 
-#: builtin/push.c:181
+#: builtin/push.c:206
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n"
@@ -4446,22 +4469,22 @@
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:187
+#: builtin/push.c:212
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration\n"
-"variable to 'current' or 'upstream' to push only the current branch."
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
 msgstr ""
 "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n"
 "Zweiges hinter seinem externen Gegenstück zurückgefallen ist. Wenn du nicht\n"
 "beabsichtigt hast, diesen Zweig zu versenden, kannst du auch den zu "
 "versendenden\n"
 "Zweig spezifizieren oder die Konfigurationsvariable 'push.default' zu "
-"'current'\n"
+"'simple', 'current'\n"
 "oder 'upstream' setzen, um nur den aktuellen Zweig zu versenden."
 
-#: builtin/push.c:193
+#: builtin/push.c:218
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and merge the remote changes\n"
@@ -4475,22 +4498,22 @@
 "Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
 "für weitere Details."
 
-#: builtin/push.c:233
+#: builtin/push.c:258
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Versende nach %s\n"
 
-#: builtin/push.c:237
+#: builtin/push.c:262
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
 
-#: builtin/push.c:269
+#: builtin/push.c:294
 #, c-format
 msgid "bad repository '%s'"
 msgstr "ungültiges Projektarchiv '%s'"
 
-#: builtin/push.c:270
+#: builtin/push.c:295
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -4512,31 +4535,31 @@
 "\n"
 "    git push <Name>\n"
 
-#: builtin/push.c:285
+#: builtin/push.c:310
 msgid "--all and --tags are incompatible"
 msgstr "--all und --tags sind inkompatibel"
 
-#: builtin/push.c:286
+#: builtin/push.c:311
 msgid "--all can't be combined with refspecs"
 msgstr "--all kann nicht mit Referenzspezifikationen kombiniert werden"
 
-#: builtin/push.c:291
+#: builtin/push.c:316
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror und --tags sind inkompatibel"
 
-#: builtin/push.c:292
+#: builtin/push.c:317
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kann nicht mit Referenzspezifikationen kombiniert werden"
 
-#: builtin/push.c:297
+#: builtin/push.c:322
 msgid "--all and --mirror are incompatible"
 msgstr "--all und --mirror sind inkompatibel"
 
-#: builtin/push.c:385
+#: builtin/push.c:410
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete ist inkompatibel mit --all, --mirror und --tags"
 
-#: builtin/push.c:387
+#: builtin/push.c:412
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete macht ohne irgendeine Referenz keinen Sinn"
 
@@ -5750,14 +5773,14 @@
 "and run me again.  I am stopping in case you still have something\n"
 "valuable there."
 msgstr ""
-"Es scheint so, als gäbe es das Verzeichnis $state_dir_base bereits, und\n"
-"es wäre verwunderlich, wenn ein Neuaufbau bereits im Gange ist. Wenn das\n"
-"der Fall ist, probiere bitte\n"
+"Es sieht so aus, als ob es das Verzeichnis $state_dir_base bereits gibt\n"
+"und es könnte ein anderer Neuaufbau im Gange sein. Wenn das der Fall ist,\n"
+"probiere bitte\n"
 "\t$cmd_live_rebase\n"
 "Wenn das nicht der Fall ist, probiere bitte\n"
 "\t$cmd_clear_stale_rebase\n"
-"und führe dieses Kommando nochmal aus. Es wird angehalten, falls bereits\n"
-"etwas Nützliches vorhanden ist."
+"und führe dieses Kommando nochmal aus. Es wird angehalten, falls noch\n"
+"etwas Schützenswertes vorhanden ist."
 
 #: git-rebase.sh:395
 #, sh-format
@@ -5952,34 +5975,34 @@
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren"
 
-#: git-submodule.sh:145
+#: git-submodule.sh:167
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 "Keine Unterprojekt-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden"
 
-#: git-submodule.sh:189
+#: git-submodule.sh:211
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Klonen von '$url' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:201
+#: git-submodule.sh:223
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr ""
 "Git-Verzeichnis '$a' ist Teil des Unterprojekt-Pfades '$b', oder umgekehrt"
 
-#: git-submodule.sh:290
+#: git-submodule.sh:312
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
 
-#: git-submodule.sh:307
+#: git-submodule.sh:329
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' existiert bereits in der Bereitstellung"
 
-#: git-submodule.sh:311
+#: git-submodule.sh:333
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -5990,65 +6013,65 @@
 "$sm_path\n"
 "Benutze -f wenn du diesen wirklich hinzufügen möchtest."
 
-#: git-submodule.sh:322
+#: git-submodule.sh:344
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 "Füge existierendes Projektarchiv in '$sm_path' der Bereitstellung hinzu."
 
-#: git-submodule.sh:324
+#: git-submodule.sh:346
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Projektarchiv"
 
-#: git-submodule.sh:338
+#: git-submodule.sh:360
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Unfähig Unterprojekt '$sm_path' auszuchecken"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:365
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Hinzufügen von Unterprojekt '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:348
+#: git-submodule.sh:370
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Registierung von Unterprojekt '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:390
+#: git-submodule.sh:413
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
 msgstr "Betrete '$prefix$sm_path'"
 
-#: git-submodule.sh:404
+#: git-submodule.sh:427
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
 msgstr "Stoppe bei '$sm_path'; Skript gab nicht-Null Status zurück."
 
-#: git-submodule.sh:447
+#: git-submodule.sh:471
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
 msgstr "Keine URL für Unterprojekt-Pfad '$sm_path' in .gitmodules gefunden"
 
-#: git-submodule.sh:456
+#: git-submodule.sh:480
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
 msgstr "Registrierung der URL für Unterprojekt-Pfad '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:458
+#: git-submodule.sh:482
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
 msgstr "Unterprojekt '$name' ($url) ist für Pfad '$sm_path' registriert"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:490
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
 msgstr ""
 "Registrierung des Aktualisierungsmodus für Unterprojekt-Pfad '$sm_path' "
 "fehlgeschlagen"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:590
 #, sh-format
 msgid ""
 "Submodule path '$sm_path' not initialized\n"
@@ -6057,95 +6080,104 @@
 "Unterprojekt-Pfad '$sm_path' ist nicht initialisiert\n"
 "Vielleicht möchtest du 'update --init' benutzen?"
 
-#: git-submodule.sh:578
+#: git-submodule.sh:603
 #, sh-format
 msgid "Unable to find current revision in submodule path '$sm_path'"
 msgstr "Konnte aktuelle Version in Unterprojekt-Pfad '$sm_path' nicht finden"
 
-#: git-submodule.sh:597
+#: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Konnte in Unterprojekt-Pfad '$sm_path' nicht anfordern"
 
-#: git-submodule.sh:611
+#: git-submodule.sh:636
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$sm_path'"
 msgstr "Neuaufbau von '$sha1' in Unterprojekt-Pfad '$sm_path' nicht möglich"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Submodule path '$sm_path': rebased into '$sha1'"
 msgstr "Unterprojekt-Pfad '$sm_path': neu aufgebaut in '$sha1'"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:642
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$sm_path'"
 msgstr ""
 "Zusammenführung von '$sha1' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen"
 
-#: git-submodule.sh:618
+#: git-submodule.sh:643
 #, sh-format
 msgid "Submodule path '$sm_path': merged in '$sha1'"
 msgstr "Unterprojekt-Pfad '$sm_path': zusammengeführt in '$sha1'"
 
-#: git-submodule.sh:623
+#: git-submodule.sh:648
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$sm_path'"
 msgstr "Konnte '$sha1' in Unterprojekt-Pfad '$sm_path' nicht auschecken."
 
-#: git-submodule.sh:624
+#: git-submodule.sh:649
 #, sh-format
 msgid "Submodule path '$sm_path': checked out '$sha1'"
 msgstr "Unterprojekt-Pfad: '$sm_path': '$sha1' ausgecheckt"
 
-#: git-submodule.sh:646 git-submodule.sh:969
+#: git-submodule.sh:671 git-submodule.sh:995
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Fehler bei Rekursion in Unterprojekt-Pfad '$sm_path'"
 
-#: git-submodule.sh:754
+#: git-submodule.sh:779
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Die --cached Option kann nicht mit der --files Option benutzt werden"
 
 #. unexpected type
-#: git-submodule.sh:794
+#: git-submodule.sh:819
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "unerwarteter Modus $mod_dst"
 
-#: git-submodule.sh:812
+#: git-submodule.sh:837
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
 msgstr "  Warnung: $name beinhaltet nicht Version $sha1_src"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
 msgstr "  Warnung: $name beinhaltet nicht Version $sha1_dst"
 
-#: git-submodule.sh:818
+#: git-submodule.sh:843
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 "  Warnung: $name beinhaltet nicht die Versionen $sha1_src und $sha1_dst"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:868
 msgid "blob"
 msgstr "Blob"
 
-#: git-submodule.sh:881
+#: git-submodule.sh:906
 msgid "# Submodules changed but not updated:"
 msgstr "# Unterprojekte geändert, aber nicht aktualisiert:"
 
-#: git-submodule.sh:883
+#: git-submodule.sh:908
 msgid "# Submodule changes to be committed:"
 msgstr "# Änderungen in Unterprojekt zum Eintragen:"
 
-#: git-submodule.sh:1027
+#: git-submodule.sh:1054
 #, sh-format
 msgid "Synchronizing submodule url for '$name'"
 msgstr "Synchronisiere Unterprojekt-URL für '$name'"
 
+#~ msgid "diff setup failed"
+#~ msgstr "diff_setup_done fehlgeschlagen"
+
+#~ msgid "merge-recursive: disk full?"
+#~ msgstr "merge-recursive: Festplatte voll?"
+
+#~ msgid "diff_setup_done failed"
+#~ msgstr "diff_setup_done fehlgeschlagen"
+
 #~ msgid "-d option is no longer supported.  Do not use."
 #~ msgstr "-d Option wird nicht länger unterstützt. Nicht benutzen."
 
diff --git a/po/git.pot b/po/git.pot
index 5c586d6..05177d6 100644
--- a/po/git.pot
+++ b/po/git.pot
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2012-08-06 23:47+0800\n"
+"POT-Creation-Date: 2012-09-15 10:21+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -35,6 +35,91 @@
 "or use 'git commit -a'."
 msgstr ""
 
+#: archive.c:10
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr ""
+
+#: archive.c:11
+msgid "git archive --list"
+msgstr ""
+
+#: archive.c:12
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
+msgstr ""
+
+#: archive.c:13
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr ""
+
+#: archive.c:322
+msgid "fmt"
+msgstr ""
+
+#: archive.c:322
+msgid "archive format"
+msgstr ""
+
+#: archive.c:323 builtin/log.c:1079
+msgid "prefix"
+msgstr ""
+
+#: archive.c:324
+msgid "prepend prefix to each pathname in the archive"
+msgstr ""
+
+#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332
+#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642
+#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77
+#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537
+#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149
+msgid "file"
+msgstr ""
+
+#: archive.c:326 builtin/archive.c:92
+msgid "write the archive to this file"
+msgstr ""
+
+#: archive.c:328
+msgid "read .gitattributes in working directory"
+msgstr ""
+
+#: archive.c:329
+msgid "report archived files on stderr"
+msgstr ""
+
+#: archive.c:330
+msgid "store only"
+msgstr ""
+
+#: archive.c:331
+msgid "compress faster"
+msgstr ""
+
+#: archive.c:339
+msgid "compress better"
+msgstr ""
+
+#: archive.c:342
+msgid "list supported archive formats"
+msgstr ""
+
+#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85
+msgid "repo"
+msgstr ""
+
+#: archive.c:345 builtin/archive.c:94
+msgid "retrieve the archive from remote repository <repo>"
+msgstr ""
+
+#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616
+msgid "command"
+msgstr ""
+
+#: archive.c:347 builtin/archive.c:96
+msgid "path to the remote git-upload-archive command"
+msgstr ""
+
 #: bundle.c:36
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
@@ -45,7 +130,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr ""
 
-#: bundle.c:89 builtin/commit.c:699
+#: bundle.c:89 builtin/commit.c:714
 #, c-format
 msgid "could not open '%s'"
 msgstr ""
@@ -54,8 +139,8 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr ""
 
-#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290
-#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347
+#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290
+#: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347
 #: builtin/shortlog.c:181
 msgid "revision walk setup failed"
 msgstr ""
@@ -82,7 +167,7 @@
 msgid "rev-list died"
 msgstr ""
 
-#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284
+#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr ""
@@ -225,32 +310,32 @@
 "%s"
 msgstr ""
 
-#: diff.c:1400
+#: diff.c:1401
 msgid " 0 files changed"
 msgstr ""
 
-#: diff.c:1404
+#: diff.c:1405
 #, c-format
 msgid " %d file changed"
 msgid_plural " %d files changed"
 msgstr[0] ""
 msgstr[1] ""
 
-#: diff.c:1421
+#: diff.c:1422
 #, c-format
 msgid ", %d insertion(+)"
 msgid_plural ", %d insertions(+)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: diff.c:1432
+#: diff.c:1433
 #, c-format
 msgid ", %d deletion(-)"
 msgid_plural ", %d deletions(-)"
 msgstr[0] ""
 msgstr[1] ""
 
-#: diff.c:3461
+#: diff.c:3460
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -345,243 +430,235 @@
 msgid "error building trees"
 msgstr ""
 
-#: merge-recursive.c:497
-msgid "diff setup failed"
-msgstr ""
-
-#: merge-recursive.c:627
-msgid "merge-recursive: disk full?"
-msgstr ""
-
-#: merge-recursive.c:690
+#: merge-recursive.c:672
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr ""
 
-#: merge-recursive.c:701
+#: merge-recursive.c:683
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr ""
 
 #. something else exists
 #. .. but not some other error (who really cares what?)
-#: merge-recursive.c:715 merge-recursive.c:736
+#: merge-recursive.c:697 merge-recursive.c:718
 msgid ": perhaps a D/F conflict?"
 msgstr ""
 
-#: merge-recursive.c:726
+#: merge-recursive.c:708
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr ""
 
-#: merge-recursive.c:766
+#: merge-recursive.c:748
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:768
+#: merge-recursive.c:750
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:791 builtin/clone.c:302
+#: merge-recursive.c:773 builtin/clone.c:302
 #, c-format
 msgid "failed to open '%s'"
 msgstr ""
 
-#: merge-recursive.c:799
+#: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr ""
 
-#: merge-recursive.c:802
+#: merge-recursive.c:784
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr ""
 
-#: merge-recursive.c:939
+#: merge-recursive.c:922
 msgid "Failed to execute internal merge"
 msgstr ""
 
-#: merge-recursive.c:943
+#: merge-recursive.c:926
 #, c-format
 msgid "Unable to add %s to database"
 msgstr ""
 
-#: merge-recursive.c:959
+#: merge-recursive.c:942
 msgid "unsupported object type in the tree"
 msgstr ""
 
-#: merge-recursive.c:1038 merge-recursive.c:1052
+#: merge-recursive.c:1021 merge-recursive.c:1035
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree."
 msgstr ""
 
-#: merge-recursive.c:1044 merge-recursive.c:1057
+#: merge-recursive.c:1027 merge-recursive.c:1040
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
 "in tree at %s."
 msgstr ""
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "rename"
 msgstr ""
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "renamed"
 msgstr ""
 
-#: merge-recursive.c:1154
+#: merge-recursive.c:1137
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1176
+#: merge-recursive.c:1159
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
 "\"->\"%s\" in \"%s\"%s"
 msgstr ""
 
-#: merge-recursive.c:1181
+#: merge-recursive.c:1164
 msgid " (left unresolved)"
 msgstr ""
 
-#: merge-recursive.c:1235
+#: merge-recursive.c:1218
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 
-#: merge-recursive.c:1265
+#: merge-recursive.c:1248
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr ""
 
-#: merge-recursive.c:1464
+#: merge-recursive.c:1447
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr ""
 
-#: merge-recursive.c:1474
+#: merge-recursive.c:1457
 #, c-format
 msgid "Adding merged %s"
 msgstr ""
 
-#: merge-recursive.c:1479 merge-recursive.c:1677
+#: merge-recursive.c:1462 merge-recursive.c:1660
 #, c-format
 msgid "Adding as %s instead"
 msgstr ""
 
-#: merge-recursive.c:1530
+#: merge-recursive.c:1513
 #, c-format
 msgid "cannot read object %s"
 msgstr ""
 
-#: merge-recursive.c:1533
+#: merge-recursive.c:1516
 #, c-format
 msgid "object %s is not a blob"
 msgstr ""
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modify"
 msgstr ""
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modified"
 msgstr ""
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1574
 msgid "content"
 msgstr ""
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1581
 msgid "add/add"
 msgstr ""
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1615
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr ""
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1629
 #, c-format
 msgid "Auto-merging %s"
 msgstr ""
 
-#: merge-recursive.c:1650 git-submodule.sh:844
+#: merge-recursive.c:1633 git-submodule.sh:869
 msgid "submodule"
 msgstr ""
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1634
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr ""
 
-#: merge-recursive.c:1741
+#: merge-recursive.c:1724
 #, c-format
 msgid "Removing %s"
 msgstr ""
 
-#: merge-recursive.c:1766
+#: merge-recursive.c:1749
 msgid "file/directory"
 msgstr ""
 
-#: merge-recursive.c:1772
+#: merge-recursive.c:1755
 msgid "directory/file"
 msgstr ""
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1760
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 
-#: merge-recursive.c:1787
+#: merge-recursive.c:1770
 #, c-format
 msgid "Adding %s"
 msgstr ""
 
-#: merge-recursive.c:1804
+#: merge-recursive.c:1787
 msgid "Fatal merge failure, shouldn't happen."
 msgstr ""
 
-#: merge-recursive.c:1823
+#: merge-recursive.c:1806
 msgid "Already up-to-date!"
 msgstr ""
 
-#: merge-recursive.c:1832
+#: merge-recursive.c:1815
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr ""
 
-#: merge-recursive.c:1862
+#: merge-recursive.c:1845
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr ""
 
-#: merge-recursive.c:1907
+#: merge-recursive.c:1890
 msgid "Merging:"
 msgstr ""
 
-#: merge-recursive.c:1920
+#: merge-recursive.c:1903
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: merge-recursive.c:1957
+#: merge-recursive.c:1940
 msgid "merge returned no commit"
 msgstr ""
 
-#: merge-recursive.c:2014
+#: merge-recursive.c:1997
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr ""
 
-#: merge-recursive.c:2026 builtin/merge.c:697
+#: merge-recursive.c:2009 builtin/merge.c:696
 msgid "Unable to write index."
 msgstr ""
 
@@ -632,14 +709,14 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978
-#: builtin/merge.c:1088 builtin/merge.c:1098
+#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977
+#: builtin/merge.c:1087 builtin/merge.c:1097
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr ""
 
-#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868
-#: builtin/merge.c:1090 builtin/merge.c:1103
+#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867
+#: builtin/merge.c:1089 builtin/merge.c:1102
 #, c-format
 msgid "Could not write to '%s'"
 msgstr ""
@@ -657,7 +734,7 @@
 "and commit the result with 'git commit'"
 msgstr ""
 
-#: sequencer.c:160 sequencer.c:758 sequencer.c:841
+#: sequencer.c:160 sequencer.c:765 sequencer.c:848
 #, c-format
 msgid "Could not write to %s"
 msgstr ""
@@ -693,178 +770,178 @@
 msgid "Unable to update cache tree\n"
 msgstr ""
 
-#: sequencer.c:324
+#: sequencer.c:327
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr ""
 
-#: sequencer.c:329
+#: sequencer.c:332
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr ""
 
-#: sequencer.c:395
+#: sequencer.c:398
 msgid "Your index file is unmerged."
 msgstr ""
 
-#: sequencer.c:398
+#: sequencer.c:401
 msgid "You do not have a valid HEAD"
 msgstr ""
 
-#: sequencer.c:413
+#: sequencer.c:416
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr ""
 
-#: sequencer.c:421
+#: sequencer.c:424
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr ""
 
-#: sequencer.c:425
+#: sequencer.c:428
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr ""
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:436
+#: sequencer.c:439
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr ""
 
-#: sequencer.c:440
+#: sequencer.c:443
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr ""
 
-#: sequencer.c:524
+#: sequencer.c:527
 #, c-format
 msgid "could not revert %s... %s"
 msgstr ""
 
-#: sequencer.c:525
+#: sequencer.c:528
 #, c-format
 msgid "could not apply %s... %s"
 msgstr ""
 
-#: sequencer.c:553
+#: sequencer.c:560
 msgid "empty commit set passed"
 msgstr ""
 
-#: sequencer.c:561
+#: sequencer.c:568
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr ""
 
-#: sequencer.c:566
+#: sequencer.c:573
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr ""
 
-#: sequencer.c:624
+#: sequencer.c:631
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr ""
 
-#: sequencer.c:646
+#: sequencer.c:653
 #, c-format
 msgid "Could not parse line %d."
 msgstr ""
 
-#: sequencer.c:651
+#: sequencer.c:658
 msgid "No commits parsed."
 msgstr ""
 
-#: sequencer.c:664
+#: sequencer.c:671
 #, c-format
 msgid "Could not open %s"
 msgstr ""
 
-#: sequencer.c:668
+#: sequencer.c:675
 #, c-format
 msgid "Could not read %s."
 msgstr ""
 
-#: sequencer.c:675
+#: sequencer.c:682
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr ""
 
-#: sequencer.c:703
+#: sequencer.c:710
 #, c-format
 msgid "Invalid key: %s"
 msgstr ""
 
-#: sequencer.c:706
+#: sequencer.c:713
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr ""
 
-#: sequencer.c:718
+#: sequencer.c:725
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr ""
 
-#: sequencer.c:739
+#: sequencer.c:746
 msgid "a cherry-pick or revert is already in progress"
 msgstr ""
 
-#: sequencer.c:740
+#: sequencer.c:747
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr ""
 
-#: sequencer.c:744
+#: sequencer.c:751
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr ""
 
-#: sequencer.c:760 sequencer.c:845
+#: sequencer.c:767 sequencer.c:852
 #, c-format
 msgid "Error wrapping up %s."
 msgstr ""
 
-#: sequencer.c:779 sequencer.c:913
+#: sequencer.c:786 sequencer.c:920
 msgid "no cherry-pick or revert in progress"
 msgstr ""
 
-#: sequencer.c:781
+#: sequencer.c:788
 msgid "cannot resolve HEAD"
 msgstr ""
 
-#: sequencer.c:783
+#: sequencer.c:790
 msgid "cannot abort from a branch yet to be born"
 msgstr ""
 
-#: sequencer.c:805 builtin/apply.c:3988
+#: sequencer.c:812 builtin/apply.c:4005
 #, c-format
 msgid "cannot open %s: %s"
 msgstr ""
 
-#: sequencer.c:808
+#: sequencer.c:815
 #, c-format
 msgid "cannot read %s: %s"
 msgstr ""
 
-#: sequencer.c:809
+#: sequencer.c:816
 msgid "unexpected end of file"
 msgstr ""
 
-#: sequencer.c:815
+#: sequencer.c:822
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr ""
 
-#: sequencer.c:838
+#: sequencer.c:845
 #, c-format
 msgid "Could not format %s."
 msgstr ""
 
-#: sequencer.c:1000
+#: sequencer.c:1007
 msgid "Can't revert as initial commit"
 msgstr ""
 
-#: sequencer.c:1001
+#: sequencer.c:1008
 msgid "Can't cherry-pick into empty head"
 msgstr ""
 
@@ -887,12 +964,17 @@
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr ""
 
-#: wrapper.c:413
+#: wrapper.c:408
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr ""
+
+#: wrapper.c:426
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr ""
 
-#: wrapper.c:414
+#: wrapper.c:427
 msgid "no such user"
 msgstr ""
 
@@ -946,11 +1028,6 @@
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr ""
 
-#: wt-status.c:224
-#, c-format
-msgid "%s files:"
-msgstr ""
-
 #: wt-status.c:227
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
@@ -1151,11 +1228,11 @@
 msgstr ""
 
 #: wt-status.c:1011
-msgid "Untracked"
+msgid "Untracked files"
 msgstr ""
 
 #: wt-status.c:1013
-msgid "Ignored"
+msgid "Ignored files"
 msgstr ""
 
 #: wt-status.c:1015
@@ -1171,61 +1248,77 @@
 msgid "No changes"
 msgstr ""
 
-#: wt-status.c:1027
+#: wt-status.c:1028
 #, c-format
-msgid "no changes added to commit%s\n"
-msgstr ""
-
-#: wt-status.c:1029
-msgid " (use \"git add\" and/or \"git commit -a\")"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr ""
 
 #: wt-status.c:1031
 #, c-format
-msgid "nothing added to commit but untracked files present%s\n"
+msgid "no changes added to commit\n"
 msgstr ""
 
-#: wt-status.c:1033
-msgid " (use \"git add\" to track)"
-msgstr ""
-
-#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041
+#: wt-status.c:1034
 #, c-format
-msgid "nothing to commit%s\n"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
 msgstr ""
 
-#: wt-status.c:1036
-msgid " (create/copy files and use \"git add\" to track)"
+#: wt-status.c:1037
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
 msgstr ""
 
-#: wt-status.c:1039
-msgid " (use -u to show untracked files)"
+#: wt-status.c:1040
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
 msgstr ""
 
-#: wt-status.c:1042
-msgid " (working directory clean)"
+#: wt-status.c:1043 wt-status.c:1048
+#, c-format
+msgid "nothing to commit\n"
 msgstr ""
 
-#: wt-status.c:1150
+#: wt-status.c:1046
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+
+#: wt-status.c:1050
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr ""
+
+#: wt-status.c:1158
 msgid "HEAD (no branch)"
 msgstr ""
 
-#: wt-status.c:1156
+#: wt-status.c:1164
 msgid "Initial commit on "
 msgstr ""
 
-#: wt-status.c:1171
+#: wt-status.c:1179
 msgid "behind "
 msgstr ""
 
-#: wt-status.c:1174 wt-status.c:1177
+#: wt-status.c:1182 wt-status.c:1185
 msgid "ahead "
 msgstr ""
 
-#: wt-status.c:1179
+#: wt-status.c:1187
 msgid ", behind "
 msgstr ""
 
+#: compat/precompose_utf8.c:58 builtin/clone.c:341
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr ""
+
+#: builtin/add.c:19
+msgid "git add [options] [--] <filepattern>..."
+msgstr ""
+
 #: builtin/add.c:62
 #, c-format
 msgid "unexpected diff status %c"
@@ -1249,7 +1342,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr ""
 
-#: builtin/add.c:195 builtin/add.c:459 builtin/rm.c:186
+#: builtin/add.c:195 builtin/add.c:460 builtin/rm.c:186
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr ""
@@ -1286,47 +1379,99 @@
 msgid "Could not apply '%s'"
 msgstr ""
 
-#: builtin/add.c:312
+#: builtin/add.c:313
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr ""
 
-#: builtin/add.c:352
+#: builtin/add.c:319 builtin/clean.c:52 builtin/fetch.c:78 builtin/mv.c:63
+#: builtin/prune-packed.c:76 builtin/push.c:388 builtin/remote.c:1253
+#: builtin/rm.c:133
+msgid "dry run"
+msgstr ""
+
+#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187
+#: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477
+#: builtin/mv.c:62 builtin/read-tree.c:112
+msgid "be verbose"
+msgstr ""
+
+#: builtin/add.c:322
+msgid "interactive picking"
+msgstr ""
+
+#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248
+msgid "select hunks interactively"
+msgstr ""
+
+#: builtin/add.c:324
+msgid "edit current diff and apply"
+msgstr ""
+
+#: builtin/add.c:325
+msgid "allow adding otherwise ignored files"
+msgstr ""
+
+#: builtin/add.c:326
+msgid "update tracked files"
+msgstr ""
+
+#: builtin/add.c:327
+msgid "record only the fact that the path will be added later"
+msgstr ""
+
+#: builtin/add.c:328
+msgid "add changes from all tracked and untracked files"
+msgstr ""
+
+#: builtin/add.c:329
+msgid "don't add, only refresh the index"
+msgstr ""
+
+#: builtin/add.c:330
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+
+#: builtin/add.c:331
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+
+#: builtin/add.c:353
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr ""
 
-#: builtin/add.c:353
+#: builtin/add.c:354
 msgid "no files added"
 msgstr ""
 
-#: builtin/add.c:359
+#: builtin/add.c:360
 msgid "adding files failed"
 msgstr ""
 
-#: builtin/add.c:391
+#: builtin/add.c:392
 msgid "-A and -u are mutually incompatible"
 msgstr ""
 
-#: builtin/add.c:393
+#: builtin/add.c:394
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 
-#: builtin/add.c:413
-#, c-format
-msgid "Nothing specified, nothing added.\n"
-msgstr ""
-
 #: builtin/add.c:414
 #, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr ""
+
+#: builtin/add.c:415
+#, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr ""
 
-#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
+#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
 #: builtin/rm.c:162
 msgid "index file corrupt"
 msgstr ""
 
-#: builtin/add.c:480 builtin/apply.c:4433 builtin/mv.c:229 builtin/rm.c:260
+#: builtin/add.c:481 builtin/apply.c:4450 builtin/mv.c:229 builtin/rm.c:260
 msgid "Unable to write new index file"
 msgstr ""
 
@@ -1344,52 +1489,52 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr ""
 
-#: builtin/apply.c:824
+#: builtin/apply.c:823
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr ""
 
-#: builtin/apply.c:833
+#: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr ""
 
-#: builtin/apply.c:914
+#: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:946
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr ""
 
-#: builtin/apply.c:950
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:951
+#: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr ""
 
-#: builtin/apply.c:958
+#: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr ""
 
-#: builtin/apply.c:1403
+#: builtin/apply.c:1420
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1460
+#: builtin/apply.c:1477
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr ""
 
-#: builtin/apply.c:1477
+#: builtin/apply.c:1494
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -1400,403 +1545,400 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:1637
+#: builtin/apply.c:1654
 msgid "new file depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1639
+#: builtin/apply.c:1656
 msgid "deleted file still has contents"
 msgstr ""
 
-#: builtin/apply.c:1665
+#: builtin/apply.c:1682
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:1701
+#: builtin/apply.c:1718
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr ""
 
-#: builtin/apply.c:1703
+#: builtin/apply.c:1720
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr ""
 
-#: builtin/apply.c:1706
+#: builtin/apply.c:1723
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr ""
 
-#: builtin/apply.c:1852
+#: builtin/apply.c:1869
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr ""
 
 #. there has to be one hunk (forward hunk)
-#: builtin/apply.c:1881
+#: builtin/apply.c:1898
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr ""
 
-#: builtin/apply.c:1967
+#: builtin/apply.c:1984
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr ""
 
-#: builtin/apply.c:2057
+#: builtin/apply.c:2074
 #, c-format
 msgid "unable to read symlink %s"
 msgstr ""
 
-#: builtin/apply.c:2061
+#: builtin/apply.c:2078
 #, c-format
 msgid "unable to open or read %s"
 msgstr ""
 
-#: builtin/apply.c:2132
+#: builtin/apply.c:2149
 msgid "oops"
 msgstr ""
 
-#: builtin/apply.c:2654
+#: builtin/apply.c:2671
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr ""
 
-#: builtin/apply.c:2772
+#: builtin/apply.c:2789
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:2784
+#: builtin/apply.c:2801
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr ""
 
-#: builtin/apply.c:2790
+#: builtin/apply.c:2807
 #, c-format
 msgid ""
 "while searching for:\n"
 "%.*s"
 msgstr ""
 
-#: builtin/apply.c:2809
+#: builtin/apply.c:2826
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr ""
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2929
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr ""
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2935
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr ""
 
-#: builtin/apply.c:2939
+#: builtin/apply.c:2956
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr ""
 
-#: builtin/apply.c:3061
+#: builtin/apply.c:3078
 #, c-format
 msgid "cannot checkout %s"
 msgstr ""
 
-#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159
+#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176
 #, c-format
 msgid "read of %s failed"
 msgstr ""
 
-#: builtin/apply.c:3139 builtin/apply.c:3361
+#: builtin/apply.c:3156 builtin/apply.c:3378
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr ""
 
-#: builtin/apply.c:3220 builtin/apply.c:3375
+#: builtin/apply.c:3237 builtin/apply.c:3392
 #, c-format
 msgid "%s: does not exist in index"
 msgstr ""
 
-#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389
+#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: builtin/apply.c:3229 builtin/apply.c:3383
+#: builtin/apply.c:3246 builtin/apply.c:3400
 #, c-format
 msgid "%s: does not match index"
 msgstr ""
 
-#: builtin/apply.c:3331
+#: builtin/apply.c:3348
 msgid "removal patch leaves file contents"
 msgstr ""
 
-#: builtin/apply.c:3400
+#: builtin/apply.c:3417
 #, c-format
 msgid "%s: wrong type"
 msgstr ""
 
-#: builtin/apply.c:3402
+#: builtin/apply.c:3419
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr ""
 
-#: builtin/apply.c:3503
+#: builtin/apply.c:3520
 #, c-format
 msgid "%s: already exists in index"
 msgstr ""
 
-#: builtin/apply.c:3506
+#: builtin/apply.c:3523
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr ""
 
-#: builtin/apply.c:3526
+#: builtin/apply.c:3543
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr ""
 
-#: builtin/apply.c:3531
+#: builtin/apply.c:3548
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr ""
 
-#: builtin/apply.c:3539
+#: builtin/apply.c:3556
 #, c-format
 msgid "%s: patch does not apply"
 msgstr ""
 
-#: builtin/apply.c:3552
+#: builtin/apply.c:3569
 #, c-format
 msgid "Checking patch %s..."
 msgstr ""
 
-#: builtin/apply.c:3607 builtin/checkout.c:213 builtin/reset.c:158
+#: builtin/apply.c:3624 builtin/checkout.c:215 builtin/reset.c:158
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr ""
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3767
 #, c-format
 msgid "unable to remove %s from index"
 msgstr ""
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3795
 #, c-format
 msgid "corrupt patch for subproject %s"
 msgstr ""
 
-#: builtin/apply.c:3782
+#: builtin/apply.c:3799
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr ""
 
-#: builtin/apply.c:3787
+#: builtin/apply.c:3804
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr ""
 
-#: builtin/apply.c:3790 builtin/apply.c:3898
+#: builtin/apply.c:3807 builtin/apply.c:3915
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr ""
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3840
 #, c-format
 msgid "closing file '%s'"
 msgstr ""
 
-#: builtin/apply.c:3872
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr ""
 
-#: builtin/apply.c:3959
+#: builtin/apply.c:3976
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr ""
 
-#: builtin/apply.c:3967
+#: builtin/apply.c:3984
 msgid "internal error"
 msgstr ""
 
 #. Say this even without --verbose
-#: builtin/apply.c:3970
+#: builtin/apply.c:3987
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:3980
+#: builtin/apply.c:3997
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr ""
 
-#: builtin/apply.c:4001
+#: builtin/apply.c:4018
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr ""
 
-#: builtin/apply.c:4004
+#: builtin/apply.c:4021
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr ""
 
-#: builtin/apply.c:4154
+#: builtin/apply.c:4171
 msgid "unrecognized input"
 msgstr ""
 
-#: builtin/apply.c:4165
+#: builtin/apply.c:4182
 msgid "unable to read index file"
 msgstr ""
 
-#: builtin/apply.c:4284 builtin/apply.c:4287
+#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91
+#: builtin/fetch.c:63
 msgid "path"
 msgstr ""
 
-#: builtin/apply.c:4285
+#: builtin/apply.c:4302
 msgid "don't apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4288
+#: builtin/apply.c:4305
 msgid "apply changes matching the given path"
 msgstr ""
 
-#: builtin/apply.c:4290
+#: builtin/apply.c:4307
 msgid "num"
 msgstr ""
 
-#: builtin/apply.c:4291
+#: builtin/apply.c:4308
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr ""
 
-#: builtin/apply.c:4294
+#: builtin/apply.c:4311
 msgid "ignore additions made by the patch"
 msgstr ""
 
-#: builtin/apply.c:4296
+#: builtin/apply.c:4313
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr ""
 
-#: builtin/apply.c:4300
-msgid "shows number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: builtin/apply.c:4302
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: builtin/apply.c:4304
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: builtin/apply.c:4306
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: builtin/apply.c:4308
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: builtin/apply.c:4310
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: builtin/apply.c:4312
-msgid "attempt three-way merge if a patch does not apply"
-msgstr ""
-
-#: builtin/apply.c:4314
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: builtin/apply.c:4316
-msgid "paths are separated with NUL character"
+#: builtin/apply.c:4317
+msgid "show number of added and deleted lines in decimal notation"
 msgstr ""
 
 #: builtin/apply.c:4319
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: builtin/apply.c:4320
-msgid "action"
+msgid "instead of applying the patch, output a summary for the input"
 msgstr ""
 
 #: builtin/apply.c:4321
-msgid "detect new or modified lines that have whitespace errors"
+msgid "instead of applying the patch, see if the patch is applicable"
 msgstr ""
 
-#: builtin/apply.c:4324 builtin/apply.c:4327
-msgid "ignore changes in whitespace when finding context"
+#: builtin/apply.c:4323
+msgid "make sure the patch is applicable to the current index"
 msgstr ""
 
-#: builtin/apply.c:4330
-msgid "apply the patch in reverse"
+#: builtin/apply.c:4325
+msgid "apply a patch without touching the working tree"
 msgstr ""
 
-#: builtin/apply.c:4332
-msgid "don't expect at least one line of context"
+#: builtin/apply.c:4327
+msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr ""
 
-#: builtin/apply.c:4334
-msgid "leave the rejected hunks in corresponding *.rej files"
+#: builtin/apply.c:4329
+msgid "attempt three-way merge if a patch does not apply"
+msgstr ""
+
+#: builtin/apply.c:4331
+msgid "build a temporary index based on embedded index information"
+msgstr ""
+
+#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460
+msgid "paths are separated with NUL character"
 msgstr ""
 
 #: builtin/apply.c:4336
-msgid "allow overlapping hunks"
+msgid "ensure at least <n> lines of context match"
 msgstr ""
 
 #: builtin/apply.c:4337
-msgid "be verbose"
+msgid "action"
 msgstr ""
 
-#: builtin/apply.c:4339
+#: builtin/apply.c:4338
+msgid "detect new or modified lines that have whitespace errors"
+msgstr ""
+
+#: builtin/apply.c:4341 builtin/apply.c:4344
+msgid "ignore changes in whitespace when finding context"
+msgstr ""
+
+#: builtin/apply.c:4347
+msgid "apply the patch in reverse"
+msgstr ""
+
+#: builtin/apply.c:4349
+msgid "don't expect at least one line of context"
+msgstr ""
+
+#: builtin/apply.c:4351
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr ""
+
+#: builtin/apply.c:4353
+msgid "allow overlapping hunks"
+msgstr ""
+
+#: builtin/apply.c:4356
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr ""
 
-#: builtin/apply.c:4342
+#: builtin/apply.c:4359
 msgid "do not trust the line counts in the hunk headers"
 msgstr ""
 
-#: builtin/apply.c:4344
+#: builtin/apply.c:4361
 msgid "root"
 msgstr ""
 
-#: builtin/apply.c:4345
+#: builtin/apply.c:4362
 msgid "prepend <root> to all filenames"
 msgstr ""
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4384
 msgid "--3way outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4392
 msgid "--index outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4378
+#: builtin/apply.c:4395
 msgid "--cached outside a repository"
 msgstr ""
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4411
 #, c-format
 msgid "can't open patch '%s'"
 msgstr ""
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4425
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/apply.c:4414 builtin/apply.c:4424
+#: builtin/apply.c:4431 builtin/apply.c:4441
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -1838,175 +1980,428 @@
 msgid "git archive: expected a flush"
 msgstr ""
 
-#: builtin/branch.c:144
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr ""
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr ""
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr ""
+
+#: builtin/blame.c:25
+msgid "git blame [options] [rev-opts] [rev] [--] file"
+msgstr ""
+
+#: builtin/blame.c:30 builtin/shortlog.c:15
+msgid "[rev-opts] are documented in git-rev-list(1)"
+msgstr ""
+
+#: builtin/blame.c:2316
+msgid "Show blame entries as we find them, incrementally"
+msgstr ""
+
+#: builtin/blame.c:2317
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2318
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2319
+msgid "Show work cost statistics"
+msgstr ""
+
+#: builtin/blame.c:2320
+msgid "Show output score for blame entries"
+msgstr ""
+
+#: builtin/blame.c:2321
+msgid "Show original filename (Default: auto)"
+msgstr ""
+
+#: builtin/blame.c:2322
+msgid "Show original linenumber (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2323
+msgid "Show in a format designed for machine consumption"
+msgstr ""
+
+#: builtin/blame.c:2324
+msgid "Show porcelain format with per-line commit information"
+msgstr ""
+
+#: builtin/blame.c:2325
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2326
+msgid "Show raw timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2327
+msgid "Show long commit SHA1 (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2328
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2329
+msgid "Show author email instead of name (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2330
+msgid "Ignore whitespace differences"
+msgstr ""
+
+#: builtin/blame.c:2331
+msgid "Spend extra cycles to find better match"
+msgstr ""
+
+#: builtin/blame.c:2332
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr ""
+
+#: builtin/blame.c:2333
+msgid "Use <file>'s contents as the final image"
+msgstr ""
+
+#: builtin/blame.c:2334 builtin/blame.c:2335
+msgid "score"
+msgstr ""
+
+#: builtin/blame.c:2334
+msgid "Find line copies within and across files"
+msgstr ""
+
+#: builtin/blame.c:2335
+msgid "Find line movements within and across files"
+msgstr ""
+
+#: builtin/blame.c:2336
+msgid "n,m"
+msgstr ""
+
+#: builtin/blame.c:2336
+msgid "Process only line range n,m, counting from 1"
+msgstr ""
+
+#: builtin/branch.c:23
+msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
+msgstr ""
+
+#: builtin/branch.c:24
+msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
+msgstr ""
+
+#: builtin/branch.c:25
+msgid "git branch [options] [-r] (-d | -D) <branchname>..."
+msgstr ""
+
+#: builtin/branch.c:26
+msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
+msgstr ""
+
+#: builtin/branch.c:145
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
 "         '%s', but not yet merged to HEAD."
 msgstr ""
 
-#: builtin/branch.c:148
+#: builtin/branch.c:149
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
 "         '%s', even though it is merged to HEAD."
 msgstr ""
 
-#: builtin/branch.c:180
+#: builtin/branch.c:181
 msgid "cannot use -a with -d"
 msgstr ""
 
-#: builtin/branch.c:186
+#: builtin/branch.c:187
 msgid "Couldn't look up commit object for HEAD"
 msgstr ""
 
-#: builtin/branch.c:191
+#: builtin/branch.c:192
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr ""
 
-#: builtin/branch.c:202
+#: builtin/branch.c:203
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:203
+#: builtin/branch.c:204
 #, c-format
 msgid "branch '%s' not found."
 msgstr ""
 
-#: builtin/branch.c:210
+#: builtin/branch.c:211
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr ""
 
-#: builtin/branch.c:216
+#: builtin/branch.c:217
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
 "If you are sure you want to delete it, run 'git branch -D %s'."
 msgstr ""
 
-#: builtin/branch.c:225
+#: builtin/branch.c:226
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:226
+#: builtin/branch.c:227
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr ""
 
-#: builtin/branch.c:233
+#: builtin/branch.c:234
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:234
+#: builtin/branch.c:235
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr ""
 
-#: builtin/branch.c:239
+#: builtin/branch.c:240
 msgid "Update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:337
+#: builtin/branch.c:338
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr ""
 
-#: builtin/branch.c:409
+#: builtin/branch.c:410
 #, c-format
 msgid "[%s: behind %d]"
 msgstr ""
 
-#: builtin/branch.c:411
+#: builtin/branch.c:412
 #, c-format
 msgid "[behind %d]"
 msgstr ""
 
-#: builtin/branch.c:415
+#: builtin/branch.c:416
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:417
+#: builtin/branch.c:418
 #, c-format
 msgid "[ahead %d]"
 msgstr ""
 
-#: builtin/branch.c:420
+#: builtin/branch.c:421
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:423
+#: builtin/branch.c:424
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr ""
 
-#: builtin/branch.c:535
+#: builtin/branch.c:537
 msgid "(no branch)"
 msgstr ""
 
-#: builtin/branch.c:600
+#: builtin/branch.c:602
 msgid "some refs could not be read"
 msgstr ""
 
-#: builtin/branch.c:613
+#: builtin/branch.c:615
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 
-#: builtin/branch.c:623
+#: builtin/branch.c:625
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr ""
 
-#: builtin/branch.c:638
+#: builtin/branch.c:640
 msgid "Branch rename failed"
 msgstr ""
 
-#: builtin/branch.c:642
+#: builtin/branch.c:644
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr ""
 
-#: builtin/branch.c:646
+#: builtin/branch.c:648
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr ""
 
-#: builtin/branch.c:653
+#: builtin/branch.c:655
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 
-#: builtin/branch.c:668
+#: builtin/branch.c:670
 #, c-format
 msgid "malformed object name %s"
 msgstr ""
 
-#: builtin/branch.c:692
+#: builtin/branch.c:694
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr ""
 
-#: builtin/branch.c:783
+#: builtin/branch.c:724
+msgid "Generic options"
+msgstr ""
+
+#: builtin/branch.c:726
+msgid "show hash and subject, give twice for upstream branch"
+msgstr ""
+
+#: builtin/branch.c:727
+msgid "suppress informational messages"
+msgstr ""
+
+#: builtin/branch.c:728
+msgid "set up tracking mode (see git-pull(1))"
+msgstr ""
+
+#: builtin/branch.c:730
+msgid "change upstream info"
+msgstr ""
+
+#: builtin/branch.c:734
+msgid "use colored output"
+msgstr ""
+
+#: builtin/branch.c:735
+msgid "act on remote-tracking branches"
+msgstr ""
+
+#: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765
+#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396
+#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470
+msgid "commit"
+msgstr ""
+
+#: builtin/branch.c:739 builtin/branch.c:745
+msgid "print only branches that contain the commit"
+msgstr ""
+
+#: builtin/branch.c:751
+msgid "Specific git-branch actions:"
+msgstr ""
+
+#: builtin/branch.c:752
+msgid "list both remote-tracking and local branches"
+msgstr ""
+
+#: builtin/branch.c:754
+msgid "delete fully merged branch"
+msgstr ""
+
+#: builtin/branch.c:755
+msgid "delete branch (even if not merged)"
+msgstr ""
+
+#: builtin/branch.c:756
+msgid "move/rename a branch and its reflog"
+msgstr ""
+
+#: builtin/branch.c:757
+msgid "move/rename a branch, even if target exists"
+msgstr ""
+
+#: builtin/branch.c:758
+msgid "list branch names"
+msgstr ""
+
+#: builtin/branch.c:759
+msgid "create the branch's reflog"
+msgstr ""
+
+#: builtin/branch.c:761
+msgid "edit the description for the branch"
+msgstr ""
+
+#: builtin/branch.c:762
+msgid "force creation (when already exists)"
+msgstr ""
+
+#: builtin/branch.c:765
+msgid "print only not merged branches"
+msgstr ""
+
+#: builtin/branch.c:771
+msgid "print only merged branches"
+msgstr ""
+
+#: builtin/branch.c:775
+msgid "list branches in columns"
+msgstr ""
+
+#: builtin/branch.c:788
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr ""
 
-#: builtin/branch.c:788 builtin/clone.c:561
+#: builtin/branch.c:793 builtin/clone.c:561
 msgid "HEAD not found below refs/heads!"
 msgstr ""
 
-#: builtin/branch.c:808
+#: builtin/branch.c:813
 msgid "--column and --verbose are incompatible"
 msgstr ""
 
-#: builtin/branch.c:857
+#: builtin/branch.c:864
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr ""
+
+#: builtin/branch.c:876
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr ""
+
+#: builtin/branch.c:891
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 
+#: builtin/branch.c:894
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+
+#: builtin/branch.c:911
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+
+#: builtin/branch.c:912
+#, c-format
+msgid "    git branch -d %s\n"
+msgstr ""
+
+#: builtin/branch.c:913
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr ""
+
 #: builtin/bundle.c:47
 #, c-format
 msgid "%s is okay\n"
@@ -2020,99 +2415,227 @@
 msgid "Need a repository to unbundle."
 msgstr ""
 
-#: builtin/checkout.c:114 builtin/checkout.c:147
-#, c-format
-msgid "path '%s' does not have our version"
+#: builtin/cat-file.c:247
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr ""
+
+#: builtin/cat-file.c:248
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr ""
+
+#: builtin/cat-file.c:266
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr ""
+
+#: builtin/cat-file.c:267
+msgid "show object type"
+msgstr ""
+
+#: builtin/cat-file.c:268
+msgid "show object size"
+msgstr ""
+
+#: builtin/cat-file.c:270
+msgid "exit with zero when there's no error"
+msgstr ""
+
+#: builtin/cat-file.c:271
+msgid "pretty-print object's content"
+msgstr ""
+
+#: builtin/cat-file.c:273
+msgid "for blob objects, run textconv on object's content"
+msgstr ""
+
+#: builtin/cat-file.c:275
+msgid "show info and content of objects fed from the standard input"
+msgstr ""
+
+#: builtin/cat-file.c:278
+msgid "show info about objects fed from the standard input"
+msgstr ""
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | attr...] [--] pathname..."
+msgstr ""
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-a | --all | attr...] < <list-of-paths>"
+msgstr ""
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr ""
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr ""
+
+#: builtin/check-attr.c:21 builtin/hash-object.c:75
+msgid "read file names from stdin"
+msgstr ""
+
+#: builtin/check-attr.c:23
+msgid "input paths are terminated by a null character"
+msgstr ""
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [options] [--] [<file>...]"
+msgstr ""
+
+#: builtin/checkout-index.c:187
+msgid "check out all files in the index"
+msgstr ""
+
+#: builtin/checkout-index.c:188
+msgid "force overwrite of existing files"
+msgstr ""
+
+#: builtin/checkout-index.c:190
+msgid "no warning for existing files and files not in index"
+msgstr ""
+
+#: builtin/checkout-index.c:192
+msgid "don't checkout new files"
+msgstr ""
+
+#: builtin/checkout-index.c:194
+msgid "update stat information in the index file"
+msgstr ""
+
+#: builtin/checkout-index.c:200
+msgid "read list of paths from the standard input"
+msgstr ""
+
+#: builtin/checkout-index.c:202
+msgid "write the content to temporary files"
+msgstr ""
+
+#: builtin/checkout-index.c:203 builtin/column.c:30
+msgid "string"
+msgstr ""
+
+#: builtin/checkout-index.c:204
+msgid "when creating files, prepend <string>"
+msgstr ""
+
+#: builtin/checkout-index.c:207
+msgid "copy out the files from named stage"
+msgstr ""
+
+#: builtin/checkout.c:25
+msgid "git checkout [options] <branch>"
+msgstr ""
+
+#: builtin/checkout.c:26
+msgid "git checkout [options] [<branch>] -- <file>..."
 msgstr ""
 
 #: builtin/checkout.c:116 builtin/checkout.c:149
 #, c-format
+msgid "path '%s' does not have our version"
+msgstr ""
+
+#: builtin/checkout.c:118 builtin/checkout.c:151
+#, c-format
 msgid "path '%s' does not have their version"
 msgstr ""
 
-#: builtin/checkout.c:132
+#: builtin/checkout.c:134
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr ""
 
-#: builtin/checkout.c:176
+#: builtin/checkout.c:178
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr ""
 
-#: builtin/checkout.c:193
+#: builtin/checkout.c:195
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr ""
 
-#: builtin/checkout.c:210
+#: builtin/checkout.c:212
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr ""
 
-#: builtin/checkout.c:235 builtin/checkout.c:393
+#: builtin/checkout.c:236 builtin/checkout.c:239 builtin/checkout.c:242
+#: builtin/checkout.c:245
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr ""
+
+#: builtin/checkout.c:248 builtin/checkout.c:251
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr ""
+
+#: builtin/checkout.c:254
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr ""
+
+#: builtin/checkout.c:265 builtin/checkout.c:426
 msgid "corrupt index file"
 msgstr ""
 
-#: builtin/checkout.c:265 builtin/checkout.c:272
+#: builtin/checkout.c:295 builtin/checkout.c:302
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr ""
 
-#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586
-#: builtin/merge.c:812
+#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586
+#: builtin/merge.c:811
 msgid "unable to write new index file"
 msgstr ""
 
-#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408
-msgid "diff_setup_done failed"
-msgstr ""
-
-#: builtin/checkout.c:415
+#: builtin/checkout.c:448
 msgid "you need to resolve your current index first"
 msgstr ""
 
-#: builtin/checkout.c:534
+#: builtin/checkout.c:569
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:567
+#: builtin/checkout.c:602
 msgid "HEAD is now at"
 msgstr ""
 
-#: builtin/checkout.c:574
+#: builtin/checkout.c:609
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:577
+#: builtin/checkout.c:612
 #, c-format
 msgid "Already on '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:581
+#: builtin/checkout.c:616
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:583
+#: builtin/checkout.c:618
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:585
+#: builtin/checkout.c:620
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr ""
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:676
 #, c-format
 msgid " ... and %d more.\n"
 msgstr ""
 
 #. The singular version
-#: builtin/checkout.c:647
+#: builtin/checkout.c:682
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -2127,7 +2650,7 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/checkout.c:665
+#: builtin/checkout.c:700
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -2137,97 +2660,184 @@
 "\n"
 msgstr ""
 
-#: builtin/checkout.c:695
+#: builtin/checkout.c:730
 msgid "internal error in revision walk"
 msgstr ""
 
-#: builtin/checkout.c:699
+#: builtin/checkout.c:734
 msgid "Previous HEAD position was"
 msgstr ""
 
-#: builtin/checkout.c:725 builtin/checkout.c:920
+#: builtin/checkout.c:761 builtin/checkout.c:950
 msgid "You are on a branch yet to be born"
 msgstr ""
 
 #. case (1)
-#: builtin/checkout.c:856
+#: builtin/checkout.c:886
 #, c-format
 msgid "invalid reference: %s"
 msgstr ""
 
 #. case (1): want a tree
-#: builtin/checkout.c:895
+#: builtin/checkout.c:925
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr ""
 
-#: builtin/checkout.c:977
-msgid "-B cannot be used with -b"
+#: builtin/checkout.c:961
+msgid "paths cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:986
-msgid "--patch is incompatible with all other options"
-msgstr ""
-
-#: builtin/checkout.c:989
-msgid "--detach cannot be used with -b/-B/--orphan"
-msgstr ""
-
-#: builtin/checkout.c:991
-msgid "--detach cannot be used with -t"
-msgstr ""
-
-#: builtin/checkout.c:997
-msgid "--track needs a branch name"
-msgstr ""
-
-#: builtin/checkout.c:1004
-msgid "Missing branch name; try -b"
-msgstr ""
-
-#: builtin/checkout.c:1010
-msgid "--orphan and -b|-B are mutually exclusive"
-msgstr ""
-
-#: builtin/checkout.c:1012
-msgid "--orphan cannot be used with -t"
-msgstr ""
-
-#: builtin/checkout.c:1022
-msgid "git checkout: -f and -m are incompatible"
-msgstr ""
-
-#: builtin/checkout.c:1056
-msgid "invalid path specification"
-msgstr ""
-
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:964 builtin/checkout.c:968
 #, c-format
-msgid ""
-"git checkout: updating paths is incompatible with switching branches.\n"
-"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgid "'%s' cannot be used with switching branches"
 msgstr ""
 
-#: builtin/checkout.c:1066
-msgid "git checkout: updating paths is incompatible with switching branches."
+#: builtin/checkout.c:972 builtin/checkout.c:975 builtin/checkout.c:980
+#: builtin/checkout.c:983
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr ""
+
+#: builtin/checkout.c:988
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr ""
+
+#: builtin/checkout.c:1009 builtin/gc.c:177
+msgid "suppress progress reporting"
+msgstr ""
+
+#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89
+#: builtin/remote.c:169 builtin/remote.c:171
+msgid "branch"
+msgstr ""
+
+#: builtin/checkout.c:1011
+msgid "create and checkout a new branch"
+msgstr ""
+
+#: builtin/checkout.c:1013
+msgid "create/reset and checkout a branch"
+msgstr ""
+
+#: builtin/checkout.c:1014
+msgid "create reflog for new branch"
+msgstr ""
+
+#: builtin/checkout.c:1015
+msgid "detach the HEAD at named commit"
+msgstr ""
+
+#: builtin/checkout.c:1016
+msgid "set upstream info for new branch"
+msgstr ""
+
+#: builtin/checkout.c:1018
+msgid "new branch"
+msgstr ""
+
+#: builtin/checkout.c:1018
+msgid "new unparented branch"
+msgstr ""
+
+#: builtin/checkout.c:1019
+msgid "checkout our version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1021
+msgid "checkout their version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1023
+msgid "force checkout (throw away local modifications)"
+msgstr ""
+
+#: builtin/checkout.c:1024
+msgid "perform a 3-way merge with the new branch"
+msgstr ""
+
+#: builtin/checkout.c:1025 builtin/merge.c:215
+msgid "update ignored files (default)"
+msgstr ""
+
+#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241
+msgid "style"
+msgstr ""
+
+#: builtin/checkout.c:1027
+msgid "conflict style (merge or diff3)"
+msgstr ""
+
+#: builtin/checkout.c:1030
+msgid "second guess 'git checkout no-such-branch'"
+msgstr ""
+
+#: builtin/checkout.c:1054
+msgid "-b, -B and --orphan are mutually exclusive"
 msgstr ""
 
 #: builtin/checkout.c:1071
-msgid "git checkout: --detach does not take a path argument"
+msgid "--track needs a branch name"
 msgstr ""
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1078
+msgid "Missing branch name; try -b"
+msgstr ""
+
+#: builtin/checkout.c:1113
+msgid "invalid path specification"
+msgstr ""
+
+#: builtin/checkout.c:1120
+#, c-format
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgstr ""
+
+#: builtin/checkout.c:1125
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr ""
+
+#: builtin/checkout.c:1129
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
 msgstr ""
 
-#: builtin/checkout.c:1093
-msgid "Cannot switch branch to a non-commit."
+#: builtin/clean.c:19
+msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
 msgstr ""
 
-#: builtin/checkout.c:1096
-msgid "--ours/--theirs is incompatible with switching branches."
+#: builtin/clean.c:51
+msgid "do not print names of files removed"
+msgstr ""
+
+#: builtin/clean.c:53
+msgid "force"
+msgstr ""
+
+#: builtin/clean.c:55
+msgid "remove whole directories"
+msgstr ""
+
+#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802
+#: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199
+msgid "pattern"
+msgstr ""
+
+#: builtin/clean.c:57
+msgid "add <pattern> to ignore rules"
+msgstr ""
+
+#: builtin/clean.c:58
+msgid "remove ignored files, too"
+msgstr ""
+
+#: builtin/clean.c:60
+msgid "remove only ignored files"
 msgstr ""
 
 #: builtin/clean.c:78
@@ -2270,6 +2880,99 @@
 msgid "Not removing %s\n"
 msgstr ""
 
+#: builtin/clone.c:36
+msgid "git clone [options] [--] <repo> [<dir>]"
+msgstr ""
+
+#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212
+#: builtin/push.c:399
+msgid "force progress reporting"
+msgstr ""
+
+#: builtin/clone.c:66
+msgid "don't create a checkout"
+msgstr ""
+
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+msgid "create a bare repository"
+msgstr ""
+
+#: builtin/clone.c:72
+msgid "create a mirror repository (implies bare)"
+msgstr ""
+
+#: builtin/clone.c:74
+msgid "to clone from a local repository"
+msgstr ""
+
+#: builtin/clone.c:76
+msgid "don't use local hardlinks, always copy"
+msgstr ""
+
+#: builtin/clone.c:78
+msgid "setup as shared repository"
+msgstr ""
+
+#: builtin/clone.c:80 builtin/clone.c:82
+msgid "initialize submodules in the clone"
+msgstr ""
+
+#: builtin/clone.c:83 builtin/init-db.c:485
+msgid "template-directory"
+msgstr ""
+
+#: builtin/clone.c:84 builtin/init-db.c:486
+msgid "directory from which templates will be used"
+msgstr ""
+
+#: builtin/clone.c:86
+msgid "reference repository"
+msgstr ""
+
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr ""
+
+#: builtin/clone.c:88
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr ""
+
+#: builtin/clone.c:90
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr ""
+
+#: builtin/clone.c:92
+msgid "path to git-upload-pack on the remote"
+msgstr ""
+
+#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747
+msgid "depth"
+msgstr ""
+
+#: builtin/clone.c:94
+msgid "create a shallow clone of that depth"
+msgstr ""
+
+#: builtin/clone.c:96
+msgid "clone only one branch, HEAD or --branch"
+msgstr ""
+
+#: builtin/clone.c:97 builtin/init-db.c:494
+msgid "gitdir"
+msgstr ""
+
+#: builtin/clone.c:98 builtin/init-db.c:495
+msgid "separate git dir from working tree"
+msgstr ""
+
+#: builtin/clone.c:99
+msgid "key=value"
+msgstr ""
+
+#: builtin/clone.c:100
+msgid "set config inside the new repository"
+msgstr ""
+
 #: builtin/clone.c:243
 #, c-format
 msgid "reference repository '%s' is not a local directory."
@@ -2280,7 +2983,7 @@
 msgid "failed to create directory '%s'"
 msgstr ""
 
-#: builtin/clone.c:308 builtin/diff.c:75
+#: builtin/clone.c:308 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
 msgstr ""
@@ -2295,11 +2998,6 @@
 msgid "failed to stat %s\n"
 msgstr ""
 
-#: builtin/clone.c:341
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr ""
-
 #: builtin/clone.c:346
 #, c-format
 msgid "failed to create link '%s'"
@@ -2390,10 +3088,46 @@
 msgid "You appear to have cloned an empty repository."
 msgstr ""
 
+#: builtin/column.c:9
+msgid "git column [options]"
+msgstr ""
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr ""
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr ""
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr ""
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr ""
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr ""
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr ""
+
 #: builtin/column.c:51
 msgid "--command must be the first argument"
 msgstr ""
 
+#: builtin/commit.c:33
+msgid "git commit [options] [--] <filepattern>..."
+msgstr ""
+
+#: builtin/commit.c:38
+msgid "git status [options] [--] <filepattern>..."
+msgstr ""
+
 #: builtin/commit.c:43
 msgid ""
 "Your name and email address were configured automatically based\n"
@@ -2457,61 +3191,61 @@
 msgid "unable to write temporary index file"
 msgstr ""
 
-#: builtin/commit.c:496 builtin/commit.c:502
+#: builtin/commit.c:510 builtin/commit.c:516
 #, c-format
 msgid "invalid commit: %s"
 msgstr ""
 
-#: builtin/commit.c:525
+#: builtin/commit.c:539
 msgid "malformed --author parameter"
 msgstr ""
 
-#: builtin/commit.c:585
+#: builtin/commit.c:600
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr ""
 
-#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970
+#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985
 #, c-format
 msgid "could not lookup commit %s"
 msgstr ""
 
-#: builtin/commit.c:635 builtin/shortlog.c:296
+#: builtin/commit.c:650 builtin/shortlog.c:296
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr ""
 
-#: builtin/commit.c:637
+#: builtin/commit.c:652
 msgid "could not read log from standard input"
 msgstr ""
 
-#: builtin/commit.c:641
+#: builtin/commit.c:656
 #, c-format
 msgid "could not read log file '%s'"
 msgstr ""
 
-#: builtin/commit.c:647
+#: builtin/commit.c:662
 msgid "commit has empty message"
 msgstr ""
 
-#: builtin/commit.c:663
+#: builtin/commit.c:678
 msgid "could not read MERGE_MSG"
 msgstr ""
 
-#: builtin/commit.c:667
+#: builtin/commit.c:682
 msgid "could not read SQUASH_MSG"
 msgstr ""
 
-#: builtin/commit.c:671
+#: builtin/commit.c:686
 #, c-format
 msgid "could not read '%s'"
 msgstr ""
 
-#: builtin/commit.c:723
+#: builtin/commit.c:738
 msgid "could not write commit template"
 msgstr ""
 
-#: builtin/commit.c:734
+#: builtin/commit.c:749
 #, c-format
 msgid ""
 "\n"
@@ -2521,7 +3255,7 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:739
+#: builtin/commit.c:754
 #, c-format
 msgid ""
 "\n"
@@ -2531,177 +3265,490 @@
 "and try again.\n"
 msgstr ""
 
-#: builtin/commit.c:751
+#: builtin/commit.c:766
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:756
+#: builtin/commit.c:771
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be kept; you may remove them yourself if you want to.\n"
 "An empty message aborts the commit.\n"
 msgstr ""
 
-#: builtin/commit.c:769
+#: builtin/commit.c:784
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr ""
 
-#: builtin/commit.c:776
+#: builtin/commit.c:791
 #, c-format
 msgid "%sCommitter: %s"
 msgstr ""
 
-#: builtin/commit.c:796
+#: builtin/commit.c:811
 msgid "Cannot read index"
 msgstr ""
 
-#: builtin/commit.c:833
+#: builtin/commit.c:848
 msgid "Error building trees"
 msgstr ""
 
-#: builtin/commit.c:848 builtin/tag.c:361
+#: builtin/commit.c:863 builtin/tag.c:361
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr ""
 
-#: builtin/commit.c:945
+#: builtin/commit.c:960
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr ""
 
-#: builtin/commit.c:960 builtin/commit.c:1160
+#: builtin/commit.c:975 builtin/commit.c:1175
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr ""
 
-#: builtin/commit.c:1000
+#: builtin/commit.c:1015
 msgid "Using both --reset-author and --author does not make sense"
 msgstr ""
 
-#: builtin/commit.c:1011
+#: builtin/commit.c:1026
 msgid "You have nothing to amend."
 msgstr ""
 
-#: builtin/commit.c:1014
+#: builtin/commit.c:1029
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1016
+#: builtin/commit.c:1031
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr ""
 
-#: builtin/commit.c:1019
+#: builtin/commit.c:1034
 msgid "Options --squash and --fixup cannot be used together"
 msgstr ""
 
-#: builtin/commit.c:1029
+#: builtin/commit.c:1044
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr ""
 
-#: builtin/commit.c:1031
+#: builtin/commit.c:1046
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr ""
 
-#: builtin/commit.c:1039
+#: builtin/commit.c:1054
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr ""
 
-#: builtin/commit.c:1056
+#: builtin/commit.c:1071
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 
-#: builtin/commit.c:1058
+#: builtin/commit.c:1073
 msgid "No paths with --include/--only does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1060
+#: builtin/commit.c:1075
 msgid "Clever... amending the last one with dirty index."
 msgstr ""
 
-#: builtin/commit.c:1062
+#: builtin/commit.c:1077
 msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
 msgstr ""
 
-#: builtin/commit.c:1072 builtin/tag.c:577
+#: builtin/commit.c:1087 builtin/tag.c:577
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr ""
 
-#: builtin/commit.c:1077
+#: builtin/commit.c:1092
 msgid "Paths with -a does not make sense."
 msgstr ""
 
-#: builtin/commit.c:1260
+#: builtin/commit.c:1189 builtin/commit.c:1417
+msgid "show status concisely"
+msgstr ""
+
+#: builtin/commit.c:1191 builtin/commit.c:1419
+msgid "show branch information"
+msgstr ""
+
+#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389
+msgid "machine-readable output"
+msgstr ""
+
+#: builtin/commit.c:1196 builtin/commit.c:1423
+msgid "terminate entries with NUL"
+msgstr ""
+
+#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636
+#: builtin/fast-export.c:639 builtin/tag.c:461
+msgid "mode"
+msgstr ""
+
+#: builtin/commit.c:1199 builtin/commit.c:1426
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1202
+msgid "show ignored files"
+msgstr ""
+
+#: builtin/commit.c:1203 parse-options.h:151
+msgid "when"
+msgstr ""
+
+#: builtin/commit.c:1204
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1206
+msgid "list untracked files in columns"
+msgstr ""
+
+#: builtin/commit.c:1275
 msgid "couldn't look up newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1262
+#: builtin/commit.c:1277
 msgid "could not parse newly created commit"
 msgstr ""
 
-#: builtin/commit.c:1303
+#: builtin/commit.c:1318
 msgid "detached HEAD"
 msgstr ""
 
-#: builtin/commit.c:1305
+#: builtin/commit.c:1320
 msgid " (root-commit)"
 msgstr ""
 
-#: builtin/commit.c:1449
+#: builtin/commit.c:1387
+msgid "suppress summary after successful commit"
+msgstr ""
+
+#: builtin/commit.c:1388
+msgid "show diff in commit message template"
+msgstr ""
+
+#: builtin/commit.c:1390
+msgid "Commit message options"
+msgstr ""
+
+#: builtin/commit.c:1391 builtin/tag.c:459
+msgid "read message from file"
+msgstr ""
+
+#: builtin/commit.c:1392
+msgid "author"
+msgstr ""
+
+#: builtin/commit.c:1392
+msgid "override author for commit"
+msgstr ""
+
+#: builtin/commit.c:1393 builtin/gc.c:178
+msgid "date"
+msgstr ""
+
+#: builtin/commit.c:1393
+msgid "override date for commit"
+msgstr ""
+
+#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534
+#: builtin/notes.c:691 builtin/tag.c:457
+msgid "message"
+msgstr ""
+
+#: builtin/commit.c:1394
+msgid "commit message"
+msgstr ""
+
+#: builtin/commit.c:1395
+msgid "reuse and edit message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1396
+msgid "reuse message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1397
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+
+#: builtin/commit.c:1398
+msgid "use autosquash formatted message to squash specified commit"
+msgstr ""
+
+#: builtin/commit.c:1399
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr ""
+
+#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109
+msgid "add Signed-off-by:"
+msgstr ""
+
+#: builtin/commit.c:1401
+msgid "use specified template file"
+msgstr ""
+
+#: builtin/commit.c:1402
+msgid "force edit of commit"
+msgstr ""
+
+#: builtin/commit.c:1403
+msgid "default"
+msgstr ""
+
+#: builtin/commit.c:1403 builtin/tag.c:462
+msgid "how to strip spaces and #comments from message"
+msgstr ""
+
+#: builtin/commit.c:1404
+msgid "include status in commit message template"
+msgstr ""
+
+#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463
+msgid "key id"
+msgstr ""
+
+#: builtin/commit.c:1406 builtin/merge.c:214
+msgid "GPG sign commit"
+msgstr ""
+
+#. end commit message options
+#: builtin/commit.c:1409
+msgid "Commit contents options"
+msgstr ""
+
+#: builtin/commit.c:1410
+msgid "commit all changed files"
+msgstr ""
+
+#: builtin/commit.c:1411
+msgid "add specified files to index for commit"
+msgstr ""
+
+#: builtin/commit.c:1412
+msgid "interactively add files"
+msgstr ""
+
+#: builtin/commit.c:1413
+msgid "interactively add changes"
+msgstr ""
+
+#: builtin/commit.c:1414
+msgid "commit only specified files"
+msgstr ""
+
+#: builtin/commit.c:1415
+msgid "bypass pre-commit hook"
+msgstr ""
+
+#: builtin/commit.c:1416
+msgid "show what would be committed"
+msgstr ""
+
+#: builtin/commit.c:1424
+msgid "amend previous commit"
+msgstr ""
+
+#: builtin/commit.c:1425
+msgid "bypass post-rewrite hook"
+msgstr ""
+
+#: builtin/commit.c:1430
+msgid "ok to record an empty change"
+msgstr ""
+
+#: builtin/commit.c:1433
+msgid "ok to record a change with an empty message"
+msgstr ""
+
+#: builtin/commit.c:1464
 msgid "could not parse HEAD commit"
 msgstr ""
 
-#: builtin/commit.c:1487 builtin/merge.c:509
+#: builtin/commit.c:1502 builtin/merge.c:508
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr ""
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1509
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr ""
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1516
 msgid "could not read MERGE_MODE"
 msgstr ""
 
-#: builtin/commit.c:1520
+#: builtin/commit.c:1535
 #, c-format
 msgid "could not read commit message: %s"
 msgstr ""
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1549
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr ""
 
-#: builtin/commit.c:1539
+#: builtin/commit.c:1554
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr ""
 
-#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961
+#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960
 msgid "failed to write commit object"
 msgstr ""
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1590
 msgid "cannot lock HEAD ref"
 msgstr ""
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1594
 msgid "cannot update HEAD ref"
 msgstr ""
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1605
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
 "not exceeded, and then \"git reset HEAD\" to recover."
 msgstr ""
 
+#: builtin/config.c:7
+msgid "git config [options]"
+msgstr ""
+
+#: builtin/config.c:52
+msgid "Config file location"
+msgstr ""
+
+#: builtin/config.c:53
+msgid "use global config file"
+msgstr ""
+
+#: builtin/config.c:54
+msgid "use system config file"
+msgstr ""
+
+#: builtin/config.c:55
+msgid "use repository config file"
+msgstr ""
+
+#: builtin/config.c:56
+msgid "use given config file"
+msgstr ""
+
+#: builtin/config.c:57
+msgid "Action"
+msgstr ""
+
+#: builtin/config.c:58
+msgid "get value: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:59
+msgid "get all values: key [value-regex]"
+msgstr ""
+
+#: builtin/config.c:60
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr ""
+
+#: builtin/config.c:61
+msgid "replace all matching variables: name value [value_regex]"
+msgstr ""
+
+#: builtin/config.c:62
+msgid "add a new variable: name value"
+msgstr ""
+
+#: builtin/config.c:63
+msgid "remove a variable: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:64
+msgid "remove all matches: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:65
+msgid "rename section: old-name new-name"
+msgstr ""
+
+#: builtin/config.c:66
+msgid "remove a section: name"
+msgstr ""
+
+#: builtin/config.c:67
+msgid "list all"
+msgstr ""
+
+#: builtin/config.c:68
+msgid "open an editor"
+msgstr ""
+
+#: builtin/config.c:69 builtin/config.c:70
+msgid "slot"
+msgstr ""
+
+#: builtin/config.c:69
+msgid "find the color configured: [default]"
+msgstr ""
+
+#: builtin/config.c:70
+msgid "find the color setting: [stdout-is-tty]"
+msgstr ""
+
+#: builtin/config.c:71
+msgid "Type"
+msgstr ""
+
+#: builtin/config.c:72
+msgid "value is \"true\" or \"false\""
+msgstr ""
+
+#: builtin/config.c:73
+msgid "value is decimal number"
+msgstr ""
+
+#: builtin/config.c:74
+msgid "value is --bool or --int"
+msgstr ""
+
+#: builtin/config.c:75
+msgid "value is a path (file or directory name)"
+msgstr ""
+
+#: builtin/config.c:76
+msgid "Other"
+msgstr ""
+
+#: builtin/config.c:77
+msgid "terminate values with NUL byte"
+msgstr ""
+
+#: builtin/config.c:78
+msgid "respect include directives on lookup"
+msgstr ""
+
+#: builtin/count-objects.c:69
+msgid "git count-objects [-v]"
+msgstr ""
+
+#: builtin/describe.c:15
+msgid "git describe [options] <committish>*"
+msgstr ""
+
+#: builtin/describe.c:16
+msgid "git describe [options] --dirty"
+msgstr ""
+
 #: builtin/describe.c:234
 #, c-format
 msgid "annotated tag %s not available"
@@ -2768,6 +3815,50 @@
 "gave up search at %s\n"
 msgstr ""
 
+#: builtin/describe.c:403
+msgid "find the tag that comes after the commit"
+msgstr ""
+
+#: builtin/describe.c:404
+msgid "debug search strategy on stderr"
+msgstr ""
+
+#: builtin/describe.c:405
+msgid "use any ref in .git/refs"
+msgstr ""
+
+#: builtin/describe.c:406
+msgid "use any tag in .git/refs/tags"
+msgstr ""
+
+#: builtin/describe.c:407
+msgid "always use long format"
+msgstr ""
+
+#: builtin/describe.c:410
+msgid "only output exact matches"
+msgstr ""
+
+#: builtin/describe.c:412
+msgid "consider <n> most recent tags (default: 10)"
+msgstr ""
+
+#: builtin/describe.c:414
+msgid "only consider tags matching <pattern>"
+msgstr ""
+
+#: builtin/describe.c:416 builtin/name-rev.c:238
+msgid "show abbreviated commit object as fallback"
+msgstr ""
+
+#: builtin/describe.c:417
+msgid "mark"
+msgstr ""
+
+#: builtin/describe.c:418
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr ""
+
 #: builtin/describe.c:436
 msgid "--long is incompatible with --abbrev=0"
 msgstr ""
@@ -2780,191 +3871,429 @@
 msgid "--dirty is incompatible with committishes"
 msgstr ""
 
-#: builtin/diff.c:77
+#: builtin/diff.c:79
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr ""
 
-#: builtin/diff.c:220
+#: builtin/diff.c:224
 #, c-format
 msgid "invalid option: %s"
 msgstr ""
 
-#: builtin/diff.c:297
+#: builtin/diff.c:301
 msgid "Not a git repository"
 msgstr ""
 
-#: builtin/diff.c:341
+#: builtin/diff.c:344
 #, c-format
 msgid "invalid object '%s' given."
 msgstr ""
 
-#: builtin/diff.c:346
+#: builtin/diff.c:349
 #, c-format
 msgid "more than %d trees given: '%s'"
 msgstr ""
 
-#: builtin/diff.c:356
+#: builtin/diff.c:359
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr ""
 
-#: builtin/diff.c:364
+#: builtin/diff.c:367
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr ""
 
-#: builtin/fetch.c:200
+#: builtin/fast-export.c:22
+msgid "git fast-export [rev-list-opts]"
+msgstr ""
+
+#: builtin/fast-export.c:635
+msgid "show progress after <n> objects"
+msgstr ""
+
+#: builtin/fast-export.c:637
+msgid "select handling of signed tags"
+msgstr ""
+
+#: builtin/fast-export.c:640
+msgid "select handling of tags that tag filtered objects"
+msgstr ""
+
+#: builtin/fast-export.c:643
+msgid "Dump marks to this file"
+msgstr ""
+
+#: builtin/fast-export.c:645
+msgid "Import marks from this file"
+msgstr ""
+
+#: builtin/fast-export.c:647
+msgid "Fake a tagger when tags lack one"
+msgstr ""
+
+#: builtin/fast-export.c:649
+msgid "Output full tree for each commit"
+msgstr ""
+
+#: builtin/fast-export.c:651
+msgid "Use the done feature to terminate the stream"
+msgstr ""
+
+#: builtin/fast-export.c:652
+msgid "Skip output of blob data"
+msgstr ""
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr ""
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr ""
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr ""
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr ""
+
+#: builtin/fetch.c:60
+msgid "fetch from all remotes"
+msgstr ""
+
+#: builtin/fetch.c:62
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr ""
+
+#: builtin/fetch.c:64
+msgid "path to upload pack on remote end"
+msgstr ""
+
+#: builtin/fetch.c:65
+msgid "force overwrite of local branch"
+msgstr ""
+
+#: builtin/fetch.c:67
+msgid "fetch from multiple remotes"
+msgstr ""
+
+#: builtin/fetch.c:69
+msgid "fetch all tags and associated objects"
+msgstr ""
+
+#: builtin/fetch.c:71
+msgid "do not fetch all tags (--no-tags)"
+msgstr ""
+
+#: builtin/fetch.c:73
+msgid "prune remote-tracking branches no longer on remote"
+msgstr ""
+
+#: builtin/fetch.c:74
+msgid "on-demand"
+msgstr ""
+
+#: builtin/fetch.c:75
+msgid "control recursive fetching of submodules"
+msgstr ""
+
+#: builtin/fetch.c:79
+msgid "keep downloaded pack"
+msgstr ""
+
+#: builtin/fetch.c:81
+msgid "allow updating of HEAD ref"
+msgstr ""
+
+#: builtin/fetch.c:84
+msgid "deepen history of shallow clone"
+msgstr ""
+
+#: builtin/fetch.c:85 builtin/log.c:1083
+msgid "dir"
+msgstr ""
+
+#: builtin/fetch.c:86
+msgid "prepend this to submodule path output"
+msgstr ""
+
+#: builtin/fetch.c:89
+msgid "default mode for recursion"
+msgstr ""
+
+#: builtin/fetch.c:201
 msgid "Couldn't find remote ref HEAD"
 msgstr ""
 
-#: builtin/fetch.c:253
+#: builtin/fetch.c:254
 #, c-format
 msgid "object %s not found"
 msgstr ""
 
-#: builtin/fetch.c:259
+#: builtin/fetch.c:260
 msgid "[up to date]"
 msgstr ""
 
-#: builtin/fetch.c:273
+#: builtin/fetch.c:274
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr ""
 
-#: builtin/fetch.c:274 builtin/fetch.c:360
+#: builtin/fetch.c:275 builtin/fetch.c:361
 msgid "[rejected]"
 msgstr ""
 
-#: builtin/fetch.c:285
+#: builtin/fetch.c:286
 msgid "[tag update]"
 msgstr ""
 
-#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340
+#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341
 msgid "  (unable to update local ref)"
 msgstr ""
 
-#: builtin/fetch.c:305
+#: builtin/fetch.c:306
 msgid "[new tag]"
 msgstr ""
 
-#: builtin/fetch.c:308
+#: builtin/fetch.c:309
 msgid "[new branch]"
 msgstr ""
 
-#: builtin/fetch.c:311
+#: builtin/fetch.c:312
 msgid "[new ref]"
 msgstr ""
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "unable to update local ref"
 msgstr ""
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "forced update"
 msgstr ""
 
-#: builtin/fetch.c:362
+#: builtin/fetch.c:363
 msgid "(non-fast-forward)"
 msgstr ""
 
-#: builtin/fetch.c:393 builtin/fetch.c:685
+#: builtin/fetch.c:394 builtin/fetch.c:686
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr ""
 
-#: builtin/fetch.c:402
+#: builtin/fetch.c:403
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr ""
 
-#: builtin/fetch.c:488
+#: builtin/fetch.c:489
 #, c-format
 msgid "From %.*s\n"
 msgstr ""
 
-#: builtin/fetch.c:499
+#: builtin/fetch.c:500
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
 " 'git remote prune %s' to remove any old, conflicting branches"
 msgstr ""
 
-#: builtin/fetch.c:549
+#: builtin/fetch.c:550
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:550
+#: builtin/fetch.c:551
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr ""
 
-#: builtin/fetch.c:557
+#: builtin/fetch.c:558
 msgid "[deleted]"
 msgstr ""
 
-#: builtin/fetch.c:558 builtin/remote.c:1055
+#: builtin/fetch.c:559 builtin/remote.c:1055
 msgid "(none)"
 msgstr ""
 
-#: builtin/fetch.c:675
+#: builtin/fetch.c:676
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr ""
 
-#: builtin/fetch.c:709
+#: builtin/fetch.c:710
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr ""
 
-#: builtin/fetch.c:786
+#: builtin/fetch.c:787
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr ""
 
-#: builtin/fetch.c:789
+#: builtin/fetch.c:790
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr ""
 
-#: builtin/fetch.c:888
+#: builtin/fetch.c:892
 #, c-format
 msgid "Fetching %s\n"
 msgstr ""
 
-#: builtin/fetch.c:890 builtin/remote.c:100
+#: builtin/fetch.c:894 builtin/remote.c:100
 #, c-format
 msgid "Could not fetch %s"
 msgstr ""
 
-#: builtin/fetch.c:907
+#: builtin/fetch.c:913
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr ""
 
-#: builtin/fetch.c:927
+#: builtin/fetch.c:933
 msgid "You need to specify a tag name."
 msgstr ""
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:985
 msgid "fetch --all does not take a repository argument"
 msgstr ""
 
-#: builtin/fetch.c:981
+#: builtin/fetch.c:987
 msgid "fetch --all does not make sense with refspecs"
 msgstr ""
 
-#: builtin/fetch.c:992
+#: builtin/fetch.c:998
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr ""
 
-#: builtin/fetch.c:1000
+#: builtin/fetch.c:1006
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr ""
 
+#: builtin/fmt-merge-msg.c:13
+msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786
+#: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192
+#: builtin/tag.c:448 parse-options.h:133 parse-options.h:235
+msgid "n"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:654
+msgid "populate log with at most <n> entries from shortlog"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:657
+msgid "alias for --log (deprecated)"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:660
+msgid "text"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:661
+msgid "use <text> as start of message"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:662
+msgid "file to read from"
+msgstr ""
+
+#: builtin/for-each-ref.c:979
+msgid "git for-each-ref [options] [<pattern>]"
+msgstr ""
+
+#: builtin/for-each-ref.c:994
+msgid "quote placeholders suitably for shells"
+msgstr ""
+
+#: builtin/for-each-ref.c:996
+msgid "quote placeholders suitably for perl"
+msgstr ""
+
+#: builtin/for-each-ref.c:998
+msgid "quote placeholders suitably for python"
+msgstr ""
+
+#: builtin/for-each-ref.c:1000
+msgid "quote placeholders suitably for tcl"
+msgstr ""
+
+#: builtin/for-each-ref.c:1003
+msgid "show only <n> matched refs"
+msgstr ""
+
+#: builtin/for-each-ref.c:1004
+msgid "format"
+msgstr ""
+
+#: builtin/for-each-ref.c:1004
+msgid "format to use for the output"
+msgstr ""
+
+#: builtin/for-each-ref.c:1005
+msgid "key"
+msgstr ""
+
+#: builtin/for-each-ref.c:1006
+msgid "field name to sort on"
+msgstr ""
+
+#: builtin/fsck.c:608
+msgid "git fsck [options] [<object>...]"
+msgstr ""
+
+#: builtin/fsck.c:614
+msgid "show unreachable objects"
+msgstr ""
+
+#: builtin/fsck.c:615
+msgid "show dangling objects"
+msgstr ""
+
+#: builtin/fsck.c:616
+msgid "report tags"
+msgstr ""
+
+#: builtin/fsck.c:617
+msgid "report root nodes"
+msgstr ""
+
+#: builtin/fsck.c:618
+msgid "make index objects head nodes"
+msgstr ""
+
+#: builtin/fsck.c:619
+msgid "make reflogs head nodes (default)"
+msgstr ""
+
+#: builtin/fsck.c:620
+msgid "also consider packs and alternate objects"
+msgstr ""
+
+#: builtin/fsck.c:621
+msgid "enable more strict checking"
+msgstr ""
+
+#: builtin/fsck.c:623
+msgid "write dangling objects in .git/lost-found"
+msgstr ""
+
+#: builtin/fsck.c:624 builtin/prune.c:134
+msgid "show progress"
+msgstr ""
+
+#: builtin/gc.c:22
+msgid "git gc [options]"
+msgstr ""
+
 #: builtin/gc.c:63
 #, c-format
 msgid "Invalid %s: '%s'"
@@ -2975,6 +4304,18 @@
 msgid "insanely long object directory %.*s"
 msgstr ""
 
+#: builtin/gc.c:179
+msgid "prune unreferenced objects"
+msgstr ""
+
+#: builtin/gc.c:181
+msgid "be more thorough (increased runtime)"
+msgstr ""
+
+#: builtin/gc.c:182
+msgid "enable auto-gc mode"
+msgstr ""
+
 #: builtin/gc.c:221
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
@@ -2992,65 +4333,287 @@
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr ""
 
+#: builtin/grep.c:22
+msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr ""
+
 #: builtin/grep.c:216
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr ""
 
-#: builtin/grep.c:402
+#: builtin/grep.c:454
 #, c-format
 msgid "Failed to chdir: %s"
 msgstr ""
 
-#: builtin/grep.c:478 builtin/grep.c:512
+#: builtin/grep.c:530 builtin/grep.c:564
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr ""
 
-#: builtin/grep.c:526
+#: builtin/grep.c:578
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr ""
 
-#: builtin/grep.c:584
+#: builtin/grep.c:636
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr ""
 
-#: builtin/grep.c:601
+#: builtin/grep.c:653
 #, c-format
 msgid "cannot open '%s'"
 msgstr ""
 
-#: builtin/grep.c:885
+#: builtin/grep.c:728
+msgid "search in index instead of in the work tree"
+msgstr ""
+
+#: builtin/grep.c:730
+msgid "find in contents not managed by git"
+msgstr ""
+
+#: builtin/grep.c:732
+msgid "search in both tracked and untracked files"
+msgstr ""
+
+#: builtin/grep.c:734
+msgid "search also in ignored files"
+msgstr ""
+
+#: builtin/grep.c:737
+msgid "show non-matching lines"
+msgstr ""
+
+#: builtin/grep.c:739
+msgid "case insensitive matching"
+msgstr ""
+
+#: builtin/grep.c:741
+msgid "match patterns only at word boundaries"
+msgstr ""
+
+#: builtin/grep.c:743
+msgid "process binary files as text"
+msgstr ""
+
+#: builtin/grep.c:745
+msgid "don't match patterns in binary files"
+msgstr ""
+
+#: builtin/grep.c:748
+msgid "descend at most <depth> levels"
+msgstr ""
+
+#: builtin/grep.c:752
+msgid "use extended POSIX regular expressions"
+msgstr ""
+
+#: builtin/grep.c:755
+msgid "use basic POSIX regular expressions (default)"
+msgstr ""
+
+#: builtin/grep.c:758
+msgid "interpret patterns as fixed strings"
+msgstr ""
+
+#: builtin/grep.c:761
+msgid "use Perl-compatible regular expressions"
+msgstr ""
+
+#: builtin/grep.c:764
+msgid "show line numbers"
+msgstr ""
+
+#: builtin/grep.c:765
+msgid "don't show filenames"
+msgstr ""
+
+#: builtin/grep.c:766
+msgid "show filenames"
+msgstr ""
+
+#: builtin/grep.c:768
+msgid "show filenames relative to top directory"
+msgstr ""
+
+#: builtin/grep.c:770
+msgid "show only filenames instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:772
+msgid "synonym for --files-with-matches"
+msgstr ""
+
+#: builtin/grep.c:775
+msgid "show only the names of files without match"
+msgstr ""
+
+#: builtin/grep.c:777
+msgid "print NUL after filenames"
+msgstr ""
+
+#: builtin/grep.c:779
+msgid "show the number of matches instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:780
+msgid "highlight matches"
+msgstr ""
+
+#: builtin/grep.c:782
+msgid "print empty line between matches from different files"
+msgstr ""
+
+#: builtin/grep.c:784
+msgid "show filename only once above matches from same file"
+msgstr ""
+
+#: builtin/grep.c:787
+msgid "show <n> context lines before and after matches"
+msgstr ""
+
+#: builtin/grep.c:790
+msgid "show <n> context lines before matches"
+msgstr ""
+
+#: builtin/grep.c:792
+msgid "show <n> context lines after matches"
+msgstr ""
+
+#: builtin/grep.c:793
+msgid "shortcut for -C NUM"
+msgstr ""
+
+#: builtin/grep.c:796
+msgid "show a line with the function name before matches"
+msgstr ""
+
+#: builtin/grep.c:798
+msgid "show the surrounding function"
+msgstr ""
+
+#: builtin/grep.c:801
+msgid "read patterns from file"
+msgstr ""
+
+#: builtin/grep.c:803
+msgid "match <pattern>"
+msgstr ""
+
+#: builtin/grep.c:805
+msgid "combine patterns specified with -e"
+msgstr ""
+
+#: builtin/grep.c:817
+msgid "indicate hit with exit status without output"
+msgstr ""
+
+#: builtin/grep.c:819
+msgid "show only matches from files that match all patterns"
+msgstr ""
+
+#: builtin/grep.c:822
+msgid "pager"
+msgstr ""
+
+#: builtin/grep.c:822
+msgid "show matching files in the pager"
+msgstr ""
+
+#: builtin/grep.c:825
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr ""
+
+#: builtin/grep.c:826 builtin/show-ref.c:201
+msgid "show usage"
+msgstr ""
+
+#: builtin/grep.c:917
 msgid "no pattern given."
 msgstr ""
 
-#: builtin/grep.c:899
+#: builtin/grep.c:931
 #, c-format
 msgid "bad object %s"
 msgstr ""
 
-#: builtin/grep.c:940
+#: builtin/grep.c:972
 msgid "--open-files-in-pager only works on the worktree"
 msgstr ""
 
-#: builtin/grep.c:963
+#: builtin/grep.c:995
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr ""
 
-#: builtin/grep.c:968
+#: builtin/grep.c:1000
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr ""
 
-#: builtin/grep.c:971
+#: builtin/grep.c:1003
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr ""
 
-#: builtin/grep.c:979
+#: builtin/grep.c:1011
 msgid "both --cached and trees are given."
 msgstr ""
 
+#: builtin/hash-object.c:60
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
+"<file>..."
+msgstr ""
+
+#: builtin/hash-object.c:61
+msgid "git hash-object  --stdin-paths < <list-of-paths>"
+msgstr ""
+
+#: builtin/hash-object.c:72
+msgid "type"
+msgstr ""
+
+#: builtin/hash-object.c:72
+msgid "object type"
+msgstr ""
+
+#: builtin/hash-object.c:73
+msgid "write the object into the object database"
+msgstr ""
+
+#: builtin/hash-object.c:74
+msgid "read the object from stdin"
+msgstr ""
+
+#: builtin/hash-object.c:76
+msgid "store file as is without filters"
+msgstr ""
+
+#: builtin/hash-object.c:77
+msgid "process file as it were from this path"
+msgstr ""
+
+#: builtin/help.c:43
+msgid "print all available commands"
+msgstr ""
+
+#: builtin/help.c:44
+msgid "show man page"
+msgstr ""
+
+#: builtin/help.c:45
+msgid "show manual in web browser"
+msgstr ""
+
+#: builtin/help.c:47
+msgid "show info page"
+msgstr ""
+
+#: builtin/help.c:53
+msgid "git help [--all] [--man|--web|--info] [command]"
+msgstr ""
+
 #: builtin/help.c:65
 #, c-format
 msgid "unrecognized help format '%s'"
@@ -3161,6 +4724,11 @@
 msgid "pack signature mismatch"
 msgstr ""
 
+#: builtin/index-pack.c:294
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr ""
+
 #: builtin/index-pack.c:312
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
@@ -3267,93 +4835,123 @@
 msgid "Resolving deltas"
 msgstr ""
 
-#: builtin/index-pack.c:1105
+#: builtin/index-pack.c:1064
+#, c-format
+msgid "unable to create thread: %s"
+msgstr ""
+
+#: builtin/index-pack.c:1106
 msgid "confusion beyond insanity"
 msgstr ""
 
-#: builtin/index-pack.c:1124
+#: builtin/index-pack.c:1112
+#, c-format
+msgid "completed with %d local objects"
+msgstr ""
+
+#: builtin/index-pack.c:1121
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr ""
+
+#: builtin/index-pack.c:1125
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1149
+#: builtin/index-pack.c:1150
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr ""
 
-#: builtin/index-pack.c:1228
+#: builtin/index-pack.c:1229
 #, c-format
 msgid "local object %s is corrupt"
 msgstr ""
 
-#: builtin/index-pack.c:1252
+#: builtin/index-pack.c:1253
 msgid "error while closing pack file"
 msgstr ""
 
-#: builtin/index-pack.c:1265
+#: builtin/index-pack.c:1266
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1273
+#: builtin/index-pack.c:1274
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1286
+#: builtin/index-pack.c:1287
 msgid "cannot store pack file"
 msgstr ""
 
-#: builtin/index-pack.c:1297
+#: builtin/index-pack.c:1298
 msgid "cannot store index file"
 msgstr ""
 
-#: builtin/index-pack.c:1398
+#: builtin/index-pack.c:1331
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr ""
+
+#: builtin/index-pack.c:1337
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr ""
+
+#: builtin/index-pack.c:1341 builtin/index-pack.c:1514
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr ""
+
+#: builtin/index-pack.c:1399
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1400
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr ""
 
-#: builtin/index-pack.c:1447
+#: builtin/index-pack.c:1448
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1454
+#: builtin/index-pack.c:1455
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] ""
 msgstr[1] ""
 
-#: builtin/index-pack.c:1481
+#: builtin/index-pack.c:1482
 msgid "Cannot come back to cwd"
 msgstr ""
 
-#: builtin/index-pack.c:1525 builtin/index-pack.c:1528
-#: builtin/index-pack.c:1540 builtin/index-pack.c:1544
+#: builtin/index-pack.c:1526 builtin/index-pack.c:1529
+#: builtin/index-pack.c:1541 builtin/index-pack.c:1545
 #, c-format
 msgid "bad %s"
 msgstr ""
 
-#: builtin/index-pack.c:1558
+#: builtin/index-pack.c:1559
 msgid "--fix-thin cannot be used without --stdin"
 msgstr ""
 
-#: builtin/index-pack.c:1562 builtin/index-pack.c:1572
+#: builtin/index-pack.c:1563 builtin/index-pack.c:1573
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr ""
 
-#: builtin/index-pack.c:1581
+#: builtin/index-pack.c:1582
 msgid "--verify with no packfile name given"
 msgstr ""
 
@@ -3473,6 +5071,24 @@
 msgid "cannot tell cwd"
 msgstr ""
 
+#: builtin/init-db.c:467
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
+"[=<permissions>]] [directory]"
+msgstr ""
+
+#: builtin/init-db.c:490
+msgid "permissions"
+msgstr ""
+
+#: builtin/init-db.c:491
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr ""
+
+#: builtin/init-db.c:493 builtin/prune-packed.c:77
+msgid "be quiet"
+msgstr ""
+
 #: builtin/init-db.c:522 builtin/init-db.c:529
 #, c-format
 msgid "cannot mkdir %s"
@@ -3499,6 +5115,26 @@
 msgid "Cannot access work tree '%s'"
 msgstr ""
 
+#: builtin/log.c:37
+msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n"
+msgstr ""
+
+#: builtin/log.c:38
+msgid "   or: git show [options] <object>..."
+msgstr ""
+
+#: builtin/log.c:100
+msgid "suppress diff output"
+msgstr ""
+
+#: builtin/log.c:101
+msgid "show source"
+msgstr ""
+
+#: builtin/log.c:102
+msgid "decorate options"
+msgstr ""
+
 #: builtin/log.c:189
 #, c-format
 msgid "Final output: %d %s\n"
@@ -3535,68 +5171,332 @@
 msgid "Not a range."
 msgstr ""
 
-#: builtin/log.c:792
+#: builtin/log.c:789
 msgid "Cover letter needs email format"
 msgstr ""
 
-#: builtin/log.c:865
+#: builtin/log.c:862
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr ""
 
-#: builtin/log.c:938
+#: builtin/log.c:890
+msgid "git format-patch [options] [<since> | <revision range>]"
+msgstr ""
+
+#: builtin/log.c:935
 msgid "Two output directories?"
 msgstr ""
 
-#: builtin/log.c:1160
+#: builtin/log.c:1063
+msgid "use [PATCH n/m] even with a single patch"
+msgstr ""
+
+#: builtin/log.c:1066
+msgid "use [PATCH] even with multiple patches"
+msgstr ""
+
+#: builtin/log.c:1070
+msgid "print patches to standard out"
+msgstr ""
+
+#: builtin/log.c:1072
+msgid "generate a cover letter"
+msgstr ""
+
+#: builtin/log.c:1074
+msgid "use simple number sequence for output file names"
+msgstr ""
+
+#: builtin/log.c:1075
+msgid "sfx"
+msgstr ""
+
+#: builtin/log.c:1076
+msgid "use <sfx> instead of '.patch'"
+msgstr ""
+
+#: builtin/log.c:1078
+msgid "start numbering patches at <n> instead of 1"
+msgstr ""
+
+#: builtin/log.c:1080
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1083
+msgid "store resulting files in <dir>"
+msgstr ""
+
+#: builtin/log.c:1086
+msgid "don't strip/add [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1089
+msgid "don't output binary diffs"
+msgstr ""
+
+#: builtin/log.c:1091
+msgid "don't include a patch matching a commit upstream"
+msgstr ""
+
+#: builtin/log.c:1093
+msgid "show patch format instead of default (patch + stat)"
+msgstr ""
+
+#: builtin/log.c:1095
+msgid "Messaging"
+msgstr ""
+
+#: builtin/log.c:1096
+msgid "header"
+msgstr ""
+
+#: builtin/log.c:1097
+msgid "add email header"
+msgstr ""
+
+#: builtin/log.c:1098 builtin/log.c:1100
+msgid "email"
+msgstr ""
+
+#: builtin/log.c:1098
+msgid "add To: header"
+msgstr ""
+
+#: builtin/log.c:1100
+msgid "add Cc: header"
+msgstr ""
+
+#: builtin/log.c:1102
+msgid "message-id"
+msgstr ""
+
+#: builtin/log.c:1103
+msgid "make first mail a reply to <message-id>"
+msgstr ""
+
+#: builtin/log.c:1104 builtin/log.c:1107
+msgid "boundary"
+msgstr ""
+
+#: builtin/log.c:1105
+msgid "attach the patch"
+msgstr ""
+
+#: builtin/log.c:1108
+msgid "inline the patch"
+msgstr ""
+
+#: builtin/log.c:1112
+msgid "enable message threading, styles: shallow, deep"
+msgstr ""
+
+#: builtin/log.c:1114
+msgid "signature"
+msgstr ""
+
+#: builtin/log.c:1115
+msgid "add a signature"
+msgstr ""
+
+#: builtin/log.c:1117
+msgid "don't print the patch filenames"
+msgstr ""
+
+#: builtin/log.c:1157
 #, c-format
 msgid "bogus committer info %s"
 msgstr ""
 
-#: builtin/log.c:1205
+#: builtin/log.c:1202
 msgid "-n and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1207
+#: builtin/log.c:1204
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr ""
 
-#: builtin/log.c:1215
+#: builtin/log.c:1212
 msgid "--name-only does not make sense"
 msgstr ""
 
-#: builtin/log.c:1217
+#: builtin/log.c:1214
 msgid "--name-status does not make sense"
 msgstr ""
 
-#: builtin/log.c:1219
+#: builtin/log.c:1216
 msgid "--check does not make sense"
 msgstr ""
 
-#: builtin/log.c:1242
+#: builtin/log.c:1239
 msgid "standard output, or directory, which one?"
 msgstr ""
 
-#: builtin/log.c:1244
+#: builtin/log.c:1241
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr ""
 
-#: builtin/log.c:1397
+#: builtin/log.c:1394
 msgid "Failed to create output files"
 msgstr ""
 
-#: builtin/log.c:1501
+#: builtin/log.c:1443
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr ""
+
+#: builtin/log.c:1498
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr ""
 
-#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531
+#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525
 #, c-format
 msgid "Unknown commit %s"
 msgstr ""
 
+#: builtin/ls-files.c:408
+msgid "git ls-files [options] [<file>...]"
+msgstr ""
+
+#: builtin/ls-files.c:463
+msgid "identify the file status with tags"
+msgstr ""
+
+#: builtin/ls-files.c:465
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr ""
+
+#: builtin/ls-files.c:467
+msgid "show cached files in the output (default)"
+msgstr ""
+
+#: builtin/ls-files.c:469
+msgid "show deleted files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:471
+msgid "show modified files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:473
+msgid "show other files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:475
+msgid "show ignored files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:478
+msgid "show staged contents' object name in the output"
+msgstr ""
+
+#: builtin/ls-files.c:480
+msgid "show files on the filesystem that need to be removed"
+msgstr ""
+
+#: builtin/ls-files.c:482
+msgid "show 'other' directories' name only"
+msgstr ""
+
+#: builtin/ls-files.c:485
+msgid "don't show empty directories"
+msgstr ""
+
+#: builtin/ls-files.c:488
+msgid "show unmerged files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:490
+msgid "show resolve-undo information"
+msgstr ""
+
+#: builtin/ls-files.c:492
+msgid "skip files matching pattern"
+msgstr ""
+
+#: builtin/ls-files.c:495
+msgid "exclude patterns are read from <file>"
+msgstr ""
+
+#: builtin/ls-files.c:498
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr ""
+
+#: builtin/ls-files.c:500
+msgid "add the standard git exclusions"
+msgstr ""
+
+#: builtin/ls-files.c:503
+msgid "make the output relative to the project top directory"
+msgstr ""
+
+#: builtin/ls-files.c:506
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr ""
+
+#: builtin/ls-files.c:507
+msgid "tree-ish"
+msgstr ""
+
+#: builtin/ls-files.c:508
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr ""
+
+#: builtin/ls-files.c:510
+msgid "show debugging data"
+msgstr ""
+
+#: builtin/ls-tree.c:27
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr ""
+
+#: builtin/ls-tree.c:125
+msgid "only show trees"
+msgstr ""
+
+#: builtin/ls-tree.c:127
+msgid "recurse into subtrees"
+msgstr ""
+
+#: builtin/ls-tree.c:129
+msgid "show trees when recursing"
+msgstr ""
+
+#: builtin/ls-tree.c:132
+msgid "terminate entries with NUL byte"
+msgstr ""
+
+#: builtin/ls-tree.c:133
+msgid "include object size"
+msgstr ""
+
+#: builtin/ls-tree.c:135 builtin/ls-tree.c:137
+msgid "list only filenames"
+msgstr ""
+
+#: builtin/ls-tree.c:140
+msgid "use full path names"
+msgstr ""
+
+#: builtin/ls-tree.c:142
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr ""
+
+#: builtin/merge.c:43
+msgid "git merge [options] [<commit>...]"
+msgstr ""
+
+#: builtin/merge.c:44
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr ""
+
+#: builtin/merge.c:45
+msgid "git merge --abort"
+msgstr ""
+
 #: builtin/merge.c:90
 msgid "switch `m' requires a value"
 msgstr ""
@@ -3616,6 +5516,66 @@
 msgid "Available custom strategies are:"
 msgstr ""
 
+#: builtin/merge.c:183
+msgid "do not show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:186
+msgid "show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:187
+msgid "(synonym to --stat)"
+msgstr ""
+
+#: builtin/merge.c:189
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr ""
+
+#: builtin/merge.c:192
+msgid "create a single commit instead of doing a merge"
+msgstr ""
+
+#: builtin/merge.c:194
+msgid "perform a commit if the merge succeeds (default)"
+msgstr ""
+
+#: builtin/merge.c:196
+msgid "edit message before committing"
+msgstr ""
+
+#: builtin/merge.c:198
+msgid "allow fast-forward (default)"
+msgstr ""
+
+#: builtin/merge.c:200
+msgid "abort if fast-forward is not possible"
+msgstr ""
+
+#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112
+msgid "strategy"
+msgstr ""
+
+#: builtin/merge.c:203
+msgid "merge strategy to use"
+msgstr ""
+
+#: builtin/merge.c:204
+msgid "option=value"
+msgstr ""
+
+#: builtin/merge.c:205
+msgid "option for selected merge strategy"
+msgstr ""
+
+#: builtin/merge.c:207
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr ""
+
+#: builtin/merge.c:211
+msgid "abort the current in-progress merge"
+msgstr ""
+
 #: builtin/merge.c:240
 msgid "could not run stash."
 msgstr ""
@@ -3655,49 +5615,49 @@
 msgid "No merge message -- not updating HEAD\n"
 msgstr ""
 
-#: builtin/merge.c:437
+#: builtin/merge.c:436
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr ""
 
-#: builtin/merge.c:536
+#: builtin/merge.c:535
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr ""
 
-#: builtin/merge.c:629
+#: builtin/merge.c:628
 msgid "git write-tree failed to write a tree"
 msgstr ""
 
-#: builtin/merge.c:679
+#: builtin/merge.c:678
 msgid "failed to read the cache"
 msgstr ""
 
-#: builtin/merge.c:710
+#: builtin/merge.c:709
 msgid "Not handling anything other than two heads merge."
 msgstr ""
 
-#: builtin/merge.c:724
+#: builtin/merge.c:723
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr ""
 
-#: builtin/merge.c:738
+#: builtin/merge.c:737
 #, c-format
 msgid "unable to write %s"
 msgstr ""
 
-#: builtin/merge.c:877
+#: builtin/merge.c:876
 #, c-format
 msgid "Could not read from '%s'"
 msgstr ""
 
-#: builtin/merge.c:886
+#: builtin/merge.c:885
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:892
+#: builtin/merge.c:891
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
 "especially if it merges an updated upstream into a topic branch.\n"
@@ -3706,144 +5666,242 @@
 "the commit.\n"
 msgstr ""
 
-#: builtin/merge.c:916
+#: builtin/merge.c:915
 msgid "Empty commit message."
 msgstr ""
 
-#: builtin/merge.c:928
+#: builtin/merge.c:927
 #, c-format
 msgid "Wonderful.\n"
 msgstr ""
 
-#: builtin/merge.c:993
+#: builtin/merge.c:992
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 
-#: builtin/merge.c:1009
+#: builtin/merge.c:1008
 #, c-format
 msgid "'%s' is not a commit"
 msgstr ""
 
-#: builtin/merge.c:1050
+#: builtin/merge.c:1049
 msgid "No current branch."
 msgstr ""
 
-#: builtin/merge.c:1052
+#: builtin/merge.c:1051
 msgid "No remote for the current branch."
 msgstr ""
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1053
 msgid "No default upstream defined for the current branch."
 msgstr ""
 
-#: builtin/merge.c:1059
+#: builtin/merge.c:1058
 #, c-format
 msgid "No remote tracking branch for %s from %s"
 msgstr ""
 
-#: builtin/merge.c:1146 builtin/merge.c:1303
+#: builtin/merge.c:1145 builtin/merge.c:1302
 #, c-format
 msgid "%s - not something we can merge"
 msgstr ""
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1213
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr ""
 
-#: builtin/merge.c:1230 git-pull.sh:31
+#: builtin/merge.c:1229 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
 msgstr ""
 
-#: builtin/merge.c:1233 git-pull.sh:34
+#: builtin/merge.c:1232 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1237
+#: builtin/merge.c:1236
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
 msgstr ""
 
-#: builtin/merge.c:1240
+#: builtin/merge.c:1239
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr ""
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1248
 msgid "You cannot combine --squash with --no-ff."
 msgstr ""
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1253
 msgid "You cannot combine --no-ff with --ff-only."
 msgstr ""
 
-#: builtin/merge.c:1261
+#: builtin/merge.c:1260
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr ""
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1292
 msgid "Can merge only exactly one commit into empty head"
 msgstr ""
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1295
 msgid "Squash commit into empty head not supported yet"
 msgstr ""
 
-#: builtin/merge.c:1298
+#: builtin/merge.c:1297
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr ""
 
-#: builtin/merge.c:1413
+#: builtin/merge.c:1412
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr ""
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr ""
 
-#: builtin/merge.c:1458
+#: builtin/merge.c:1457
 #, c-format
 msgid "Nope.\n"
 msgstr ""
 
-#: builtin/merge.c:1490
+#: builtin/merge.c:1489
 msgid "Not possible to fast-forward, aborting."
 msgstr ""
 
-#: builtin/merge.c:1513 builtin/merge.c:1592
+#: builtin/merge.c:1512 builtin/merge.c:1591
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr ""
 
-#: builtin/merge.c:1517
+#: builtin/merge.c:1516
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr ""
 
-#: builtin/merge.c:1583
+#: builtin/merge.c:1582
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr ""
 
-#: builtin/merge.c:1585
+#: builtin/merge.c:1584
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr ""
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1593
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr ""
 
-#: builtin/merge.c:1606
+#: builtin/merge.c:1605
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 
+#: builtin/merge-base.c:26
+msgid "git merge-base [-a|--all] <commit> <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:27
+msgid "git merge-base [-a|--all] --octopus <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:28
+msgid "git merge-base --independent <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:29
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr ""
+
+#: builtin/merge-base.c:98
+msgid "output all common ancestors"
+msgstr ""
+
+#: builtin/merge-base.c:99
+msgid "find ancestors for a single n-way merge"
+msgstr ""
+
+#: builtin/merge-base.c:100
+msgid "list revs not reachable from others"
+msgstr ""
+
+#: builtin/merge-base.c:102
+msgid "is the first one ancestor of the other?"
+msgstr ""
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
+"file2"
+msgstr ""
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr ""
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr ""
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr ""
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr ""
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr ""
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr ""
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr ""
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig_file/file2"
+msgstr ""
+
+#: builtin/mktree.c:67
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr ""
+
+#: builtin/mktree.c:153
+msgid "input is NUL terminated"
+msgstr ""
+
+#: builtin/mktree.c:154 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr ""
+
+#: builtin/mktree.c:155
+msgid "allow creation of more than one tree"
+msgstr ""
+
+#: builtin/mv.c:14
+msgid "git mv [options] <source>... <destination>"
+msgstr ""
+
+#: builtin/mv.c:64
+msgid "force move/rename even if target exists"
+msgstr ""
+
+#: builtin/mv.c:65
+msgid "skip move/rename errors"
+msgstr ""
+
 #: builtin/mv.c:108
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
@@ -3906,6 +5964,147 @@
 msgid "renaming '%s' failed"
 msgstr ""
 
+#: builtin/name-rev.c:175
+msgid "git name-rev [options] <commit>..."
+msgstr ""
+
+#: builtin/name-rev.c:176
+msgid "git name-rev [options] --all"
+msgstr ""
+
+#: builtin/name-rev.c:177
+msgid "git name-rev [options] --stdin"
+msgstr ""
+
+#: builtin/name-rev.c:229
+msgid "print only names (no SHA-1)"
+msgstr ""
+
+#: builtin/name-rev.c:230
+msgid "only use tags to name the commits"
+msgstr ""
+
+#: builtin/name-rev.c:232
+msgid "only use refs matching <pattern>"
+msgstr ""
+
+#: builtin/name-rev.c:234
+msgid "list all commits reachable from all refs"
+msgstr ""
+
+#: builtin/name-rev.c:235
+msgid "read from stdin"
+msgstr ""
+
+#: builtin/name-rev.c:236
+msgid "allow to print `undefined` names"
+msgstr ""
+
+#: builtin/notes.c:23
+msgid "git notes [--ref <notes_ref>] [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:24
+msgid ""
+"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes_ref>] edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:28
+msgid "git notes [--ref <notes_ref>] show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:29
+msgid ""
+"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:30
+msgid "git notes merge --commit [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:31
+msgid "git notes merge --abort [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:32
+msgid "git notes [--ref <notes_ref>] remove [<object>...]"
+msgstr ""
+
+#: builtin/notes.c:33
+msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
+msgstr ""
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes_ref>] get-ref"
+msgstr ""
+
+#: builtin/notes.c:39
+msgid "git notes [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:44
+msgid "git notes add [<options>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:49
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:50
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr ""
+
+#: builtin/notes.c:55
+msgid "git notes append [<options>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:60
+msgid "git notes edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:65
+msgid "git notes show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:70
+msgid "git notes merge [<options>] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:71
+msgid "git notes merge --commit [<options>]"
+msgstr ""
+
+#: builtin/notes.c:72
+msgid "git notes merge --abort [<options>]"
+msgstr ""
+
+#: builtin/notes.c:77
+msgid "git notes remove [<object>]"
+msgstr ""
+
+#: builtin/notes.c:82
+msgid "git notes prune [<options>]"
+msgstr ""
+
+#: builtin/notes.c:87
+msgid "git notes get-ref"
+msgstr ""
+
 #: builtin/notes.c:139
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -4013,6 +6212,31 @@
 msgid "No note found for object %s."
 msgstr ""
 
+#: builtin/notes.c:535 builtin/notes.c:692
+msgid "note contents as a string"
+msgstr ""
+
+#: builtin/notes.c:538 builtin/notes.c:695
+msgid "note contents in a file"
+msgstr ""
+
+#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697
+#: builtin/notes.c:700 builtin/tag.c:476
+msgid "object"
+msgstr ""
+
+#: builtin/notes.c:541 builtin/notes.c:698
+msgid "reuse and edit specified note object"
+msgstr ""
+
+#: builtin/notes.c:544 builtin/notes.c:701
+msgid "reuse specified note object"
+msgstr ""
+
+#: builtin/notes.c:546 builtin/notes.c:614
+msgid "replace existing notes"
+msgstr ""
+
 #: builtin/notes.c:580
 #, c-format
 msgid ""
@@ -4025,6 +6249,14 @@
 msgid "Overwriting existing notes for object %s\n"
 msgstr ""
 
+#: builtin/notes.c:615
+msgid "read objects from stdin"
+msgstr ""
+
+#: builtin/notes.c:617
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr ""
+
 #: builtin/notes.c:635
 msgid "too few parameters"
 msgstr ""
@@ -4048,16 +6280,70 @@
 "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
 msgstr ""
 
+#: builtin/notes.c:864
+msgid "General options"
+msgstr ""
+
+#: builtin/notes.c:866
+msgid "Merge options"
+msgstr ""
+
+#: builtin/notes.c:868
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+
+#: builtin/notes.c:870
+msgid "Committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:872
+msgid "finalize notes merge by committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:874
+msgid "Aborting notes merge resolution"
+msgstr ""
+
+#: builtin/notes.c:876
+msgid "abort notes merge"
+msgstr ""
+
 #: builtin/notes.c:971
 #, c-format
 msgid "Object %s has no note\n"
 msgstr ""
 
+#: builtin/notes.c:983
+msgid "attempt to remove non-existent note is not an error"
+msgstr ""
+
+#: builtin/notes.c:986
+msgid "read object names from the standard input"
+msgstr ""
+
+#: builtin/notes.c:1067
+msgid "notes_ref"
+msgstr ""
+
+#: builtin/notes.c:1068
+msgid "use notes from <notes_ref>"
+msgstr ""
+
 #: builtin/notes.c:1103 builtin/remote.c:1598
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr ""
 
+#: builtin/pack-objects.c:23
+msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgstr ""
+
+#: builtin/pack-objects.c:24
+msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgstr ""
+
 #: builtin/pack-objects.c:183 builtin/pack-objects.c:186
 #, c-format
 msgid "deflate error (%d)"
@@ -4083,6 +6369,162 @@
 msgid "unable to parse value '%s' for option %s"
 msgstr ""
 
+#: builtin/pack-objects.c:2448
+msgid "do not show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2450
+msgid "show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2452
+msgid "show progress meter during object writing phase"
+msgstr ""
+
+#: builtin/pack-objects.c:2455
+msgid "similar to --all-progress when progress meter is shown"
+msgstr ""
+
+#: builtin/pack-objects.c:2456
+msgid "version[,offset]"
+msgstr ""
+
+#: builtin/pack-objects.c:2457
+msgid "write the pack index file in the specified idx format version"
+msgstr ""
+
+#: builtin/pack-objects.c:2460
+msgid "maximum size of each output pack file"
+msgstr ""
+
+#: builtin/pack-objects.c:2462
+msgid "ignore borrowed objects from alternate object store"
+msgstr ""
+
+#: builtin/pack-objects.c:2464
+msgid "ignore packed objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2466
+msgid "limit pack window by objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2468
+msgid "limit pack window by memory in addition to object limit"
+msgstr ""
+
+#: builtin/pack-objects.c:2470
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr ""
+
+#: builtin/pack-objects.c:2472
+msgid "reuse existing deltas"
+msgstr ""
+
+#: builtin/pack-objects.c:2474
+msgid "reuse existing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2476
+msgid "use OFS_DELTA objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2478
+msgid "use threads when searching for best delta matches"
+msgstr ""
+
+#: builtin/pack-objects.c:2480
+msgid "do not create an empty pack output"
+msgstr ""
+
+#: builtin/pack-objects.c:2482
+msgid "read revision arguments from standard input"
+msgstr ""
+
+#: builtin/pack-objects.c:2484
+msgid "limit the objects to those that are not yet packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2487
+msgid "include objects reachable from any reference"
+msgstr ""
+
+#: builtin/pack-objects.c:2490
+msgid "include objects referred by reflog entries"
+msgstr ""
+
+#: builtin/pack-objects.c:2493
+msgid "output pack to stdout"
+msgstr ""
+
+#: builtin/pack-objects.c:2495
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2497
+msgid "keep unreachable objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2498 parse-options.h:141
+msgid "time"
+msgstr ""
+
+#: builtin/pack-objects.c:2499
+msgid "unpack unreachable objects newer than <time>"
+msgstr ""
+
+#: builtin/pack-objects.c:2502
+msgid "create thin packs"
+msgstr ""
+
+#: builtin/pack-objects.c:2504
+msgid "ignore packs that have companion .keep file"
+msgstr ""
+
+#: builtin/pack-objects.c:2506
+msgid "pack compression level"
+msgstr ""
+
+#: builtin/pack-objects.c:2508
+msgid "do not hide commits by grafts"
+msgstr ""
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [options]"
+msgstr ""
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr ""
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr ""
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
+msgstr ""
+
+#: builtin/prune.c:12
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr ""
+
+#: builtin/prune.c:132
+msgid "do not remove, show only"
+msgstr ""
+
+#: builtin/prune.c:133
+msgid "report pruned objects"
+msgstr ""
+
+#: builtin/prune.c:136
+msgid "expire objects older than <time>"
+msgstr ""
+
+#: builtin/push.c:14
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr ""
+
 #: builtin/push.c:45
 msgid "tag shorthand without <tag>"
 msgstr ""
@@ -4144,12 +6586,30 @@
 "to update which remote branch."
 msgstr ""
 
-#: builtin/push.c:174
+#: builtin/push.c:151
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+
+#: builtin/push.c:199
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 
-#: builtin/push.c:181
+#: builtin/push.c:206
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n"
@@ -4157,15 +6617,15 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:187
+#: builtin/push.c:212
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration\n"
-"variable to 'current' or 'upstream' to push only the current branch."
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
 msgstr ""
 
-#: builtin/push.c:193
+#: builtin/push.c:218
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and merge the remote changes\n"
@@ -4173,22 +6633,22 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 
-#: builtin/push.c:233
+#: builtin/push.c:258
 #, c-format
 msgid "Pushing to %s\n"
 msgstr ""
 
-#: builtin/push.c:237
+#: builtin/push.c:262
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr ""
 
-#: builtin/push.c:269
+#: builtin/push.c:294
 #, c-format
 msgid "bad repository '%s'"
 msgstr ""
 
-#: builtin/push.c:270
+#: builtin/push.c:295
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -4201,34 +6661,232 @@
 "    git push <name>\n"
 msgstr ""
 
-#: builtin/push.c:285
+#: builtin/push.c:310
 msgid "--all and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:286
+#: builtin/push.c:311
 msgid "--all can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:291
+#: builtin/push.c:316
 msgid "--mirror and --tags are incompatible"
 msgstr ""
 
-#: builtin/push.c:292
+#: builtin/push.c:317
 msgid "--mirror can't be combined with refspecs"
 msgstr ""
 
-#: builtin/push.c:297
+#: builtin/push.c:322
 msgid "--all and --mirror are incompatible"
 msgstr ""
 
-#: builtin/push.c:385
-msgid "--delete is incompatible with --all, --mirror and --tags"
+#: builtin/push.c:382
+msgid "repository"
+msgstr ""
+
+#: builtin/push.c:383
+msgid "push all refs"
+msgstr ""
+
+#: builtin/push.c:384
+msgid "mirror all refs"
+msgstr ""
+
+#: builtin/push.c:386
+msgid "delete refs"
 msgstr ""
 
 #: builtin/push.c:387
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr ""
+
+#: builtin/push.c:390
+msgid "force updates"
+msgstr ""
+
+#: builtin/push.c:391
+msgid "check"
+msgstr ""
+
+#: builtin/push.c:392
+msgid "control recursive pushing of submodules"
+msgstr ""
+
+#: builtin/push.c:394
+msgid "use thin pack"
+msgstr ""
+
+#: builtin/push.c:395 builtin/push.c:396
+msgid "receive pack program"
+msgstr ""
+
+#: builtin/push.c:397
+msgid "set upstream for git pull/status"
+msgstr ""
+
+#: builtin/push.c:400
+msgid "prune locally removed refs"
+msgstr ""
+
+#: builtin/push.c:410
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr ""
+
+#: builtin/push.c:412
 msgid "--delete doesn't make sense without any refs"
 msgstr ""
 
+#: builtin/read-tree.c:36
+msgid ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+
+#: builtin/read-tree.c:108
+msgid "write resulting index to <file>"
+msgstr ""
+
+#: builtin/read-tree.c:111
+msgid "only empty the index"
+msgstr ""
+
+#: builtin/read-tree.c:113
+msgid "Merging"
+msgstr ""
+
+#: builtin/read-tree.c:115
+msgid "perform a merge in addition to a read"
+msgstr ""
+
+#: builtin/read-tree.c:117
+msgid "3-way merge if no file level merging required"
+msgstr ""
+
+#: builtin/read-tree.c:119
+msgid "3-way merge in presence of adds and removes"
+msgstr ""
+
+#: builtin/read-tree.c:121
+msgid "same as -m, but discard unmerged entries"
+msgstr ""
+
+#: builtin/read-tree.c:122
+msgid "<subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:123
+msgid "read the tree into the index under <subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:126
+msgid "update working tree with merge result"
+msgstr ""
+
+#: builtin/read-tree.c:128
+msgid "gitignore"
+msgstr ""
+
+#: builtin/read-tree.c:129
+msgid "allow explicitly ignored files to be overwritten"
+msgstr ""
+
+#: builtin/read-tree.c:132
+msgid "don't check the working tree after merging"
+msgstr ""
+
+#: builtin/read-tree.c:133
+msgid "don't update the index or the work tree"
+msgstr ""
+
+#: builtin/read-tree.c:135
+msgid "skip applying sparse checkout filter"
+msgstr ""
+
+#: builtin/read-tree.c:137
+msgid "debug unpack-trees"
+msgstr ""
+
+#: builtin/remote.c:11
+msgid "git remote [-v | --verbose]"
+msgstr ""
+
+#: builtin/remote.c:12
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:13 builtin/remote.c:32
+msgid "git remote rename <old> <new>"
+msgstr ""
+
+#: builtin/remote.c:14 builtin/remote.c:37
+msgid "git remote remove <name>"
+msgstr ""
+
+#: builtin/remote.c:15
+msgid "git remote set-head <name> (-a | -d | <branch>)"
+msgstr ""
+
+#: builtin/remote.c:16
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr ""
+
+#: builtin/remote.c:17
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr ""
+
+#: builtin/remote.c:18
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+
+#: builtin/remote.c:19
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:20 builtin/remote.c:68
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr ""
+
+#: builtin/remote.c:21 builtin/remote.c:69
+msgid "git remote set-url --add <name> <newurl>"
+msgstr ""
+
+#: builtin/remote.c:22 builtin/remote.c:70
+msgid "git remote set-url --delete <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:27
+msgid "git remote add [<options>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:42
+msgid "git remote set-head <name> (-a | -d | <branch>])"
+msgstr ""
+
+#: builtin/remote.c:47
+msgid "git remote set-branches <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:48
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:53
+msgid "git remote show [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:58
+msgid "git remote prune [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:63
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr ""
+
 #: builtin/remote.c:98
 #, c-format
 msgid "Updating %s"
@@ -4245,6 +6903,34 @@
 msgid "unknown mirror argument: %s"
 msgstr ""
 
+#: builtin/remote.c:163
+msgid "fetch the remote branches"
+msgstr ""
+
+#: builtin/remote.c:165
+msgid "import all tags and associated objects when fetching"
+msgstr ""
+
+#: builtin/remote.c:168
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr ""
+
+#: builtin/remote.c:170
+msgid "branch(es) to track"
+msgstr ""
+
+#: builtin/remote.c:171
+msgid "master branch"
+msgstr ""
+
+#: builtin/remote.c:172
+msgid "push|fetch"
+msgstr ""
+
+#: builtin/remote.c:173
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr ""
+
 #: builtin/remote.c:185
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr ""
@@ -4434,6 +7120,10 @@
 msgid "    %-*s pushes to %s"
 msgstr ""
 
+#: builtin/remote.c:1091
+msgid "do not query remotes"
+msgstr ""
+
 #: builtin/remote.c:1118
 #, c-format
 msgid "* remote %s"
@@ -4492,6 +7182,14 @@
 msgstr[0] ""
 msgstr[1] ""
 
+#: builtin/remote.c:1199
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr ""
+
+#: builtin/remote.c:1201
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr ""
+
 #: builtin/remote.c:1216
 msgid "Cannot determine remote HEAD"
 msgstr ""
@@ -4545,15 +7243,35 @@
 msgid " * [pruned] %s"
 msgstr ""
 
+#: builtin/remote.c:1321
+msgid "prune remotes after fetching"
+msgstr ""
+
 #: builtin/remote.c:1387 builtin/remote.c:1461
 #, c-format
 msgid "No such remote '%s'"
 msgstr ""
 
+#: builtin/remote.c:1407
+msgid "add branch"
+msgstr ""
+
 #: builtin/remote.c:1414
 msgid "no remote specified"
 msgstr ""
 
+#: builtin/remote.c:1436
+msgid "manipulate push URLs"
+msgstr ""
+
+#: builtin/remote.c:1438
+msgid "add URL"
+msgstr ""
+
+#: builtin/remote.c:1440
+msgid "delete URLs"
+msgstr ""
+
 #: builtin/remote.c:1447
 msgid "--add --delete doesn't make sense"
 msgstr ""
@@ -4572,6 +7290,55 @@
 msgid "Will not delete all non-push URLs"
 msgstr ""
 
+#: builtin/remote.c:1569
+msgid "be verbose; must be placed before a subcommand"
+msgstr ""
+
+#: builtin/replace.c:17
+msgid "git replace [-f] <object> <replacement>"
+msgstr ""
+
+#: builtin/replace.c:18
+msgid "git replace -d <object>..."
+msgstr ""
+
+#: builtin/replace.c:19
+msgid "git replace -l [<pattern>]"
+msgstr ""
+
+#: builtin/replace.c:118
+msgid "list replace refs"
+msgstr ""
+
+#: builtin/replace.c:119
+msgid "delete replace refs"
+msgstr ""
+
+#: builtin/replace.c:120
+msgid "replace the ref if it exists"
+msgstr ""
+
+#: builtin/rerere.c:11
+msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
+msgstr ""
+
+#: builtin/rerere.c:56
+msgid "register clean resolutions in index"
+msgstr ""
+
+#: builtin/reset.c:25
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+
+#: builtin/reset.c:26
+msgid "git reset [-q] <commit> [--] <paths>..."
+msgstr ""
+
+#: builtin/reset.c:27
+msgid "git reset --patch [<commit>] [--] [<paths>...]"
+msgstr ""
+
 #: builtin/reset.c:33
 msgid "mixed"
 msgstr ""
@@ -4627,6 +7394,26 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr ""
 
+#: builtin/reset.c:238
+msgid "be quiet, only report errors"
+msgstr ""
+
+#: builtin/reset.c:240
+msgid "reset HEAD and index"
+msgstr ""
+
+#: builtin/reset.c:241
+msgid "reset only HEAD"
+msgstr ""
+
+#: builtin/reset.c:243 builtin/reset.c:245
+msgid "reset HEAD, index and working tree"
+msgstr ""
+
+#: builtin/reset.c:247
+msgid "reset HEAD but keep local changes"
+msgstr ""
+
 #: builtin/reset.c:303
 #, c-format
 msgid "Could not parse object '%s'."
@@ -4655,23 +7442,120 @@
 msgid "Could not reset index file to revision '%s'."
 msgstr ""
 
+#: builtin/rev-parse.c:339
+msgid "git rev-parse --parseopt [options] -- [<args>...]"
+msgstr ""
+
+#: builtin/rev-parse.c:344
+msgid "keep the `--` passed as an arg"
+msgstr ""
+
+#: builtin/rev-parse.c:346
+msgid "stop parsing after the first non-option argument"
+msgstr ""
+
+#: builtin/rev-parse.c:464
+msgid ""
+"git rev-parse --parseopt [options] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [options] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+
+#: builtin/revert.c:22
+msgid "git revert [options] <commit-ish>"
+msgstr ""
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr ""
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [options] <commit-ish>"
+msgstr ""
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr ""
+
 #: builtin/revert.c:70 builtin/revert.c:92
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr ""
 
-#: builtin/revert.c:131
+#: builtin/revert.c:103
+msgid "end revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:104
+msgid "resume revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:105
+msgid "cancel revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:106
+msgid "don't automatically commit"
+msgstr ""
+
+#: builtin/revert.c:107
+msgid "edit the commit message"
+msgstr ""
+
+#: builtin/revert.c:110
+msgid "parent number"
+msgstr ""
+
+#: builtin/revert.c:112
+msgid "merge strategy"
+msgstr ""
+
+#: builtin/revert.c:113
+msgid "option"
+msgstr ""
+
+#: builtin/revert.c:114
+msgid "option for merge strategy"
+msgstr ""
+
+#: builtin/revert.c:125
+msgid "append commit name"
+msgstr ""
+
+#: builtin/revert.c:126
+msgid "allow fast-forward"
+msgstr ""
+
+#: builtin/revert.c:127
+msgid "preserve initially empty commits"
+msgstr ""
+
+#: builtin/revert.c:128
+msgid "allow commits with empty messages"
+msgstr ""
+
+#: builtin/revert.c:129
+msgid "keep redundant, empty commits"
+msgstr ""
+
+#: builtin/revert.c:133
 msgid "program error"
 msgstr ""
 
-#: builtin/revert.c:221
+#: builtin/revert.c:223
 msgid "revert failed"
 msgstr ""
 
-#: builtin/revert.c:236
+#: builtin/revert.c:238
 msgid "cherry-pick failed"
 msgstr ""
 
+#: builtin/rm.c:14
+msgid "git rm [options] [--] <file>..."
+msgstr ""
+
 #: builtin/rm.c:109
 #, c-format
 msgid ""
@@ -4693,6 +7577,26 @@
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
 
+#: builtin/rm.c:134
+msgid "do not list removed files"
+msgstr ""
+
+#: builtin/rm.c:135
+msgid "only remove from the index"
+msgstr ""
+
+#: builtin/rm.c:136
+msgid "override the up-to-date check"
+msgstr ""
+
+#: builtin/rm.c:137
+msgid "allow recursive removal"
+msgstr ""
+
+#: builtin/rm.c:139
+msgid "exit with a zero status even if nothing matched"
+msgstr ""
+
 #: builtin/rm.c:194
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -4703,11 +7607,192 @@
 msgid "git rm: unable to remove %s"
 msgstr ""
 
+#: builtin/shortlog.c:13
+msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"
+msgstr ""
+
 #: builtin/shortlog.c:157
 #, c-format
 msgid "Missing author: %s"
 msgstr ""
 
+#: builtin/shortlog.c:253
+msgid "sort output according to the number of commits per author"
+msgstr ""
+
+#: builtin/shortlog.c:255
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr ""
+
+#: builtin/shortlog.c:257
+msgid "Show the email address of each author"
+msgstr ""
+
+#: builtin/shortlog.c:258
+msgid "w[,i1[,i2]]"
+msgstr ""
+
+#: builtin/shortlog.c:259
+msgid "Linewrap output"
+msgstr ""
+
+#: builtin/show-branch.c:9
+msgid ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
+"<glob>)...]"
+msgstr ""
+
+#: builtin/show-branch.c:10
+msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr ""
+
+#: builtin/show-branch.c:651
+msgid "show remote-tracking and local branches"
+msgstr ""
+
+#: builtin/show-branch.c:653
+msgid "show remote-tracking branches"
+msgstr ""
+
+#: builtin/show-branch.c:655
+msgid "color '*!+-' corresponding to the branch"
+msgstr ""
+
+#: builtin/show-branch.c:657
+msgid "show <n> more commits after the common ancestor"
+msgstr ""
+
+#: builtin/show-branch.c:659
+msgid "synonym to more=-1"
+msgstr ""
+
+#: builtin/show-branch.c:660
+msgid "suppress naming strings"
+msgstr ""
+
+#: builtin/show-branch.c:662
+msgid "include the current branch"
+msgstr ""
+
+#: builtin/show-branch.c:664
+msgid "name commits with their object names"
+msgstr ""
+
+#: builtin/show-branch.c:666
+msgid "show possible merge bases"
+msgstr ""
+
+#: builtin/show-branch.c:668
+msgid "show refs unreachable from any other ref"
+msgstr ""
+
+#: builtin/show-branch.c:670
+msgid "show commits in topological order"
+msgstr ""
+
+#: builtin/show-branch.c:672
+msgid "show only commits not on the first branch"
+msgstr ""
+
+#: builtin/show-branch.c:674
+msgid "show merges reachable from only one tip"
+msgstr ""
+
+#: builtin/show-branch.c:676
+msgid "show commits where no parent comes before its children"
+msgstr ""
+
+#: builtin/show-branch.c:678
+msgid "<n>[,<base>]"
+msgstr ""
+
+#: builtin/show-branch.c:679
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr ""
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+msgstr ""
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=pattern] < ref-list"
+msgstr ""
+
+#: builtin/show-ref.c:182
+msgid "only show tags (can be combined with heads)"
+msgstr ""
+
+#: builtin/show-ref.c:183
+msgid "only show heads (can be combined with tags)"
+msgstr ""
+
+#: builtin/show-ref.c:184
+msgid "stricter reference checking, requires exact ref path"
+msgstr ""
+
+#: builtin/show-ref.c:187 builtin/show-ref.c:189
+msgid "show the HEAD reference"
+msgstr ""
+
+#: builtin/show-ref.c:191
+msgid "dereference tags into object IDs"
+msgstr ""
+
+#: builtin/show-ref.c:193
+msgid "only show SHA1 hash using <n> digits"
+msgstr ""
+
+#: builtin/show-ref.c:197
+msgid "do not print results to stdout (useful with --verify)"
+msgstr ""
+
+#: builtin/show-ref.c:199
+msgid "show refs from stdin that aren't in local repository"
+msgstr ""
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [options] name [ref]"
+msgstr ""
+
+#: builtin/symbolic-ref.c:38
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr ""
+
+#: builtin/symbolic-ref.c:39
+msgid "shorten ref output"
+msgstr ""
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason"
+msgstr ""
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason of the update"
+msgstr ""
+
+#: builtin/tag.c:22
+msgid ""
+"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"
+msgstr ""
+
+#: builtin/tag.c:23
+msgid "git tag -d <tagname>..."
+msgstr ""
+
+#: builtin/tag.c:24
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
+"\t\t[<pattern>...]"
+msgstr ""
+
+#: builtin/tag.c:26
+msgid "git tag -v <tagname>..."
+msgstr ""
+
 #: builtin/tag.c:60
 #, c-format
 msgid "malformed object at '%s'"
@@ -4786,6 +7871,62 @@
 msgid "malformed object name '%s'"
 msgstr ""
 
+#: builtin/tag.c:447
+msgid "list tag names"
+msgstr ""
+
+#: builtin/tag.c:449
+msgid "print <n> lines of each tag message"
+msgstr ""
+
+#: builtin/tag.c:451
+msgid "delete tags"
+msgstr ""
+
+#: builtin/tag.c:452
+msgid "verify tags"
+msgstr ""
+
+#: builtin/tag.c:454
+msgid "Tag creation options"
+msgstr ""
+
+#: builtin/tag.c:456
+msgid "annotated tag, needs a message"
+msgstr ""
+
+#: builtin/tag.c:458
+msgid "tag message"
+msgstr ""
+
+#: builtin/tag.c:460
+msgid "annotated and GPG-signed tag"
+msgstr ""
+
+#: builtin/tag.c:464
+msgid "use another key to sign the tag"
+msgstr ""
+
+#: builtin/tag.c:465
+msgid "replace the tag if exists"
+msgstr ""
+
+#: builtin/tag.c:466
+msgid "show tag list in columns"
+msgstr ""
+
+#: builtin/tag.c:468
+msgid "Tag listing options"
+msgstr ""
+
+#: builtin/tag.c:471
+msgid "print only tags that contain the commit"
+msgstr ""
+
+#: builtin/tag.c:477
+msgid "print only tags of the object"
+msgstr ""
+
 #: builtin/tag.c:506
 msgid "--column and -n are incompatible"
 msgstr ""
@@ -4835,26 +7976,182 @@
 msgid "Updated tag '%s' (was %s)\n"
 msgstr ""
 
+#: builtin/update-index.c:401
+msgid "git update-index [options] [--] [<file>...]"
+msgstr ""
+
+#: builtin/update-index.c:717
+msgid "continue refresh even when index needs update"
+msgstr ""
+
+#: builtin/update-index.c:720
+msgid "refresh: ignore submodules"
+msgstr ""
+
+#: builtin/update-index.c:723
+msgid "do not ignore new files"
+msgstr ""
+
+#: builtin/update-index.c:725
+msgid "let files replace directories and vice-versa"
+msgstr ""
+
+#: builtin/update-index.c:727
+msgid "notice files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:729
+msgid "refresh even if index contains unmerged entries"
+msgstr ""
+
+#: builtin/update-index.c:732
+msgid "refresh stat information"
+msgstr ""
+
+#: builtin/update-index.c:736
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr ""
+
+#: builtin/update-index.c:740
+msgid "<mode> <object> <path>"
+msgstr ""
+
+#: builtin/update-index.c:741
+msgid "add the specified entry to the index"
+msgstr ""
+
+#: builtin/update-index.c:745
+msgid "(+/-)x"
+msgstr ""
+
+#: builtin/update-index.c:746
+msgid "override the executable bit of the listed files"
+msgstr ""
+
+#: builtin/update-index.c:750
+msgid "mark files as \"not changing\""
+msgstr ""
+
+#: builtin/update-index.c:753
+msgid "clear assumed-unchanged bit"
+msgstr ""
+
+#: builtin/update-index.c:756
+msgid "mark files as \"index-only\""
+msgstr ""
+
+#: builtin/update-index.c:759
+msgid "clear skip-worktree bit"
+msgstr ""
+
+#: builtin/update-index.c:762
+msgid "add to index only; do not add content to object database"
+msgstr ""
+
+#: builtin/update-index.c:764
+msgid "remove named paths even if present in worktree"
+msgstr ""
+
+#: builtin/update-index.c:766
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr ""
+
+#: builtin/update-index.c:768
+msgid "read list of paths to be updated from standard input"
+msgstr ""
+
+#: builtin/update-index.c:772
+msgid "add entries from standard input to the index"
+msgstr ""
+
+#: builtin/update-index.c:776
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr ""
+
+#: builtin/update-index.c:780
+msgid "only update entries that differ from HEAD"
+msgstr ""
+
+#: builtin/update-index.c:784
+msgid "ignore files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:787
+msgid "report actions to standard output"
+msgstr ""
+
+#: builtin/update-index.c:789
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr ""
+
+#: builtin/update-index.c:793
+msgid "write index in this format"
+msgstr ""
+
+#: builtin/update-ref.c:7
+msgid "git update-ref [options] -d <refname> [<oldval>]"
+msgstr ""
+
+#: builtin/update-ref.c:8
+msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
+msgstr ""
+
+#: builtin/update-ref.c:19
+msgid "delete the reference"
+msgstr ""
+
+#: builtin/update-ref.c:21
+msgid "update <refname> not the one it points to"
+msgstr ""
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr ""
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr ""
+
+#: builtin/verify-pack.c:56
+msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
+msgstr ""
+
+#: builtin/verify-pack.c:66
+msgid "verbose"
+msgstr ""
+
+#: builtin/verify-pack.c:68
+msgid "show statistics only"
+msgstr ""
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v|--verbose] <tag>..."
+msgstr ""
+
+#: builtin/verify-tag.c:73
+msgid "print tag contents"
+msgstr ""
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr ""
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr ""
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr ""
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr ""
+
 #: git.c:16
 msgid "See 'git help <command>' for more information on a specific command."
 msgstr ""
 
-#: parse-options.h:133 parse-options.h:235
-msgid "n"
-msgstr ""
-
-#: parse-options.h:141
-msgid "time"
-msgstr ""
-
-#: parse-options.h:149
-msgid "file"
-msgstr ""
-
-#: parse-options.h:151
-msgid "when"
-msgstr ""
-
 #: parse-options.h:156
 msgid "no-op (backward compatibility)"
 msgstr ""
@@ -5090,6 +8387,13 @@
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr ""
 
+#: git-am.sh:858
+#, sh-format
+msgid ""
+"The copy of the patch that failed is found in:\n"
+"   $dotest/patch"
+msgstr ""
+
 #: git-am.sh:876
 msgid "applying to an empty history"
 msgstr ""
@@ -5484,25 +8788,25 @@
 msgid "Cannot unstage modified files"
 msgstr ""
 
-#: git-stash.sh:474
+#: git-stash.sh:475
 msgid "Index was not unstashed."
 msgstr ""
 
-#: git-stash.sh:491
-#, sh-format
-msgid "Dropped ${REV} ($s)"
-msgstr ""
-
 #: git-stash.sh:492
 #, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr ""
+
+#: git-stash.sh:493
+#, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr ""
 
-#: git-stash.sh:499
+#: git-stash.sh:500
 msgid "No branch name specified"
 msgstr ""
 
-#: git-stash.sh:570
+#: git-stash.sh:571
 msgid "(To restore them type \"git stash apply\")"
 msgstr ""
 
@@ -5511,32 +8815,32 @@
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr ""
 
-#: git-submodule.sh:145
+#: git-submodule.sh:167
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:189
+#: git-submodule.sh:211
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr ""
 
-#: git-submodule.sh:201
+#: git-submodule.sh:223
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr ""
 
-#: git-submodule.sh:290
+#: git-submodule.sh:312
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr ""
 
-#: git-submodule.sh:307
+#: git-submodule.sh:329
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr ""
 
-#: git-submodule.sh:311
+#: git-submodule.sh:333
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -5544,151 +8848,151 @@
 "Use -f if you really want to add it."
 msgstr ""
 
-#: git-submodule.sh:322
+#: git-submodule.sh:344
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr ""
 
-#: git-submodule.sh:324
+#: git-submodule.sh:346
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr ""
 
-#: git-submodule.sh:338
+#: git-submodule.sh:360
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:343
+#: git-submodule.sh:365
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:348
+#: git-submodule.sh:370
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:390
+#: git-submodule.sh:413
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:404
+#: git-submodule.sh:427
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
 msgstr ""
 
-#: git-submodule.sh:447
+#: git-submodule.sh:471
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
 msgstr ""
 
-#: git-submodule.sh:456
+#: git-submodule.sh:480
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:458
+#: git-submodule.sh:482
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:466
+#: git-submodule.sh:490
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:565
+#: git-submodule.sh:590
 #, sh-format
 msgid ""
 "Submodule path '$sm_path' not initialized\n"
 "Maybe you want to use 'update --init'?"
 msgstr ""
 
-#: git-submodule.sh:578
+#: git-submodule.sh:603
 #, sh-format
 msgid "Unable to find current revision in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:597
+#: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:611
+#: git-submodule.sh:636
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Submodule path '$sm_path': rebased into '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:617
+#: git-submodule.sh:642
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:618
+#: git-submodule.sh:643
 #, sh-format
 msgid "Submodule path '$sm_path': merged in '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:623
+#: git-submodule.sh:648
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:624
+#: git-submodule.sh:649
 #, sh-format
 msgid "Submodule path '$sm_path': checked out '$sha1'"
 msgstr ""
 
-#: git-submodule.sh:646 git-submodule.sh:969
+#: git-submodule.sh:671 git-submodule.sh:995
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr ""
 
-#: git-submodule.sh:754
+#: git-submodule.sh:779
 msgid "The --cached option cannot be used with the --files option"
 msgstr ""
 
 #. unexpected type
-#: git-submodule.sh:794
+#: git-submodule.sh:819
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr ""
 
-#: git-submodule.sh:812
+#: git-submodule.sh:837
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
 msgstr ""
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:818
+#: git-submodule.sh:843
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr ""
 
-#: git-submodule.sh:843
+#: git-submodule.sh:868
 msgid "blob"
 msgstr ""
 
-#: git-submodule.sh:881
+#: git-submodule.sh:906
 msgid "# Submodules changed but not updated:"
 msgstr ""
 
-#: git-submodule.sh:883
+#: git-submodule.sh:908
 msgid "# Submodule changes to be committed:"
 msgstr ""
 
-#: git-submodule.sh:1027
+#: git-submodule.sh:1054
 #, sh-format
 msgid "Synchronizing submodule url for '$name'"
 msgstr ""
diff --git a/po/sv.po b/po/sv.po
index b327a0e..5228239 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,8 +7,8 @@
 msgstr ""
 "Project-Id-Version: git 1.7.12\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2012-08-06 23:47+0800\n"
-"PO-Revision-Date: 2012-08-14 09:58+0100\n"
+"POT-Creation-Date: 2012-09-15 10:21+0800\n"
+"PO-Revision-Date: 2012-09-21 08:06+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -38,6 +38,94 @@
 "lämpligt för att ange lösning och checka in,\n"
 "eller använd \"git commit -a\"."
 
+#: archive.c:10
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr "git archive [flaggor] <träd-igt> [<sökväg>...]"
+
+#: archive.c:11
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:12
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <arkiv> [--exec <kmd>] [flaggor] <träd-igt> "
+"[<sökväg>...]"
+
+#: archive.c:13
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
+
+#: archive.c:322
+msgid "fmt"
+msgstr "fmt"
+
+#: archive.c:322
+msgid "archive format"
+msgstr "arkivformat"
+
+#: archive.c:323 builtin/log.c:1079
+msgid "prefix"
+msgstr "prefix"
+
+#: archive.c:324
+msgid "prepend prefix to each pathname in the archive"
+msgstr "lägg till prefix till varje sökväg i arkivet"
+
+# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e.
+#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332
+#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642
+#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77
+#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537
+#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149
+msgid "file"
+msgstr "fil"
+
+#: archive.c:326 builtin/archive.c:92
+msgid "write the archive to this file"
+msgstr "skriv arkivet till filen"
+
+#: archive.c:328
+msgid "read .gitattributes in working directory"
+msgstr "läs .gitattributes i arbetskatalogen"
+
+#: archive.c:329
+msgid "report archived files on stderr"
+msgstr "rapportera arkiverade filer på standard fel"
+
+#: archive.c:330
+msgid "store only"
+msgstr "endast spara"
+
+#: archive.c:331
+msgid "compress faster"
+msgstr "komprimera snabbare"
+
+#: archive.c:339
+msgid "compress better"
+msgstr "komprimera bättre"
+
+#: archive.c:342
+msgid "list supported archive formats"
+msgstr "visa understödda arkivformat"
+
+#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85
+msgid "repo"
+msgstr "arkiv"
+
+#: archive.c:345 builtin/archive.c:94
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "hämta arkivet från fjärrarkivet <arkiv>"
+
+#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616
+msgid "command"
+msgstr "kommando"
+
+#: archive.c:347 builtin/archive.c:96
+msgid "path to the remote git-upload-archive command"
+msgstr "sökväg till kommandot git-upload-archive på fjärren"
+
 #: bundle.c:36
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
@@ -48,7 +136,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "okänt huvud: %s%s (%d)"
 
-#: bundle.c:89 builtin/commit.c:699
+#: bundle.c:89 builtin/commit.c:714
 #, c-format
 msgid "could not open '%s'"
 msgstr "kunde inte öppna \"%s\""
@@ -57,8 +145,8 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
 
-#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290
-#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347
+#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290
+#: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347
 #: builtin/shortlog.c:181
 msgid "revision walk setup failed"
 msgstr "misslyckades skapa revisionstraversering"
@@ -85,7 +173,7 @@
 msgid "rev-list died"
 msgstr "rev-list dog"
 
-#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284
+#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "okänt argument: %s"
@@ -230,32 +318,32 @@
 "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
 "%s"
 
-#: diff.c:1400
+#: diff.c:1401
 msgid " 0 files changed"
 msgstr " 0 filer ändrade"
 
-#: diff.c:1404
+#: diff.c:1405
 #, c-format
 msgid " %d file changed"
 msgid_plural " %d files changed"
 msgstr[0] " %d fil ändrad"
 msgstr[1] " %d filer ändrade"
 
-#: diff.c:1421
+#: diff.c:1422
 #, c-format
 msgid ", %d insertion(+)"
 msgid_plural ", %d insertions(+)"
 msgstr[0] ", %d tillägg(+)"
 msgstr[1] ", %d tillägg(+)"
 
-#: diff.c:1432
+#: diff.c:1433
 #, c-format
 msgid ", %d deletion(-)"
 msgid_plural ", %d deletions(-)"
 msgstr[0] ", %d borttagning(-)"
 msgstr[1] ", %d borttagningar(-)"
 
-#: diff.c:3461
+#: diff.c:3460
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -360,74 +448,66 @@
 msgid "error building trees"
 msgstr "fel vid byggande av träd"
 
-#: merge-recursive.c:497
-msgid "diff setup failed"
-msgstr "misslyckades sätta upp för diff"
-
-#: merge-recursive.c:627
-msgid "merge-recursive: disk full?"
-msgstr "merge-recursive: disk full?"
-
-#: merge-recursive.c:690
+#: merge-recursive.c:672
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "misslyckades skapa sökvägen \"%s\"%s"
 
-#: merge-recursive.c:701
+#: merge-recursive.c:683
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Tar bort %s för att göra plats för underkatalog\n"
 
 #. something else exists
 #. .. but not some other error (who really cares what?)
-#: merge-recursive.c:715 merge-recursive.c:736
+#: merge-recursive.c:697 merge-recursive.c:718
 msgid ": perhaps a D/F conflict?"
 msgstr ": kanske en K/F-konflikt?"
 
-#: merge-recursive.c:726
+#: merge-recursive.c:708
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "vägrar förlora ospårad fil vid \"%s\""
 
-#: merge-recursive.c:766
+#: merge-recursive.c:748
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kan inte läsa objektet %s: \"%s\""
 
-#: merge-recursive.c:768
+#: merge-recursive.c:750
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "blob förväntades för %s \"%s\""
 
-#: merge-recursive.c:791 builtin/clone.c:302
+#: merge-recursive.c:773 builtin/clone.c:302
 #, c-format
 msgid "failed to open '%s'"
 msgstr "misslyckades öppna \"%s\""
 
-#: merge-recursive.c:799
+#: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "misslyckades ta skapa symboliska länken \"%s\""
 
-#: merge-recursive.c:802
+#: merge-recursive.c:784
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:922
 msgid "Failed to execute internal merge"
 msgstr "Misslyckades exekvera intern sammanslagning"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:926
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Kunde inte lägga till %s till databasen"
 
-#: merge-recursive.c:959
+#: merge-recursive.c:942
 msgid "unsupported object type in the tree"
 msgstr "objekttyp som ej stöds upptäcktes i trädet"
 
-#: merge-recursive.c:1038 merge-recursive.c:1052
+#: merge-recursive.c:1021 merge-recursive.c:1035
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -436,7 +516,7 @@
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet."
 
-#: merge-recursive.c:1044 merge-recursive.c:1057
+#: merge-recursive.c:1027 merge-recursive.c:1040
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -445,20 +525,20 @@
 "KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
 "i trädet vid %s."
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "rename"
 msgstr "namnbyte"
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "renamed"
 msgstr "namnbytt"
 
-#: merge-recursive.c:1154
+#: merge-recursive.c:1137
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s är en katalog i %s lägger till som %s istället"
 
-#: merge-recursive.c:1176
+#: merge-recursive.c:1159
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -467,144 +547,144 @@
 "KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
 "namnbyte \"%s\"->\"%s\" i \"%s\"%s"
 
-#: merge-recursive.c:1181
+#: merge-recursive.c:1164
 msgid " (left unresolved)"
 msgstr " (lämnad olöst)"
 
-#: merge-recursive.c:1235
+#: merge-recursive.c:1218
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s"
 
-#: merge-recursive.c:1265
+#: merge-recursive.c:1248
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Byter namn på %s till %s och %s till %s istället"
 
-#: merge-recursive.c:1464
+#: merge-recursive.c:1447
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "KONFLIKT (namnbyte/tillägg): Namnbyte %s->%s i %s. %s tillagd i %s"
 
-#: merge-recursive.c:1474
+#: merge-recursive.c:1457
 #, c-format
 msgid "Adding merged %s"
 msgstr "Lägger till sammanslagen %s"
 
-#: merge-recursive.c:1479 merge-recursive.c:1677
+#: merge-recursive.c:1462 merge-recursive.c:1660
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Lägger till som %s iställer"
 
-#: merge-recursive.c:1530
+#: merge-recursive.c:1513
 #, c-format
 msgid "cannot read object %s"
 msgstr "kan inte läsa objektet %s"
 
-#: merge-recursive.c:1533
+#: merge-recursive.c:1516
 #, c-format
 msgid "object %s is not a blob"
 msgstr "objektet %s är inte en blob"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modify"
 msgstr "ändra"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modified"
 msgstr "ändrad"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1574
 msgid "content"
 msgstr "innehåll"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1581
 msgid "add/add"
 msgstr "tillägg/tillägg"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1615
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1629
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Slår ihop %s automatiskt"
 
-#: merge-recursive.c:1650 git-submodule.sh:844
+#: merge-recursive.c:1633 git-submodule.sh:869
 msgid "submodule"
 msgstr "undermodul"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1634
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
 
-#: merge-recursive.c:1741
+#: merge-recursive.c:1724
 #, c-format
 msgid "Removing %s"
 msgstr "Tar bort %s"
 
-#: merge-recursive.c:1766
+#: merge-recursive.c:1749
 msgid "file/directory"
 msgstr "fil/katalog"
 
-#: merge-recursive.c:1772
+#: merge-recursive.c:1755
 msgid "directory/file"
 msgstr "katalog/fil"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1760
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr ""
 "KONFLIKT (%s): Det finns en katalog med namnet %s i %s. Lägger till %s som %s"
 
-#: merge-recursive.c:1787
+#: merge-recursive.c:1770
 #, c-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: merge-recursive.c:1804
+#: merge-recursive.c:1787
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
 
-#: merge-recursive.c:1823
+#: merge-recursive.c:1806
 msgid "Already up-to-date!"
 msgstr "Redan à jour!"
 
-#: merge-recursive.c:1832
+#: merge-recursive.c:1815
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "sammanslagning av träden %s och %s misslyckades"
 
-#: merge-recursive.c:1862
+#: merge-recursive.c:1845
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Obehandlad sökväg??? %s"
 
-#: merge-recursive.c:1907
+#: merge-recursive.c:1890
 msgid "Merging:"
 msgstr "Slår ihop:"
 
-#: merge-recursive.c:1920
+#: merge-recursive.c:1903
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "hittade %u gemensam förfader:"
 msgstr[1] "hittade %u gemensamma förfäder:"
 
-#: merge-recursive.c:1957
+#: merge-recursive.c:1940
 msgid "merge returned no commit"
 msgstr "sammanslagningen returnerade ingen incheckning"
 
-#: merge-recursive.c:2014
+#: merge-recursive.c:1997
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Kunde inte tolka objektet \"%s\""
 
-#: merge-recursive.c:2026 builtin/merge.c:697
+#: merge-recursive.c:2009 builtin/merge.c:696
 msgid "Unable to write index."
 msgstr "Kunde inte skriva indexet."
 
@@ -661,14 +741,14 @@
 "Din gren och \"%s\" har divergerat,\n"
 "och har %d respektive %d olika incheckningar.\n"
 
-#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978
-#: builtin/merge.c:1088 builtin/merge.c:1098
+#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977
+#: builtin/merge.c:1087 builtin/merge.c:1097
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Kunde inte öppna \"%s\" för skrivning"
 
-#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868
-#: builtin/merge.c:1090 builtin/merge.c:1103
+#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867
+#: builtin/merge.c:1089 builtin/merge.c:1102
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Kunde inte skriva till \"%s\""
@@ -691,7 +771,7 @@
 "med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n"
 "och checka in resultatet med \"git commit\""
 
-#: sequencer.c:160 sequencer.c:758 sequencer.c:841
+#: sequencer.c:160 sequencer.c:765 sequencer.c:848
 #, c-format
 msgid "Could not write to %s"
 msgstr "Kunde inte skriva till %s"
@@ -727,178 +807,178 @@
 msgid "Unable to update cache tree\n"
 msgstr "Kan inte uppdatera cacheträd\n"
 
-#: sequencer.c:324
+#: sequencer.c:327
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "Kunde inte tolka incheckningen %s\n"
 
-#: sequencer.c:329
+#: sequencer.c:332
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "Kunde inte tolka föräldraincheckningen %s\n"
 
-#: sequencer.c:395
+#: sequencer.c:398
 msgid "Your index file is unmerged."
 msgstr "Din indexfil har inte slagits ihop."
 
-#: sequencer.c:398
+#: sequencer.c:401
 msgid "You do not have a valid HEAD"
 msgstr "Du har ingen giltig HEAD"
 
-#: sequencer.c:413
+#: sequencer.c:416
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte."
 
-#: sequencer.c:421
+#: sequencer.c:424
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "Incheckning %s har inte förälder %d"
 
-#: sequencer.c:425
+#: sequencer.c:428
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:436
+#: sequencer.c:439
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s: kan inte tolka föräldraincheckningen %s"
 
-#: sequencer.c:440
+#: sequencer.c:443
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "Kan inte hämta incheckningsmeddelande för %s"
 
-#: sequencer.c:524
+#: sequencer.c:527
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "kunde inte ångra %s... %s"
 
-#: sequencer.c:525
+#: sequencer.c:528
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "kunde inte tillämpa %s... %s"
 
-#: sequencer.c:553
+#: sequencer.c:560
 msgid "empty commit set passed"
 msgstr "den angivna uppsättningen incheckningar är tom"
 
-#: sequencer.c:561
+#: sequencer.c:568
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: misslyckades läsa indexet"
 
-#: sequencer.c:566
+#: sequencer.c:573
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: misslyckades uppdatera indexet"
 
-#: sequencer.c:624
+#: sequencer.c:631
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "kan inte %s under en %s"
 
-#: sequencer.c:646
+#: sequencer.c:653
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Kan inte tolka rad %d."
 
-#: sequencer.c:651
+#: sequencer.c:658
 msgid "No commits parsed."
 msgstr "Inga incheckningar lästes."
 
-#: sequencer.c:664
+#: sequencer.c:671
 #, c-format
 msgid "Could not open %s"
 msgstr "Kunde inte öppna %s"
 
-#: sequencer.c:668
+#: sequencer.c:675
 #, c-format
 msgid "Could not read %s."
 msgstr "kunde inte läsa %s."
 
-#: sequencer.c:675
+#: sequencer.c:682
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "Oanvändbart manus: %s"
 
-#: sequencer.c:703
+#: sequencer.c:710
 #, c-format
 msgid "Invalid key: %s"
 msgstr "Felaktig nyckel: %s"
 
-#: sequencer.c:706
+#: sequencer.c:713
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "Felaktigt värde för %s: %s"
 
-#: sequencer.c:718
+#: sequencer.c:725
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "Trasigt manus: %s"
 
-#: sequencer.c:739
+#: sequencer.c:746
 msgid "a cherry-pick or revert is already in progress"
 msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
 
-#: sequencer.c:740
+#: sequencer.c:747
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:744
+#: sequencer.c:751
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
 
-#: sequencer.c:760 sequencer.c:845
+#: sequencer.c:767 sequencer.c:852
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Fel vid ombrytning av %s."
 
-#: sequencer.c:779 sequencer.c:913
+#: sequencer.c:786 sequencer.c:920
 msgid "no cherry-pick or revert in progress"
 msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
 
-#: sequencer.c:781
+#: sequencer.c:788
 msgid "cannot resolve HEAD"
 msgstr "kan inte bestämma HEAD"
 
-#: sequencer.c:783
+#: sequencer.c:790
 msgid "cannot abort from a branch yet to be born"
 msgstr "kan inte avbryta från en gren som ännu inte är född"
 
-#: sequencer.c:805 builtin/apply.c:3988
+#: sequencer.c:812 builtin/apply.c:4005
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "kan inte öppna %s: %s"
 
-#: sequencer.c:808
+#: sequencer.c:815
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "kan inte läsa %s: %s"
 
-#: sequencer.c:809
+#: sequencer.c:816
 msgid "unexpected end of file"
 msgstr "oväntat filslut"
 
-#: sequencer.c:815
+#: sequencer.c:822
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
 
-#: sequencer.c:838
+#: sequencer.c:845
 #, c-format
 msgid "Could not format %s."
 msgstr "Kunde inte formatera %s."
 
-#: sequencer.c:1000
+#: sequencer.c:1007
 msgid "Can't revert as initial commit"
 msgstr "Kan inte ångra som första incheckning"
 
-#: sequencer.c:1001
+#: sequencer.c:1008
 msgid "Can't cherry-pick into empty head"
 msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
 
@@ -921,12 +1001,17 @@
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "Uppströmsgrenen \"%s\" är inte lagrad som en fjärrspårande gren"
 
-#: wrapper.c:413
+#: wrapper.c:408
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr "kan inte komma åt \"%s\": %s"
+
+#: wrapper.c:426
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
 msgstr "kan inte slå upp aktuell användare i passwd-filen: %s"
 
-#: wrapper.c:414
+#: wrapper.c:427
 msgid "no such user"
 msgstr "okänd användare"
 
@@ -985,12 +1070,6 @@
 msgstr ""
 "  (checka in eller förkasta ospårat eller ändrat innehåll i undermoduler)"
 
-# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e.
-#: wt-status.c:224
-#, c-format
-msgid "%s files:"
-msgstr "%se filer:"
-
 #: wt-status.c:227
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
@@ -1194,12 +1273,12 @@
 msgstr "Första incheckning"
 
 #: wt-status.c:1011
-msgid "Untracked"
-msgstr "Ospårad"
+msgid "Untracked files"
+msgstr "Ospårade filer"
 
 #: wt-status.c:1013
-msgid "Ignored"
-msgstr "Ignorerad"
+msgid "Ignored files"
+msgstr "Ignorerade filer"
 
 # %s är nästa sträng eller tom.
 #: wt-status.c:1015
@@ -1215,61 +1294,81 @@
 msgid "No changes"
 msgstr "Inga ändringar"
 
-#: wt-status.c:1027
+#: wt-status.c:1028
 #, c-format
-msgid "no changes added to commit%s\n"
-msgstr "inga ändringar att checka in%s\n"
-
-#: wt-status.c:1029
-msgid " (use \"git add\" and/or \"git commit -a\")"
-msgstr " (använd \"git add\" och/eller \"git commit -a\")"
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
+"\")\n"
 
 #: wt-status.c:1031
 #, c-format
-msgid "nothing added to commit but untracked files present%s\n"
-msgstr "inget köat för incheckning, men ospårade filer finns%s\n"
+msgid "no changes added to commit\n"
+msgstr "inga ändringar att checka in\n"
 
-#: wt-status.c:1033
-msgid " (use \"git add\" to track)"
-msgstr " (spåra med \"git add\")"
-
-#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041
+#: wt-status.c:1034
 #, c-format
-msgid "nothing to commit%s\n"
-msgstr "inget att checka in%s\n"
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
+"\")\n"
 
-#: wt-status.c:1036
-msgid " (create/copy files and use \"git add\" to track)"
-msgstr " (skapa/kopiera filer och spåra med \"git add\")"
+#: wt-status.c:1037
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "inget köat för incheckning, men ospårade filer finns\n"
 
-#: wt-status.c:1039
-msgid " (use -u to show untracked files)"
-msgstr " (använd -u för att visa ospårade filer)"
+#: wt-status.c:1040
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "inget att checka in (skapa/kopiera filer och spåra med \"git add\")\n"
 
-#: wt-status.c:1042
-msgid " (working directory clean)"
-msgstr " (arbetskatalogen ren)"
+#: wt-status.c:1043 wt-status.c:1048
+#, c-format
+msgid "nothing to commit\n"
+msgstr "inget att checka in\n"
 
-#: wt-status.c:1150
+#: wt-status.c:1046
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr "inget att checka in (använd -u för att visa ospårade filer)\n"
+
+#: wt-status.c:1050
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr "inget att checka in, arbetskatalogen ren\n"
+
+#: wt-status.c:1158
 msgid "HEAD (no branch)"
 msgstr "HEAD (ingen gren)"
 
-#: wt-status.c:1156
+#: wt-status.c:1164
 msgid "Initial commit on "
 msgstr "Första incheckning på "
 
-#: wt-status.c:1171
+#: wt-status.c:1179
 msgid "behind "
 msgstr "efter "
 
-#: wt-status.c:1174 wt-status.c:1177
+#: wt-status.c:1182 wt-status.c:1185
 msgid "ahead "
 msgstr "före "
 
-#: wt-status.c:1179
+#: wt-status.c:1187
 msgid ", behind "
 msgstr ", efter "
 
+#: compat/precompose_utf8.c:58 builtin/clone.c:341
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "misslyckades ta bort länken \"%s\""
+
+#: builtin/add.c:19
+msgid "git add [options] [--] <filepattern>..."
+msgstr "git add [flaggor] [--] <filmönster>..."
+
 #: builtin/add.c:62
 #, c-format
 msgid "unexpected diff status %c"
@@ -1293,7 +1392,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "Ospårade ändringar efter att ha uppdaterat indexet:"
 
-#: builtin/add.c:195 builtin/add.c:459 builtin/rm.c:186
+#: builtin/add.c:195 builtin/add.c:460 builtin/rm.c:186
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
@@ -1330,47 +1429,99 @@
 msgid "Could not apply '%s'"
 msgstr "Kunde inte tillämpa \"%s\""
 
-#: builtin/add.c:312
+#: builtin/add.c:313
 msgid "The following paths are ignored by one of your .gitignore files:\n"
 msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
 
-#: builtin/add.c:352
+#: builtin/add.c:319 builtin/clean.c:52 builtin/fetch.c:78 builtin/mv.c:63
+#: builtin/prune-packed.c:76 builtin/push.c:388 builtin/remote.c:1253
+#: builtin/rm.c:133
+msgid "dry run"
+msgstr "testkörning"
+
+#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187
+#: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477
+#: builtin/mv.c:62 builtin/read-tree.c:112
+msgid "be verbose"
+msgstr "var pratsam"
+
+#: builtin/add.c:322
+msgid "interactive picking"
+msgstr "plocka interaktivt"
+
+#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248
+msgid "select hunks interactively"
+msgstr "välj stycken interaktivt"
+
+#: builtin/add.c:324
+msgid "edit current diff and apply"
+msgstr "redigera aktuell diff och applicera"
+
+#: builtin/add.c:325
+msgid "allow adding otherwise ignored files"
+msgstr "tillåt lägga till annars ignorerade filer"
+
+#: builtin/add.c:326
+msgid "update tracked files"
+msgstr "uppdatera spårade filer"
+
+#: builtin/add.c:327
+msgid "record only the fact that the path will be added later"
+msgstr "registrera endast att sökvägen kommer läggas till senare"
+
+#: builtin/add.c:328
+msgid "add changes from all tracked and untracked files"
+msgstr "lägg till ändringar från alla spårade och ospårade filer"
+
+#: builtin/add.c:329
+msgid "don't add, only refresh the index"
+msgstr "lägg inte till, uppdatera endast indexet"
+
+#: builtin/add.c:330
+msgid "just skip files which cannot be added because of errors"
+msgstr "hoppa bara över filer som inte kan läggas till på grund av fel"
+
+#: builtin/add.c:331
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "se om - även saknade - filer ignoreras i testkörning"
+
+#: builtin/add.c:353
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "Använd -f om du verkligen vill lägga till dem.\n"
 
-#: builtin/add.c:353
+#: builtin/add.c:354
 msgid "no files added"
 msgstr "inga filer har lagts till"
 
-#: builtin/add.c:359
+#: builtin/add.c:360
 msgid "adding files failed"
 msgstr "misslyckades lägga till filer"
 
-#: builtin/add.c:391
+#: builtin/add.c:392
 msgid "-A and -u are mutually incompatible"
 msgstr "-A och -u är ömsesidigt inkompatibla"
 
-#: builtin/add.c:393
+#: builtin/add.c:394
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
 
-#: builtin/add.c:413
+#: builtin/add.c:414
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Inget angivet, inget tillagt.\n"
 
-#: builtin/add.c:414
+#: builtin/add.c:415
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Kanske menade du att skriva \"git add .\"?\n"
 
-#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
+#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
 #: builtin/rm.c:162
 msgid "index file corrupt"
 msgstr "indexfilen trasig"
 
-#: builtin/add.c:480 builtin/apply.c:4433 builtin/mv.c:229 builtin/rm.c:260
+#: builtin/add.c:481 builtin/apply.c:4450 builtin/mv.c:229 builtin/rm.c:260
 msgid "Unable to write new index file"
 msgstr "Kunde inte skriva ny indexfil"
 
@@ -1388,52 +1539,52 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "okänt alternativ för ignore-whitespace: \"%s\""
 
-#: builtin/apply.c:824
+#: builtin/apply.c:823
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "Kan inte förbereda reguljärt uttryck för tidsstämpeln %s"
 
-#: builtin/apply.c:833
+#: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec returnerade %d för indata: %s"
 
-#: builtin/apply.c:914
+#: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "kan inte hitta filnamn i patchen på rad %d"
 
-#: builtin/apply.c:946
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr "git apply: dålig git-diff - förväntade /dev/null, fick %s på rad %d"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply: dålig git-diff - motsägande nytt filnamn på rad %d"
 
-#: builtin/apply.c:951
+#: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply: dålig git-diff - motsägande gammalt filnamn på rad %d"
 
-#: builtin/apply.c:958
+#: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: dålig git-diff - förväntade /dev/null på rad %d"
 
-#: builtin/apply.c:1403
+#: builtin/apply.c:1420
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount: förväntade rad: %.*s"
 
-#: builtin/apply.c:1460
+#: builtin/apply.c:1477
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "patch-fragment utan huvud på rad %d: %.*s"
 
-#: builtin/apply.c:1477
+#: builtin/apply.c:1494
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -1449,82 +1600,82 @@
 "sökvägskomponenter\n"
 "tas bort (rad %d)"
 
-#: builtin/apply.c:1637
+#: builtin/apply.c:1654
 msgid "new file depends on old contents"
 msgstr "ny fil beror på gammalt innehåll"
 
-#: builtin/apply.c:1639
+#: builtin/apply.c:1656
 msgid "deleted file still has contents"
 msgstr "borttagen fil har fortfarande innehåll"
 
-#: builtin/apply.c:1665
+#: builtin/apply.c:1682
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "trasig patch på rad %d"
 
-#: builtin/apply.c:1701
+#: builtin/apply.c:1718
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "nya filen %s beror på gammalt innehåll"
 
-#: builtin/apply.c:1703
+#: builtin/apply.c:1720
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "borttagna filen %s har fortfarande innehåll"
 
-#: builtin/apply.c:1706
+#: builtin/apply.c:1723
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** varning: filen %s blir tom men har inte tagits bort"
 
-#: builtin/apply.c:1852
+#: builtin/apply.c:1869
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "trasig binärpatch på rad %d: %.*s"
 
 #. there has to be one hunk (forward hunk)
-#: builtin/apply.c:1881
+#: builtin/apply.c:1898
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "binärpatchen på rad %d känns inte igen"
 
-#: builtin/apply.c:1967
+#: builtin/apply.c:1984
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "patch med bara skräp på rad %d"
 
-#: builtin/apply.c:2057
+#: builtin/apply.c:2074
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "kunde inte läsa symboliska länken %s"
 
-#: builtin/apply.c:2061
+#: builtin/apply.c:2078
 #, c-format
 msgid "unable to open or read %s"
 msgstr "kunde inte öppna eller läsa %s"
 
-#: builtin/apply.c:2132
+#: builtin/apply.c:2149
 msgid "oops"
 msgstr "hoppsan"
 
-#: builtin/apply.c:2654
+#: builtin/apply.c:2671
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "felaktig inledning på rad: \"%c\""
 
-#: builtin/apply.c:2772
+#: builtin/apply.c:2789
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "Stycke %d lyckades på %d (offset %d rad)."
 msgstr[1] "Stycke %d lyckades på %d (offset %d rader)."
 
-#: builtin/apply.c:2784
+#: builtin/apply.c:2801
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "Sammanhang reducerat till (%ld/%ld) för att tillämpa fragment vid %d"
 
-#: builtin/apply.c:2790
+#: builtin/apply.c:2807
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -1533,321 +1684,318 @@
 "vid sökning efter:\n"
 "%.*s"
 
-#: builtin/apply.c:2809
+#: builtin/apply.c:2826
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "saknar binära patchdata för \"%s\""
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2929
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "binärpatchen kan inte tillämpas på \"%s\""
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2935
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
 msgstr "binärpatchen på \"%s\" ger felaktigt resultat (förväntade %s, fick %s)"
 
-#: builtin/apply.c:2939
+#: builtin/apply.c:2956
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "patch misslyckades: %s:%ld"
 
-#: builtin/apply.c:3061
+#: builtin/apply.c:3078
 #, c-format
 msgid "cannot checkout %s"
 msgstr "kan inte checka ut %s"
 
-#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159
+#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176
 #, c-format
 msgid "read of %s failed"
 msgstr "misslyckades läsa %s"
 
-#: builtin/apply.c:3139 builtin/apply.c:3361
+#: builtin/apply.c:3156 builtin/apply.c:3378
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "sökvägen %s har ändrat namn/tagits bort"
 
-#: builtin/apply.c:3220 builtin/apply.c:3375
+#: builtin/apply.c:3237 builtin/apply.c:3392
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: finns inte i indexet"
 
-#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389
+#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3229 builtin/apply.c:3383
+#: builtin/apply.c:3246 builtin/apply.c:3400
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: motsvarar inte indexet"
 
-#: builtin/apply.c:3331
+#: builtin/apply.c:3348
 msgid "removal patch leaves file contents"
 msgstr "patch för borttagning lämnar kvar filinnehåll"
 
-#: builtin/apply.c:3400
+#: builtin/apply.c:3417
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: fel typ"
 
-#: builtin/apply.c:3402
+#: builtin/apply.c:3419
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s har typen %o, förväntade %o"
 
-#: builtin/apply.c:3503
+#: builtin/apply.c:3520
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: finns redan i indexet"
 
-#: builtin/apply.c:3506
+#: builtin/apply.c:3523
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: finns redan i arbetskatalogen"
 
-#: builtin/apply.c:3526
+#: builtin/apply.c:3543
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o)"
 
-#: builtin/apply.c:3531
+#: builtin/apply.c:3548
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "nytt läge (%o) för %s motsvarar inte gammalt läge (%o) för %s"
 
-#: builtin/apply.c:3539
+#: builtin/apply.c:3556
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: patchen kan inte tillämpas"
 
-#: builtin/apply.c:3552
+#: builtin/apply.c:3569
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Kontrollerar patchen %s..."
 
-#: builtin/apply.c:3607 builtin/checkout.c:213 builtin/reset.c:158
+#: builtin/apply.c:3624 builtin/checkout.c:215 builtin/reset.c:158
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3767
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "kan inte ta bort %s från indexet"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3795
 #, c-format
 msgid "corrupt patch for subproject %s"
 msgstr "trasig patch för underprojektet %s"
 
-#: builtin/apply.c:3782
+#: builtin/apply.c:3799
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "kan inte ta status på nyligen skapade filen \"%s\""
 
-#: builtin/apply.c:3787
+#: builtin/apply.c:3804
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "kan inte skapa säkerhetsminne för nyligen skapade filen %s"
 
-#: builtin/apply.c:3790 builtin/apply.c:3898
+#: builtin/apply.c:3807 builtin/apply.c:3915
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "kan inte lägga till cachepost för %s"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3840
 #, c-format
 msgid "closing file '%s'"
 msgstr "stänger filen \"%s\""
 
-#: builtin/apply.c:3872
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "kan inte skriva filen \"%s\" läge %o"
 
-#: builtin/apply.c:3959
+#: builtin/apply.c:3976
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Tillämpade patchen %s rent."
 
-#: builtin/apply.c:3967
+#: builtin/apply.c:3984
 msgid "internal error"
 msgstr "internt fel"
 
 #. Say this even without --verbose
-#: builtin/apply.c:3970
+#: builtin/apply.c:3987
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Tillämpade patchen %%s med %d refuserad..."
 msgstr[1] "Tillämpade patchen %%s med %d refuserade..."
 
-#: builtin/apply.c:3980
+#: builtin/apply.c:3997
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "trunkerar .rej-filnamnet till %.*s.rej"
 
-#: builtin/apply.c:4001
+#: builtin/apply.c:4018
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Stycke %d tillämpades rent."
 
-#: builtin/apply.c:4004
+#: builtin/apply.c:4021
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "Refuserar stycke %d."
 
-#: builtin/apply.c:4154
+#: builtin/apply.c:4171
 msgid "unrecognized input"
 msgstr "indata känns inte igen"
 
-#: builtin/apply.c:4165
+#: builtin/apply.c:4182
 msgid "unable to read index file"
 msgstr "kan inte läsa indexfilen"
 
-#: builtin/apply.c:4284 builtin/apply.c:4287
+#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91
+#: builtin/fetch.c:63
 msgid "path"
 msgstr "sökväg"
 
-#: builtin/apply.c:4285
+#: builtin/apply.c:4302
 msgid "don't apply changes matching the given path"
 msgstr "tillämpa inte ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4288
+#: builtin/apply.c:4305
 msgid "apply changes matching the given path"
 msgstr "tillämpa ändringar som motsvarar given sökväg"
 
-#: builtin/apply.c:4290
+#: builtin/apply.c:4307
 msgid "num"
 msgstr "antal"
 
-#: builtin/apply.c:4291
+#: builtin/apply.c:4308
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "ta bort <antal> inledande snedstreck från traditionella diff-sökvägar"
 
-#: builtin/apply.c:4294
+#: builtin/apply.c:4311
 msgid "ignore additions made by the patch"
 msgstr "ignorera tillägg gjorda av patchen"
 
-#: builtin/apply.c:4296
+#: builtin/apply.c:4313
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "istället för att tillämpa patchen, skriv ut diffstat för indata"
 
-#: builtin/apply.c:4300
-msgid "shows number of added and deleted lines in decimal notation"
-msgstr "visar antal tillagda och borttagna rader decimalt"
+#: builtin/apply.c:4317
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "visa antal tillagda och borttagna rader decimalt"
 
-#: builtin/apply.c:4302
+#: builtin/apply.c:4319
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "istället för att tillämpa patchen, skriv ut en summering av indata"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4321
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "istället för att tillämpa patchen, se om patchen kan tillämpas"
 
-#: builtin/apply.c:4306
+#: builtin/apply.c:4323
 msgid "make sure the patch is applicable to the current index"
 msgstr "se till att patchen kan tillämpas på aktuellt index"
 
-#: builtin/apply.c:4308
+#: builtin/apply.c:4325
 msgid "apply a patch without touching the working tree"
 msgstr "tillämpa en patch utan att röra arbetskatalogen"
 
-#: builtin/apply.c:4310
+#: builtin/apply.c:4327
 msgid "also apply the patch (use with --stat/--summary/--check)"
 msgstr "tillämpa också patchen (använd med --stat/--summary/--check)"
 
-#: builtin/apply.c:4312
+#: builtin/apply.c:4329
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
 
-#: builtin/apply.c:4314
+#: builtin/apply.c:4331
 msgid "build a temporary index based on embedded index information"
 msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
 
-#: builtin/apply.c:4316
+#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460
 msgid "paths are separated with NUL character"
 msgstr "sökvägar avdelas med NUL-tecken"
 
-#: builtin/apply.c:4319
+#: builtin/apply.c:4336
 msgid "ensure at least <n> lines of context match"
 msgstr "se till att åtminstone <n> rader sammanhang är lika"
 
-#: builtin/apply.c:4320
+#: builtin/apply.c:4337
 msgid "action"
 msgstr "åtgärd"
 
-#: builtin/apply.c:4321
+#: builtin/apply.c:4338
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "detektera nya eller ändrade rader som har fel i blanktecken"
 
-#: builtin/apply.c:4324 builtin/apply.c:4327
+#: builtin/apply.c:4341 builtin/apply.c:4344
 msgid "ignore changes in whitespace when finding context"
 msgstr "ignorera ändringar i blanktecken för sammanhang"
 
-#: builtin/apply.c:4330
+#: builtin/apply.c:4347
 msgid "apply the patch in reverse"
 msgstr "tillämpa patchen baklänges"
 
-#: builtin/apply.c:4332
+#: builtin/apply.c:4349
 msgid "don't expect at least one line of context"
 msgstr "förvänta inte minst en rad sammanhang"
 
-#: builtin/apply.c:4334
+#: builtin/apply.c:4351
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "lämna refuserade stycken i motsvarande *.rej-filer"
 
-#: builtin/apply.c:4336
+#: builtin/apply.c:4353
 msgid "allow overlapping hunks"
 msgstr "tillåt överlappande stycken"
 
-#: builtin/apply.c:4337
-msgid "be verbose"
-msgstr "var pratsam"
-
-#: builtin/apply.c:4339
+#: builtin/apply.c:4356
 msgid "tolerate incorrectly detected missing new-line at the end of file"
 msgstr "tolerera felaktigt detekterade saknade nyradstecken vid filslut"
 
-#: builtin/apply.c:4342
+#: builtin/apply.c:4359
 msgid "do not trust the line counts in the hunk headers"
 msgstr "lite inte på antalet linjer i styckehuvuden"
 
-#: builtin/apply.c:4344
+#: builtin/apply.c:4361
 msgid "root"
 msgstr "rot"
 
-#: builtin/apply.c:4345
+#: builtin/apply.c:4362
 msgid "prepend <root> to all filenames"
 msgstr "lägg till <rot> i alla filnamn"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4384
 msgid "--3way outside a repository"
 msgstr "--3way utanför arkiv"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4392
 msgid "--index outside a repository"
 msgstr "--index utanför arkiv"
 
-#: builtin/apply.c:4378
+#: builtin/apply.c:4395
 msgid "--cached outside a repository"
 msgstr "--cached utanför arkiv"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4411
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "kan inte öppna patchen \"%s\""
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4425
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "undertryckte %d fel i blanksteg"
 msgstr[1] "undertryckte %d fel i blanksteg"
 
-#: builtin/apply.c:4414 builtin/apply.c:4424
+#: builtin/apply.c:4431 builtin/apply.c:4441
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -1889,7 +2037,135 @@
 msgid "git archive: expected a flush"
 msgstr "git archive: förväntade en tömning (flush)"
 
-#: builtin/branch.c:144
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "utför 'git bisect next'"
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr "uppdatera BISECT_HEAD istället för att checka ut aktuell incheckning"
+
+#: builtin/blame.c:25
+msgid "git blame [options] [rev-opts] [rev] [--] file"
+msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil"
+
+#: builtin/blame.c:30 builtin/shortlog.c:15
+msgid "[rev-opts] are documented in git-rev-list(1)"
+msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)"
+
+#: builtin/blame.c:2316
+msgid "Show blame entries as we find them, incrementally"
+msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
+
+#: builtin/blame.c:2317
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
+
+#: builtin/blame.c:2318
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
+
+#: builtin/blame.c:2319
+msgid "Show work cost statistics"
+msgstr "Visa statistik över arbetskostnad"
+
+#: builtin/blame.c:2320
+msgid "Show output score for blame entries"
+msgstr "Visa utdatapoäng för klandringsposter"
+
+#: builtin/blame.c:2321
+msgid "Show original filename (Default: auto)"
+msgstr "Visa originalfilnamn (Standard: auto)"
+
+#: builtin/blame.c:2322
+msgid "Show original linenumber (Default: off)"
+msgstr "Visa ursprungligt radnummer (Standard: av)"
+
+#: builtin/blame.c:2323
+msgid "Show in a format designed for machine consumption"
+msgstr "Visa i ett format avsett för maskinkonsumtion"
+
+#: builtin/blame.c:2324
+msgid "Show porcelain format with per-line commit information"
+msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
+
+#: builtin/blame.c:2325
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
+
+#: builtin/blame.c:2326
+msgid "Show raw timestamp (Default: off)"
+msgstr "Visa rå tidsstämpel (Standard: av)"
+
+#: builtin/blame.c:2327
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
+
+#: builtin/blame.c:2328
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
+
+#: builtin/blame.c:2329
+msgid "Show author email instead of name (Default: off)"
+msgstr "Visa författarens e-post istället för namn (Standard: av)"
+
+#: builtin/blame.c:2330
+msgid "Ignore whitespace differences"
+msgstr "Ignorera ändringar i blanksteg"
+
+#: builtin/blame.c:2331
+msgid "Spend extra cycles to find better match"
+msgstr "Slösa extra cykler med att hitta bättre träff"
+
+#: builtin/blame.c:2332
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr "Använd revisioner från <fil> istället för att anropa git-rev-list"
+
+#: builtin/blame.c:2333
+msgid "Use <file>'s contents as the final image"
+msgstr "Använd <fil>s innehåll som slutgiltig bild"
+
+#: builtin/blame.c:2334 builtin/blame.c:2335
+msgid "score"
+msgstr "poäng"
+
+#: builtin/blame.c:2334
+msgid "Find line copies within and across files"
+msgstr "Hitta kopierade rader inuti och mellan filer"
+
+#: builtin/blame.c:2335
+msgid "Find line movements within and across files"
+msgstr "Hitta flyttade rader inuti och mellan filer"
+
+#: builtin/blame.c:2336
+msgid "n,m"
+msgstr "n,m"
+
+#: builtin/blame.c:2336
+msgid "Process only line range n,m, counting from 1"
+msgstr "Behandla endast radintervallet n,m, med början på 1"
+
+#: builtin/branch.c:23
+msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [flaggor] [-r | -a] [--merged | --no-merged]"
+
+#: builtin/branch.c:24
+msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
+msgstr "git branch [flaggor] [-l] [-f] <grennamn> [<startpunkt>]"
+
+#: builtin/branch.c:25
+msgid "git branch [options] [-r] (-d | -D) <branchname>..."
+msgstr "git branch [flaggor] [-r] (-d | -D) <grennamn>..."
+
+#: builtin/branch.c:26
+msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
+msgstr "git branch [flaggor] (-m | -M) [<gammal_gren>] <ny_gren>"
+
+#: builtin/branch.c:145
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -1898,7 +2174,7 @@
 "tar bort grenen \"%s\" som har slagits ihop med\n"
 "         \"%s\", men ännu inte slagits ihop med HEAD."
 
-#: builtin/branch.c:148
+#: builtin/branch.c:149
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -1907,35 +2183,35 @@
 "tar inte bort grenen \"%s\" som inte har slagits ihop med\n"
 "         \"%s\", trots att den har slagits ihop med HEAD."
 
-#: builtin/branch.c:180
+#: builtin/branch.c:181
 msgid "cannot use -a with -d"
 msgstr "kan inte ange -a med -d"
 
-#: builtin/branch.c:186
+#: builtin/branch.c:187
 msgid "Couldn't look up commit object for HEAD"
 msgstr "Kunde inte slå upp incheckningsobjekt för HEAD"
 
-#: builtin/branch.c:191
+#: builtin/branch.c:192
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "Kan inte ta bort grenen \"%s\" som du befinner dig på för närvarande."
 
-#: builtin/branch.c:202
+#: builtin/branch.c:203
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "fjärrgrenen \"%s\" hittades inte."
 
-#: builtin/branch.c:203
+#: builtin/branch.c:204
 #, c-format
 msgid "branch '%s' not found."
 msgstr "grenen \"%s\" hittades inte."
 
-#: builtin/branch.c:210
+#: builtin/branch.c:211
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "Kunde inte slå upp incheckningsobjekt för \"%s\""
 
-#: builtin/branch.c:216
+#: builtin/branch.c:217
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -1944,129 +2220,259 @@
 "Grenen \"%s\" har inte slagits samman i sin helhet.\n"
 "Om du är säker på att du vill ta bort den, kör \"git branch -D %s\"."
 
-#: builtin/branch.c:225
+#: builtin/branch.c:226
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "Fel vid borttagning av fjärrgrenen \"%s\""
 
-#: builtin/branch.c:226
+#: builtin/branch.c:227
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "Fel vid borttagning av grenen \"%s\""
 
-#: builtin/branch.c:233
+#: builtin/branch.c:234
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "Tog bort fjärrgrenen %s (var %s).\n"
 
-#: builtin/branch.c:234
+#: builtin/branch.c:235
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "Tog bort grenen %s (var %s).\n"
 
-#: builtin/branch.c:239
+#: builtin/branch.c:240
 msgid "Update of config-file failed"
 msgstr "Misslyckades uppdatera konfigurationsfil"
 
-#: builtin/branch.c:337
+#: builtin/branch.c:338
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr "grenen \"%s\" pekar inte på en incheckning"
 
-#: builtin/branch.c:409
+#: builtin/branch.c:410
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s: bakom %d] "
 
-#: builtin/branch.c:411
+#: builtin/branch.c:412
 #, c-format
 msgid "[behind %d]"
 msgstr "[bakom %d] "
 
-#: builtin/branch.c:415
+#: builtin/branch.c:416
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s: före %d] "
 
-#: builtin/branch.c:417
+#: builtin/branch.c:418
 #, c-format
 msgid "[ahead %d]"
 msgstr "[före %d] "
 
-#: builtin/branch.c:420
+#: builtin/branch.c:421
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s: före %d, bakom %d] "
 
-#: builtin/branch.c:423
+#: builtin/branch.c:424
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[före %d, bakom %d] "
 
-#: builtin/branch.c:535
+#: builtin/branch.c:537
 msgid "(no branch)"
 msgstr "(ingen gren)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:602
 msgid "some refs could not be read"
 msgstr "vissa referenser kunde inte läsas"
 
-#: builtin/branch.c:613
+#: builtin/branch.c:615
 msgid "cannot rename the current branch while not on any."
 msgstr ""
 "kunde inte byta namn på aktuell gren när du inte befinner dig på någon."
 
-#: builtin/branch.c:623
+#: builtin/branch.c:625
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "Felaktigt namn på gren: \"%s\""
 
-#: builtin/branch.c:638
+#: builtin/branch.c:640
 msgid "Branch rename failed"
 msgstr "Misslyckades byta namn på gren"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:644
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "Bytte bort namn på en felaktigt namngiven gren \"%s\""
 
-#: builtin/branch.c:646
+#: builtin/branch.c:648
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Grenen namnbytt till %s, men HEAD har inte uppdaterats!"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:655
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "Grenen namnbytt, men misslyckades uppdatera konfigurationsfilen"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:670
 #, c-format
 msgid "malformed object name %s"
 msgstr "felformat objektnamn %s"
 
-#: builtin/branch.c:692
+#: builtin/branch.c:694
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "kunde inte skriva grenbeskrivningsmall: %s"
 
-#: builtin/branch.c:783
+#: builtin/branch.c:724
+msgid "Generic options"
+msgstr "Allmänna flaggor"
+
+#: builtin/branch.c:726
+msgid "show hash and subject, give twice for upstream branch"
+msgstr "visa hash och ärenderad, ange två gånger för uppströmsgren"
+
+#: builtin/branch.c:727
+msgid "suppress informational messages"
+msgstr "undertryck informationsmeddelanden"
+
+#: builtin/branch.c:728
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "ställ in spårningsläge (se git-pull(1))"
+
+#: builtin/branch.c:730
+msgid "change upstream info"
+msgstr "ändra uppströmsinformation"
+
+#: builtin/branch.c:734
+msgid "use colored output"
+msgstr "använd färgad utdata"
+
+#: builtin/branch.c:735
+msgid "act on remote-tracking branches"
+msgstr "arbeta på fjärrspårande grenar"
+
+#: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765
+#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396
+#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470
+msgid "commit"
+msgstr "incheckning"
+
+#: builtin/branch.c:739 builtin/branch.c:745
+msgid "print only branches that contain the commit"
+msgstr "visa endast grenar som innehåller incheckningen"
+
+#: builtin/branch.c:751
+msgid "Specific git-branch actions:"
+msgstr "Specifika git-branch-åtgärder:"
+
+#: builtin/branch.c:752
+msgid "list both remote-tracking and local branches"
+msgstr "visa både fjärrspårande och lokala grenar"
+
+#: builtin/branch.c:754
+msgid "delete fully merged branch"
+msgstr "ta bort helt sammanslagen gren"
+
+#: builtin/branch.c:755
+msgid "delete branch (even if not merged)"
+msgstr "ta bort gren (även om inte helt sammanslagen)"
+
+#: builtin/branch.c:756
+msgid "move/rename a branch and its reflog"
+msgstr "flytta/ta bort en gren och dess reflogg"
+
+#: builtin/branch.c:757
+msgid "move/rename a branch, even if target exists"
+msgstr "flytta/ta bort en gren, även om målet finns"
+
+#: builtin/branch.c:758
+msgid "list branch names"
+msgstr "lista namn på grenar"
+
+#: builtin/branch.c:759
+msgid "create the branch's reflog"
+msgstr "skapa grenens reflogg"
+
+#: builtin/branch.c:761
+msgid "edit the description for the branch"
+msgstr "redigera beskrivning för grenen"
+
+#: builtin/branch.c:762
+msgid "force creation (when already exists)"
+msgstr "tvinga skapande (när den redan finns)"
+
+#: builtin/branch.c:765
+msgid "print only not merged branches"
+msgstr "visa endast ej sammanslagna grenar"
+
+#: builtin/branch.c:771
+msgid "print only merged branches"
+msgstr "visa endast sammanslagna grenar"
+
+#: builtin/branch.c:775
+msgid "list branches in columns"
+msgstr "visa grenar i spalter"
+
+#: builtin/branch.c:788
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Misslyckades slå upp HEAD som giltig referens"
 
-#: builtin/branch.c:788 builtin/clone.c:561
+#: builtin/branch.c:793 builtin/clone.c:561
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD hittades inte under refs/heads!"
 
-#: builtin/branch.c:808
+#: builtin/branch.c:813
 msgid "--column and --verbose are incompatible"
 msgstr "--column och --verbose är inkompatibla"
 
-#: builtin/branch.c:857
+#: builtin/branch.c:864
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr "grenen \"%s\" finns inte"
+
+#: builtin/branch.c:876
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr "Grenen \"%s\" har ingen uppströmsinformation"
+
+#: builtin/branch.c:891
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr ""
 "flaggorna -a och -r på \"git branch\" kan inte anges tillsammans med ett "
 "grennamn"
 
+#: builtin/branch.c:894
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+"Flaggan --set-upstream rekommenderas ej och kommer tas bort. Använd --track "
+"eller --set-upstream-to\n"
+
+#: builtin/branch.c:911
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+"\n"
+"Om du vill göra så att \"%s\" spårar \"%s\" gör du så här:\n"
+"\n"
+
+#: builtin/branch.c:912
+#, c-format
+msgid "    git branch -d %s\n"
+msgstr "    git branch -d %s\n"
+
+#: builtin/branch.c:913
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr "    git branch --set-upstream-to %s\n"
+
 #: builtin/bundle.c:47
 #, c-format
 msgid "%s is okay\n"
@@ -2080,99 +2486,227 @@
 msgid "Need a repository to unbundle."
 msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
 
-#: builtin/checkout.c:114 builtin/checkout.c:147
+#: builtin/cat-file.c:247
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr "git cat-file (-t|-s|-e|-p|<typ>|--textconv) <objekt>"
+
+#: builtin/cat-file.c:248
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr "git cat-file (--batch|--batch-check) < <objektlista>"
+
+#: builtin/cat-file.c:266
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr "<typ> kan vara en av: blob, tree, commit, tag"
+
+#: builtin/cat-file.c:267
+msgid "show object type"
+msgstr "visa objekttyp"
+
+#: builtin/cat-file.c:268
+msgid "show object size"
+msgstr "visa objektstorlek"
+
+#: builtin/cat-file.c:270
+msgid "exit with zero when there's no error"
+msgstr "avsluta med noll när det inte uppstått något fel"
+
+#: builtin/cat-file.c:271
+msgid "pretty-print object's content"
+msgstr "visa objektets innehåll snyggt"
+
+#: builtin/cat-file.c:273
+msgid "for blob objects, run textconv on object's content"
+msgstr "för blob-objekt, kör textconv på objektets innehåll"
+
+#: builtin/cat-file.c:275
+msgid "show info and content of objects fed from the standard input"
+msgstr "visa information och innehåll för objekt som listas på standard in"
+
+#: builtin/cat-file.c:278
+msgid "show info about objects fed from the standard input"
+msgstr "visa information för objekt som listas på standard in"
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | attr...] [--] pathname..."
+msgstr "git check-attr [-a | --all | attr...] [--] sökväg..."
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-a | --all | attr...] < <list-of-paths>"
+msgstr "git check-attr --stdin [-a | --all | attr...] < <sökvägslista>"
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "visa alla attribut som satts på filen"
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "använd .gitattributes endast från indexet"
+
+#: builtin/check-attr.c:21 builtin/hash-object.c:75
+msgid "read file names from stdin"
+msgstr "läs filnamn från standard in"
+
+#: builtin/check-attr.c:23
+msgid "input paths are terminated by a null character"
+msgstr "sökvägar avdelas med null-tecken"
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [options] [--] [<file>...]"
+msgstr "git checkout-index [flaggor] [--] [<fil>...]"
+
+#: builtin/checkout-index.c:187
+msgid "check out all files in the index"
+msgstr "checka ut alla filer i indexet"
+
+#: builtin/checkout-index.c:188
+msgid "force overwrite of existing files"
+msgstr "tvinga överskrivning av befintliga filer"
+
+#: builtin/checkout-index.c:190
+msgid "no warning for existing files and files not in index"
+msgstr "ingen varning för existerande filer och filer ej i indexet"
+
+#: builtin/checkout-index.c:192
+msgid "don't checkout new files"
+msgstr "checka inte ut nya filer"
+
+#: builtin/checkout-index.c:194
+msgid "update stat information in the index file"
+msgstr "uppdatera stat-information i indexfilen"
+
+#: builtin/checkout-index.c:200
+msgid "read list of paths from the standard input"
+msgstr "läs listan över sökvägar från standard in"
+
+#: builtin/checkout-index.c:202
+msgid "write the content to temporary files"
+msgstr "skriv innehåll till temporära filer"
+
+#: builtin/checkout-index.c:203 builtin/column.c:30
+msgid "string"
+msgstr "sträng"
+
+#: builtin/checkout-index.c:204
+msgid "when creating files, prepend <string>"
+msgstr "när filer skapas, lägg till <sträng> först"
+
+#: builtin/checkout-index.c:207
+msgid "copy out the files from named stage"
+msgstr "kopiera ut filer från namngiven etapp"
+
+#: builtin/checkout.c:25
+msgid "git checkout [options] <branch>"
+msgstr "git checkout [flaggor] <gren>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [options] [<branch>] -- <file>..."
+msgstr "git checkout [flaggor] [<gren>] -- <fil>..."
+
+#: builtin/checkout.c:116 builtin/checkout.c:149
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "sökvägen \"%s\" har inte vår version"
 
-#: builtin/checkout.c:116 builtin/checkout.c:149
+#: builtin/checkout.c:118 builtin/checkout.c:151
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "sökvägen \"%s\" har inte deras version"
 
-#: builtin/checkout.c:132
+#: builtin/checkout.c:134
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte alla nödvändiga versioner"
 
-#: builtin/checkout.c:176
+#: builtin/checkout.c:178
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "sökvägen \"%s\" innehåller inte nödvändiga versioner"
 
-#: builtin/checkout.c:193
+#: builtin/checkout.c:195
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "sökväg \"%s\": kan inte slå ihop"
 
-#: builtin/checkout.c:210
+#: builtin/checkout.c:212
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "Kunde inte lägga till sammanslagningsresultat för \"%s\""
 
-#: builtin/checkout.c:235 builtin/checkout.c:393
+#: builtin/checkout.c:236 builtin/checkout.c:239 builtin/checkout.c:242
+#: builtin/checkout.c:245
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "\"%s\" kan inte användas vid uppdatering av sökvägar"
+
+#: builtin/checkout.c:248 builtin/checkout.c:251
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "\"%s\" kan inte användas med %s"
+
+#: builtin/checkout.c:254
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt."
+
+#: builtin/checkout.c:265 builtin/checkout.c:426
 msgid "corrupt index file"
 msgstr "indexfilen är trasig"
 
-#: builtin/checkout.c:265 builtin/checkout.c:272
+#: builtin/checkout.c:295 builtin/checkout.c:302
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "sökvägen \"%s\" har inte slagits ihop"
 
-#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586
-#: builtin/merge.c:812
+#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586
+#: builtin/merge.c:811
 msgid "unable to write new index file"
 msgstr "kunde inte skriva ny indexfil"
 
-#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408
-msgid "diff_setup_done failed"
-msgstr "diff_setup_done misslyckades"
-
-#: builtin/checkout.c:415
+#: builtin/checkout.c:448
 msgid "you need to resolve your current index first"
 msgstr "du måste lösa ditt befintliga index först"
 
-#: builtin/checkout.c:534
+#: builtin/checkout.c:569
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Kan inte skapa referenslog för \"%s\"\n"
 
-#: builtin/checkout.c:567
+#: builtin/checkout.c:602
 msgid "HEAD is now at"
 msgstr "HEAD är nu på"
 
-#: builtin/checkout.c:574
+#: builtin/checkout.c:609
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Återställ gren \"%s\"\n"
 
-#: builtin/checkout.c:577
+#: builtin/checkout.c:612
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Redan på \"%s\"\n"
 
-#: builtin/checkout.c:581
+#: builtin/checkout.c:616
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Växlade till och nollställde grenen \"%s\"\n"
 
-#: builtin/checkout.c:583
+#: builtin/checkout.c:618
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Växlade till en ny gren \"%s\"\n"
 
-#: builtin/checkout.c:585
+#: builtin/checkout.c:620
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Växlade till grenen \"%s\"\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:676
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... och %d till.\n"
 
 #. The singular version
-#: builtin/checkout.c:647
+#: builtin/checkout.c:682
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -2195,7 +2729,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:665
+#: builtin/checkout.c:700
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -2210,88 +2744,150 @@
 " git branch nytt_grennamn %s\n"
 "\n"
 
-#: builtin/checkout.c:695
+#: builtin/checkout.c:730
 msgid "internal error in revision walk"
 msgstr "internt fel vid genomgång av revisioner (revision walk)"
 
-#: builtin/checkout.c:699
+#: builtin/checkout.c:734
 msgid "Previous HEAD position was"
 msgstr "Tidigare position för HEAD var"
 
-#: builtin/checkout.c:725 builtin/checkout.c:920
+#: builtin/checkout.c:761 builtin/checkout.c:950
 msgid "You are on a branch yet to be born"
 msgstr "Du är på en gren som ännu inte är född"
 
 #. case (1)
-#: builtin/checkout.c:856
+#: builtin/checkout.c:886
 #, c-format
 msgid "invalid reference: %s"
 msgstr "felaktig referens: %s"
 
 #. case (1): want a tree
-#: builtin/checkout.c:895
+#: builtin/checkout.c:925
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "referensen är inte ett träd: %s"
 
-#: builtin/checkout.c:977
-msgid "-B cannot be used with -b"
-msgstr "-B kan inte användas med -b"
+#: builtin/checkout.c:961
+msgid "paths cannot be used with switching branches"
+msgstr "sökvägar kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:986
-msgid "--patch is incompatible with all other options"
-msgstr "--patch är inkompatibel med alla andra flaggor"
+#: builtin/checkout.c:964 builtin/checkout.c:968
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "\"%s\" kan inte användas vid byte av gren"
 
-#: builtin/checkout.c:989
-msgid "--detach cannot be used with -b/-B/--orphan"
-msgstr "--detcah kan inte användas med -b/-B/--orphan"
+#: builtin/checkout.c:972 builtin/checkout.c:975 builtin/checkout.c:980
+#: builtin/checkout.c:983
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "\"%s\" kan inte användas med \"%s\""
 
-#: builtin/checkout.c:991
-msgid "--detach cannot be used with -t"
-msgstr "--detach kan inte användas med -t"
+#: builtin/checkout.c:988
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
 
-#: builtin/checkout.c:997
+#: builtin/checkout.c:1009 builtin/gc.c:177
+msgid "suppress progress reporting"
+msgstr "undertryck förloppsrapportering"
+
+#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89
+#: builtin/remote.c:169 builtin/remote.c:171
+msgid "branch"
+msgstr "gren"
+
+#: builtin/checkout.c:1011
+msgid "create and checkout a new branch"
+msgstr "skapa och checka ut en ny gren"
+
+#: builtin/checkout.c:1013
+msgid "create/reset and checkout a branch"
+msgstr "skapa/nollställ och checka ut en gren"
+
+#: builtin/checkout.c:1014
+msgid "create reflog for new branch"
+msgstr "skapa reflogg för ny gren"
+
+#: builtin/checkout.c:1015
+msgid "detach the HEAD at named commit"
+msgstr "koppla från HEAD vid namngiven incheckning"
+
+#: builtin/checkout.c:1016
+msgid "set upstream info for new branch"
+msgstr "sätt uppströmsinformation för ny gren"
+
+#: builtin/checkout.c:1018
+msgid "new branch"
+msgstr "ny gren"
+
+#: builtin/checkout.c:1018
+msgid "new unparented branch"
+msgstr "ny gren utan förälder"
+
+#: builtin/checkout.c:1019
+msgid "checkout our version for unmerged files"
+msgstr "checka ut vår version för ej sammanslagna filer"
+
+#: builtin/checkout.c:1021
+msgid "checkout their version for unmerged files"
+msgstr "checka ut deras version för ej sammanslagna filer"
+
+#: builtin/checkout.c:1023
+msgid "force checkout (throw away local modifications)"
+msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
+
+#: builtin/checkout.c:1024
+msgid "perform a 3-way merge with the new branch"
+msgstr "utför en 3-vägssammanslagning för den nya grenen"
+
+#: builtin/checkout.c:1025 builtin/merge.c:215
+msgid "update ignored files (default)"
+msgstr "uppdatera ignorerade filer (standard)"
+
+#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241
+msgid "style"
+msgstr "stil"
+
+#: builtin/checkout.c:1027
+msgid "conflict style (merge or diff3)"
+msgstr "konfliktstil (merge eller diff3)"
+
+#: builtin/checkout.c:1030
+msgid "second guess 'git checkout no-such-branch'"
+msgstr "förutspå \"git checkout gren-saknas\""
+
+#: builtin/checkout.c:1054
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
+
+#: builtin/checkout.c:1071
 msgid "--track needs a branch name"
 msgstr "--track behöver ett namn på en gren"
 
-#: builtin/checkout.c:1004
+#: builtin/checkout.c:1078
 msgid "Missing branch name; try -b"
 msgstr "Grennamn saknas; försök med -b"
 
-#: builtin/checkout.c:1010
-msgid "--orphan and -b|-B are mutually exclusive"
-msgstr "--orphan och -b|-B kan inte användas samtidigt"
-
-#: builtin/checkout.c:1012
-msgid "--orphan cannot be used with -t"
-msgstr "--orphan kan inte användas med -t"
-
-#: builtin/checkout.c:1022
-msgid "git checkout: -f and -m are incompatible"
-msgstr "git checkout: -f och -m är inkompatibla"
-
-#: builtin/checkout.c:1056
+#: builtin/checkout.c:1113
 msgid "invalid path specification"
 msgstr "felaktig sökvägsangivelse"
 
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1120
 #, c-format
 msgid ""
-"git checkout: updating paths is incompatible with switching branches.\n"
+"Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
-"git checkout: uppdatera sökvägar är inkompatibelt med att växla gren.\n"
-"Ville du checka ut \"%s\" som inte kan lösas som en sammanslaning?"
+"Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n"
+"Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?"
 
-#: builtin/checkout.c:1066
-msgid "git checkout: updating paths is incompatible with switching branches."
-msgstr "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren."
+#: builtin/checkout.c:1125
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr "git checkout: --detach tar inte en sökväg som argument \"%s\""
 
-#: builtin/checkout.c:1071
-msgid "git checkout: --detach does not take a path argument"
-msgstr "git checkout: --detach tar inte en sökväg som argument"
-
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1129
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -2299,13 +2895,39 @@
 "git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n"
 "du checkar ut från indexet."
 
-#: builtin/checkout.c:1093
-msgid "Cannot switch branch to a non-commit."
-msgstr "Kan inte växla gren på en icke-incheckning."
+#: builtin/clean.c:19
+msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
+"git clean [-d] [-f] [-n] [-q] [-e <mönster>] [-x | -X] [--] <sökvägar>..."
 
-#: builtin/checkout.c:1096
-msgid "--ours/--theirs is incompatible with switching branches."
-msgstr "--ours/--theirs är inkompatibla med att byta gren."
+#: builtin/clean.c:51
+msgid "do not print names of files removed"
+msgstr "skriv inte ut namn på borttagna filer"
+
+#: builtin/clean.c:53
+msgid "force"
+msgstr "tvinga"
+
+#: builtin/clean.c:55
+msgid "remove whole directories"
+msgstr "ta bort hela kataloger"
+
+#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802
+#: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199
+msgid "pattern"
+msgstr "mönster"
+
+#: builtin/clean.c:57
+msgid "add <pattern> to ignore rules"
+msgstr "lägg till <mönster> till ignoreringsregler"
+
+#: builtin/clean.c:58
+msgid "remove ignored files, too"
+msgstr "ta även bort ignorerade filer"
+
+#: builtin/clean.c:60
+msgid "remove only ignored files"
+msgstr "ta endast bort ignorerade filer"
 
 #: builtin/clean.c:78
 msgid "-x and -X cannot be used together"
@@ -2351,6 +2973,99 @@
 msgid "Not removing %s\n"
 msgstr "Tar inte bort %s\n"
 
+#: builtin/clone.c:36
+msgid "git clone [options] [--] <repo> [<dir>]"
+msgstr "git clone [flaggor] [--] <arkiv> [<kat>]"
+
+#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212
+#: builtin/push.c:399
+msgid "force progress reporting"
+msgstr "tvinga förloppsrapportering"
+
+#: builtin/clone.c:66
+msgid "don't create a checkout"
+msgstr "skapa inte någon utcheckning"
+
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+msgid "create a bare repository"
+msgstr "skapa ett naket (\"bare\") arkiv"
+
+#: builtin/clone.c:72
+msgid "create a mirror repository (implies bare)"
+msgstr "skapa ett spegelarkiv (implicerar \"bare\")"
+
+#: builtin/clone.c:74
+msgid "to clone from a local repository"
+msgstr "för att klona från ett lokalt arkiv"
+
+#: builtin/clone.c:76
+msgid "don't use local hardlinks, always copy"
+msgstr "skapa inte lokala hårda länkar, kopiera alltid"
+
+#: builtin/clone.c:78
+msgid "setup as shared repository"
+msgstr "skapa som ett delat arkiv"
+
+#: builtin/clone.c:80 builtin/clone.c:82
+msgid "initialize submodules in the clone"
+msgstr "initiera undermoduler i klonen"
+
+#: builtin/clone.c:83 builtin/init-db.c:485
+msgid "template-directory"
+msgstr "mallkatalog"
+
+#: builtin/clone.c:84 builtin/init-db.c:486
+msgid "directory from which templates will be used"
+msgstr "katalog att använda mallar från"
+
+#: builtin/clone.c:86
+msgid "reference repository"
+msgstr "referensarkiv"
+
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "namn"
+
+#: builtin/clone.c:88
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr "använd <namn> istället för \"origin\" för att spåra uppströms"
+
+#: builtin/clone.c:90
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "checka ut <gren> istället för fjärrens HEAD"
+
+#: builtin/clone.c:92
+msgid "path to git-upload-pack on the remote"
+msgstr "sökväg till git-upload-pack på fjärren"
+
+#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747
+msgid "depth"
+msgstr "djup"
+
+#: builtin/clone.c:94
+msgid "create a shallow clone of that depth"
+msgstr "skapa en grund klon på detta djup"
+
+#: builtin/clone.c:96
+msgid "clone only one branch, HEAD or --branch"
+msgstr "klona endast en gren, HEAD eller --branch"
+
+#: builtin/clone.c:97 builtin/init-db.c:494
+msgid "gitdir"
+msgstr "gitkat"
+
+#: builtin/clone.c:98 builtin/init-db.c:495
+msgid "separate git dir from working tree"
+msgstr "separera gitkatalogen från arbetskatalogen"
+
+#: builtin/clone.c:99
+msgid "key=value"
+msgstr "nyckel=värde"
+
+#: builtin/clone.c:100
+msgid "set config inside the new repository"
+msgstr "ställ in konfiguration i det nya arkivet"
+
 #: builtin/clone.c:243
 #, c-format
 msgid "reference repository '%s' is not a local directory."
@@ -2361,7 +3076,7 @@
 msgid "failed to create directory '%s'"
 msgstr "misslyckades skapa katalogen \"%s\""
 
-#: builtin/clone.c:308 builtin/diff.c:75
+#: builtin/clone.c:308 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "misslyckades ta status på \"%s\""
@@ -2376,11 +3091,6 @@
 msgid "failed to stat %s\n"
 msgstr "misslyckades ta status på %s\n"
 
-#: builtin/clone.c:341
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "misslyckades ta bort länken \"%s\""
-
 #: builtin/clone.c:346
 #, c-format
 msgid "failed to create link '%s'"
@@ -2472,10 +3182,46 @@
 msgid "You appear to have cloned an empty repository."
 msgstr "Du verkar ha klonat ett tomt arkiv."
 
+#: builtin/column.c:9
+msgid "git column [options]"
+msgstr "git column [flaggor]"
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "slå upp konfigurationsvariabler"
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "utseende att använda"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "Maximal bredd"
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "Spaltfyllnad i vänsterkanten"
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "Spaltfyllnad i högerkanten"
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "Spaltfyllnad mellan spalter"
+
 #: builtin/column.c:51
 msgid "--command must be the first argument"
 msgstr "--command måste vara första argument"
 
+#: builtin/commit.c:33
+msgid "git commit [options] [--] <filepattern>..."
+msgstr "git commit [flaggor] [--] <filmöster>..."
+
+#: builtin/commit.c:38
+msgid "git status [options] [--] <filepattern>..."
+msgstr "git status [flaggor] [--] <filmönster>..."
+
 #: builtin/commit.c:43
 msgid ""
 "Your name and email address were configured automatically based\n"
@@ -2559,61 +3305,61 @@
 msgid "unable to write temporary index file"
 msgstr "kunde inte skriva temporär indexfil"
 
-#: builtin/commit.c:496 builtin/commit.c:502
+#: builtin/commit.c:510 builtin/commit.c:516
 #, c-format
 msgid "invalid commit: %s"
 msgstr "felaktig incheckning: %s"
 
-#: builtin/commit.c:525
+#: builtin/commit.c:539
 msgid "malformed --author parameter"
 msgstr "felformad \"--author\"-flagga"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:600
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "Felaktig indragningssträng: \"%s\""
 
-#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970
+#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "kunde inte slå upp incheckningen %s"
 
-#: builtin/commit.c:635 builtin/shortlog.c:296
+#: builtin/commit.c:650 builtin/shortlog.c:296
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(läser loggmeddelande från standard in)\n"
 
-#: builtin/commit.c:637
+#: builtin/commit.c:652
 msgid "could not read log from standard input"
 msgstr "kunde inte läsa logg från standard in"
 
-#: builtin/commit.c:641
+#: builtin/commit.c:656
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "kunde inte läsa loggfilen \"%s\""
 
-#: builtin/commit.c:647
+#: builtin/commit.c:662
 msgid "commit has empty message"
 msgstr "incheckningen har ett tomt meddelande"
 
-#: builtin/commit.c:663
+#: builtin/commit.c:678
 msgid "could not read MERGE_MSG"
 msgstr "kunde inte läsa MERGE_MSG"
 
-#: builtin/commit.c:667
+#: builtin/commit.c:682
 msgid "could not read SQUASH_MSG"
 msgstr "kunde inte läsa SQUASH_MSG"
 
-#: builtin/commit.c:671
+#: builtin/commit.c:686
 #, c-format
 msgid "could not read '%s'"
 msgstr "kunde inte läsa \"%s\""
 
-#: builtin/commit.c:723
+#: builtin/commit.c:738
 msgid "could not write commit template"
 msgstr "kunde inte skriva incheckningsmall"
 
-#: builtin/commit.c:734
+#: builtin/commit.c:749
 #, c-format
 msgid ""
 "\n"
@@ -2628,7 +3374,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:739
+#: builtin/commit.c:754
 #, c-format
 msgid ""
 "\n"
@@ -2643,7 +3389,7 @@
 "\t%s\n"
 "och försöker igen.\n"
 
-#: builtin/commit.c:751
+#: builtin/commit.c:766
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be ignored, and an empty message aborts the commit.\n"
@@ -2651,7 +3397,7 @@
 "Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n"
 "med \"#\" kommer ignoreras, och ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/commit.c:756
+#: builtin/commit.c:771
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be kept; you may remove them yourself if you want to.\n"
@@ -2661,159 +3407,349 @@
 "med \"#\" kommer behållas; du kan själv ta bort dem om du vill.\n"
 "Ett tomt meddelande avbryter incheckningen.\n"
 
-#: builtin/commit.c:769
+#: builtin/commit.c:784
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%sFörfattare: %s"
 
-#: builtin/commit.c:776
+#: builtin/commit.c:791
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%sIncheckare: %s"
 
-#: builtin/commit.c:796
+#: builtin/commit.c:811
 msgid "Cannot read index"
 msgstr "Kan inte läsa indexet"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:848
 msgid "Error building trees"
 msgstr "Fel vid byggande av träd"
 
-#: builtin/commit.c:848 builtin/tag.c:361
+#: builtin/commit.c:863 builtin/tag.c:361
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
 
-#: builtin/commit.c:945
+#: builtin/commit.c:960
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "Hittade ingen befintlig författare med \"%s\""
 
-#: builtin/commit.c:960 builtin/commit.c:1160
+#: builtin/commit.c:975 builtin/commit.c:1175
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Ogiltigt läge för ospårade filer: \"%s\""
 
-#: builtin/commit.c:1000
+#: builtin/commit.c:1015
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "Kan inte använda både --reset-author och --author"
 
-#: builtin/commit.c:1011
+#: builtin/commit.c:1026
 msgid "You have nothing to amend."
 msgstr "Du har inget att utöka."
 
-#: builtin/commit.c:1014
+#: builtin/commit.c:1029
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "Du är i mitten av en sammanslagning -- kan inte utöka."
 
-#: builtin/commit.c:1016
+#: builtin/commit.c:1031
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "Du är i mitten av en cherry-pick -- kan inte utöka."
 
-#: builtin/commit.c:1019
+#: builtin/commit.c:1034
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
 
-#: builtin/commit.c:1029
+#: builtin/commit.c:1044
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "Endast en av -c/-C/-F/--fixup kan användas."
 
-#: builtin/commit.c:1031
+#: builtin/commit.c:1046
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup."
 
-#: builtin/commit.c:1039
+#: builtin/commit.c:1054
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author kan endast användas med -C, -c eller --amend."
 
-#: builtin/commit.c:1056
+#: builtin/commit.c:1071
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr ""
 "Endast en av --include/--only/--all/--interactive/--patch kan användas."
 
-#: builtin/commit.c:1058
+#: builtin/commit.c:1073
 msgid "No paths with --include/--only does not make sense."
 msgstr "Du måste ange sökvägar tillsammans med --include/--only."
 
-#: builtin/commit.c:1060
+#: builtin/commit.c:1075
 msgid "Clever... amending the last one with dirty index."
 msgstr "Smart... utöka den senaste med smutsigt index."
 
-#: builtin/commit.c:1062
+#: builtin/commit.c:1077
 msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
 msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..."
 
-#: builtin/commit.c:1072 builtin/tag.c:577
+#: builtin/commit.c:1087 builtin/tag.c:577
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Felaktigt städningsläge %s"
 
-#: builtin/commit.c:1077
+#: builtin/commit.c:1092
 msgid "Paths with -a does not make sense."
 msgstr "Kan inte ange sökvägar med -a."
 
-#: builtin/commit.c:1260
+#: builtin/commit.c:1189 builtin/commit.c:1417
+msgid "show status concisely"
+msgstr "vis koncis status"
+
+#: builtin/commit.c:1191 builtin/commit.c:1419
+msgid "show branch information"
+msgstr "visa information om gren"
+
+#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389
+msgid "machine-readable output"
+msgstr "maskinläsbar utdata"
+
+#: builtin/commit.c:1196 builtin/commit.c:1423
+msgid "terminate entries with NUL"
+msgstr "terminera poster med NUL"
+
+#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636
+#: builtin/fast-export.c:639 builtin/tag.c:461
+msgid "mode"
+msgstr "läge"
+
+#: builtin/commit.c:1199 builtin/commit.c:1426
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr "visa ospårade filer, valfria lägen: alla, normal, no. (Standard: all)"
+
+#: builtin/commit.c:1202
+msgid "show ignored files"
+msgstr "visa ignorerade filer"
+
+#: builtin/commit.c:1203 parse-options.h:151
+msgid "when"
+msgstr "när"
+
+#: builtin/commit.c:1204
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+"ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
+"(Default: all)"
+
+#: builtin/commit.c:1206
+msgid "list untracked files in columns"
+msgstr "visa ospårade filer i spalter"
+
+#: builtin/commit.c:1275
 msgid "couldn't look up newly created commit"
 msgstr "kunde inte slå upp en precis skapad incheckning"
 
-#: builtin/commit.c:1262
+#: builtin/commit.c:1277
 msgid "could not parse newly created commit"
 msgstr "kunde inte tolka en precis skapad incheckning"
 
-#: builtin/commit.c:1303
+#: builtin/commit.c:1318
 msgid "detached HEAD"
 msgstr "frånkopplad HEAD"
 
-#: builtin/commit.c:1305
+#: builtin/commit.c:1320
 msgid " (root-commit)"
 msgstr " (rotincheckning)"
 
-#: builtin/commit.c:1449
+#: builtin/commit.c:1387
+msgid "suppress summary after successful commit"
+msgstr "undertryck sammanfattning efter framgångsrik incheckning"
+
+#: builtin/commit.c:1388
+msgid "show diff in commit message template"
+msgstr "visa diff i mallen för incheckningsmeddelandet"
+
+#: builtin/commit.c:1390
+msgid "Commit message options"
+msgstr "Alternativ för incheckningsmeddelande"
+
+#: builtin/commit.c:1391 builtin/tag.c:459
+msgid "read message from file"
+msgstr "läs meddelande från fil"
+
+#: builtin/commit.c:1392
+msgid "author"
+msgstr "författare"
+
+#: builtin/commit.c:1392
+msgid "override author for commit"
+msgstr "överstyr författare för incheckningen"
+
+#: builtin/commit.c:1393 builtin/gc.c:178
+msgid "date"
+msgstr "datum"
+
+#: builtin/commit.c:1393
+msgid "override date for commit"
+msgstr "överstyr datum för inchecknignen"
+
+#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534
+#: builtin/notes.c:691 builtin/tag.c:457
+msgid "message"
+msgstr "meddelande"
+
+#: builtin/commit.c:1394
+msgid "commit message"
+msgstr "incheckningsmeddelande"
+
+#: builtin/commit.c:1395
+msgid "reuse and edit message from specified commit"
+msgstr "återanvänd och redigera meddelande från angiven incheckning"
+
+#: builtin/commit.c:1396
+msgid "reuse message from specified commit"
+msgstr "återanvänd meddelande från angiven incheckning"
+
+#: builtin/commit.c:1397
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+"använd autosquash-formaterat meddelande för att fixa angiven incheckning"
+
+#: builtin/commit.c:1398
+msgid "use autosquash formatted message to squash specified commit"
+msgstr ""
+"använd autosquash-formaterat meddelande för att slå ihop med angiven "
+"incheckning"
+
+#: builtin/commit.c:1399
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)"
+
+#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109
+msgid "add Signed-off-by:"
+msgstr "lägg till Signed-off-by:"
+
+#: builtin/commit.c:1401
+msgid "use specified template file"
+msgstr "använd angiven mallfil"
+
+#: builtin/commit.c:1402
+msgid "force edit of commit"
+msgstr "tvinga redigering av incheckning"
+
+#: builtin/commit.c:1403
+msgid "default"
+msgstr "standard"
+
+#: builtin/commit.c:1403 builtin/tag.c:462
+msgid "how to strip spaces and #comments from message"
+msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
+
+#: builtin/commit.c:1404
+msgid "include status in commit message template"
+msgstr "inkludera status i mallen för incheckningsmeddelandet"
+
+#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463
+msgid "key id"
+msgstr "nyckel-id"
+
+#: builtin/commit.c:1406 builtin/merge.c:214
+msgid "GPG sign commit"
+msgstr "GPG-signera incheckning"
+
+#. end commit message options
+#: builtin/commit.c:1409
+msgid "Commit contents options"
+msgstr "Alternativ för incheckningens innehåll"
+
+#: builtin/commit.c:1410
+msgid "commit all changed files"
+msgstr "checka in alla ändrade filer"
+
+#: builtin/commit.c:1411
+msgid "add specified files to index for commit"
+msgstr "lägg till angivna filer till indexet för incheckning"
+
+#: builtin/commit.c:1412
+msgid "interactively add files"
+msgstr "lägg till filer interaktivt"
+
+#: builtin/commit.c:1413
+msgid "interactively add changes"
+msgstr "lägg till ändringar interaktivt"
+
+#: builtin/commit.c:1414
+msgid "commit only specified files"
+msgstr "checka endast in angivna filer"
+
+#: builtin/commit.c:1415
+msgid "bypass pre-commit hook"
+msgstr "förbigå pre-commit-krok"
+
+#: builtin/commit.c:1416
+msgid "show what would be committed"
+msgstr "visa vad som skulle checkas in"
+
+#: builtin/commit.c:1424
+msgid "amend previous commit"
+msgstr "lägg till föregående incheckning"
+
+#: builtin/commit.c:1425
+msgid "bypass post-rewrite hook"
+msgstr "förbigå post-rewrite-krok"
+
+#: builtin/commit.c:1430
+msgid "ok to record an empty change"
+msgstr "ok att registrera en tom ändring"
+
+#: builtin/commit.c:1433
+msgid "ok to record a change with an empty message"
+msgstr "ok att registrera en ändring med tomt meddelande"
+
+#: builtin/commit.c:1464
 msgid "could not parse HEAD commit"
 msgstr "kunde inte tolka HEAD:s incheckning"
 
-#: builtin/commit.c:1487 builtin/merge.c:509
+#: builtin/commit.c:1502 builtin/merge.c:508
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "kunde inte öppna \"%s\" för läsning"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1509
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "Trasig MERGE_HEAD-fil (%s)"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1516
 msgid "could not read MERGE_MODE"
 msgstr "kunde inte läsa MERGE_MODE"
 
-#: builtin/commit.c:1520
+#: builtin/commit.c:1535
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "kunde inte läsa incheckningsmeddelande: %s"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1549
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
 
-#: builtin/commit.c:1539
+#: builtin/commit.c:1554
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
 
-#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961
+#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960
 msgid "failed to write commit object"
 msgstr "kunde inte skriva incheckningsobjekt"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1590
 msgid "cannot lock HEAD ref"
 msgstr "kunde inte låsa HEAD-referens"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1594
 msgid "cannot update HEAD ref"
 msgstr "kunde inte uppdatera HEAD-referens"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1605
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -2824,6 +3760,134 @@
 "att kvoten inte har överskridits, och kör sedan\n"
 "\"git reset HEAD\" för att återställa."
 
+#: builtin/config.c:7
+msgid "git config [options]"
+msgstr "git config [flaggor]"
+
+#: builtin/config.c:52
+msgid "Config file location"
+msgstr "Konfigurationsfilens plats"
+
+#: builtin/config.c:53
+msgid "use global config file"
+msgstr "använd global konfigurationsfil"
+
+#: builtin/config.c:54
+msgid "use system config file"
+msgstr "använd systemets konfigurationsfil"
+
+#: builtin/config.c:55
+msgid "use repository config file"
+msgstr "använd arkivets konfigurationsfil"
+
+#: builtin/config.c:56
+msgid "use given config file"
+msgstr "använd angiven konfigurationsil"
+
+#: builtin/config.c:57
+msgid "Action"
+msgstr "Åtgärd"
+
+#: builtin/config.c:58
+msgid "get value: name [value-regex]"
+msgstr "hämta värde: namn [värde-reguttr]"
+
+#: builtin/config.c:59
+msgid "get all values: key [value-regex]"
+msgstr "hämta alla värden: nyckel [värde-reguttr]"
+
+#: builtin/config.c:60
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]"
+
+#: builtin/config.c:61
+msgid "replace all matching variables: name value [value_regex]"
+msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]"
+
+#: builtin/config.c:62
+msgid "add a new variable: name value"
+msgstr "lägg till en ny variabel: namn värde"
+
+#: builtin/config.c:63
+msgid "remove a variable: name [value-regex]"
+msgstr "ta bort en variabel: namn [värde-reguttr]"
+
+#: builtin/config.c:64
+msgid "remove all matches: name [value-regex]"
+msgstr "ta bort alla träffar: namn [värde-reguttr]"
+
+#: builtin/config.c:65
+msgid "rename section: old-name new-name"
+msgstr "byt namn på sektion: gammalt-namn nytt-namn"
+
+#: builtin/config.c:66
+msgid "remove a section: name"
+msgstr "ta bort en sektion: namn"
+
+#: builtin/config.c:67
+msgid "list all"
+msgstr "visa alla"
+
+#: builtin/config.c:68
+msgid "open an editor"
+msgstr "öppna textredigeringsprogram"
+
+#: builtin/config.c:69 builtin/config.c:70
+msgid "slot"
+msgstr "plats"
+
+#: builtin/config.c:69
+msgid "find the color configured: [default]"
+msgstr "hitta den inställda färgen: [default]"
+
+#: builtin/config.c:70
+msgid "find the color setting: [stdout-is-tty]"
+msgstr "hitta färginställningen: [stdout-is-tty]"
+
+#: builtin/config.c:71
+msgid "Type"
+msgstr "Typ"
+
+#: builtin/config.c:72
+msgid "value is \"true\" or \"false\""
+msgstr "värdet är \"true\" eller \"false\""
+
+#: builtin/config.c:73
+msgid "value is decimal number"
+msgstr "värdet är ett decimalt tal"
+
+#: builtin/config.c:74
+msgid "value is --bool or --int"
+msgstr "värdet är --bool eller --int"
+
+#: builtin/config.c:75
+msgid "value is a path (file or directory name)"
+msgstr "värdet är en sökväg (fil- eller katalognamn)"
+
+#: builtin/config.c:76
+msgid "Other"
+msgstr "Andra"
+
+#: builtin/config.c:77
+msgid "terminate values with NUL byte"
+msgstr "terminera värden med NUL-byte"
+
+#: builtin/config.c:78
+msgid "respect include directives on lookup"
+msgstr "respektera inkluderingsdirektiv vid uppslag"
+
+#: builtin/count-objects.c:69
+msgid "git count-objects [-v]"
+msgstr "git count-objects [-v]"
+
+#: builtin/describe.c:15
+msgid "git describe [options] <committish>*"
+msgstr "git describe [flaggor] <incheckning-igt>*"
+
+#: builtin/describe.c:16
+msgid "git describe [options] --dirty"
+msgstr "git describe [flaggor] --dirty"
+
 #: builtin/describe.c:234
 #, c-format
 msgid "annotated tag %s not available"
@@ -2896,6 +3960,50 @@
 "mer än %i taggar hittades; listar de %i senaste\n"
 "gav upp sökningen vid %s\n"
 
+#: builtin/describe.c:403
+msgid "find the tag that comes after the commit"
+msgstr "hitta taggen som kommer efter incheckningen"
+
+#: builtin/describe.c:404
+msgid "debug search strategy on stderr"
+msgstr "felsök sökstrategin på standard fel"
+
+#: builtin/describe.c:405
+msgid "use any ref in .git/refs"
+msgstr "använd alla referenser i .git/refs"
+
+#: builtin/describe.c:406
+msgid "use any tag in .git/refs/tags"
+msgstr "använd alla taggar i .git/refs/tags"
+
+#: builtin/describe.c:407
+msgid "always use long format"
+msgstr "använd alltid långt format"
+
+#: builtin/describe.c:410
+msgid "only output exact matches"
+msgstr "skriv endast ut exakta träffar"
+
+#: builtin/describe.c:412
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "överväg de <n> nyaste taggarna (standard: 10)"
+
+#: builtin/describe.c:414
+msgid "only consider tags matching <pattern>"
+msgstr "överväg endast taggar som motsvarar <mönster>"
+
+#: builtin/describe.c:416 builtin/name-rev.c:238
+msgid "show abbreviated commit object as fallback"
+msgstr "visa förkortade incheckningsobjekt som standard"
+
+#: builtin/describe.c:417
+msgid "mark"
+msgstr "märke"
+
+#: builtin/describe.c:418
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
+
 #: builtin/describe.c:436
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long är inkompatibel med --abbrev=0"
@@ -2908,110 +4016,230 @@
 msgid "--dirty is incompatible with committishes"
 msgstr "--dirty är inkompatibelt med \"committish\"-värden"
 
-#: builtin/diff.c:77
+#: builtin/diff.c:79
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "\"%s\": inte en normal fil eller symbolisk länk"
 
-#: builtin/diff.c:220
+#: builtin/diff.c:224
 #, c-format
 msgid "invalid option: %s"
 msgstr "ogiltig flagga: %s"
 
-#: builtin/diff.c:297
+#: builtin/diff.c:301
 msgid "Not a git repository"
 msgstr "Inte ett git-arkiv"
 
-#: builtin/diff.c:341
+#: builtin/diff.c:344
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "objektet \"%s\" som angavs är felaktigt."
 
-#: builtin/diff.c:346
+#: builtin/diff.c:349
 #, c-format
 msgid "more than %d trees given: '%s'"
 msgstr "mer än %d träd angavs: \"%s\""
 
-#: builtin/diff.c:356
+#: builtin/diff.c:359
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "mer än två blobbar angavs: \"%s\""
 
-#: builtin/diff.c:364
+#: builtin/diff.c:367
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "ej hanterat objekt \"%s\" angavs."
 
-#: builtin/fetch.c:200
+#: builtin/fast-export.c:22
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [rev-list-flaggor]"
+
+#: builtin/fast-export.c:635
+msgid "show progress after <n> objects"
+msgstr "visa förlopp efter <n> objekt"
+
+#: builtin/fast-export.c:637
+msgid "select handling of signed tags"
+msgstr "välj hantering av signerade taggar"
+
+#: builtin/fast-export.c:640
+msgid "select handling of tags that tag filtered objects"
+msgstr "välj hantering av taggar som har taggfiltrerade objekt"
+
+#: builtin/fast-export.c:643
+msgid "Dump marks to this file"
+msgstr "Dump märken till filen"
+
+#: builtin/fast-export.c:645
+msgid "Import marks from this file"
+msgstr "Importera märken från filen"
+
+#: builtin/fast-export.c:647
+msgid "Fake a tagger when tags lack one"
+msgstr "Fejka taggare när taggen saknar en"
+
+#: builtin/fast-export.c:649
+msgid "Output full tree for each commit"
+msgstr "Skriv ut hela trädet för varje incheckning"
+
+#: builtin/fast-export.c:651
+msgid "Use the done feature to terminate the stream"
+msgstr "Använd done-funktionen för att avsluta strömmen"
+
+#: builtin/fast-export.c:652
+msgid "Skip output of blob data"
+msgstr "Hoppa över skrivning av blob-data"
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [<flaggor>] [<arkiv> [<refspec>...]]"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<flaggor>] <grupp>"
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<flaggor>] [(<arkiv> | <grupp>)...]"
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<flaggor>]"
+
+#: builtin/fetch.c:60
+msgid "fetch from all remotes"
+msgstr "hämta från alla fjärrar"
+
+#: builtin/fetch.c:62
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr "lägg till i .git/FETCH_HEAD istället för att skriva över"
+
+#: builtin/fetch.c:64
+msgid "path to upload pack on remote end"
+msgstr "sökväg till upload pack på fjärren"
+
+#: builtin/fetch.c:65
+msgid "force overwrite of local branch"
+msgstr "tvinga överskrivning av lokal gren"
+
+#: builtin/fetch.c:67
+msgid "fetch from multiple remotes"
+msgstr "hämta från flera fjärrar"
+
+#: builtin/fetch.c:69
+msgid "fetch all tags and associated objects"
+msgstr "hämta alla taggar och associerade objekt"
+
+#: builtin/fetch.c:71
+msgid "do not fetch all tags (--no-tags)"
+msgstr "hämta inte alla taggar (--no-tags)"
+
+#: builtin/fetch.c:73
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "rensa fjärrspårande grenar ej längre på fjärren"
+
+#: builtin/fetch.c:74
+msgid "on-demand"
+msgstr "on-demand"
+
+#: builtin/fetch.c:75
+msgid "control recursive fetching of submodules"
+msgstr "styr rekursiv hämtning av undermoduler"
+
+#: builtin/fetch.c:79
+msgid "keep downloaded pack"
+msgstr "behåll hämtade paket"
+
+#: builtin/fetch.c:81
+msgid "allow updating of HEAD ref"
+msgstr "tillåt uppdatering av HEAD-referens"
+
+#: builtin/fetch.c:84
+msgid "deepen history of shallow clone"
+msgstr "fördjupa historik för grund klon"
+
+#: builtin/fetch.c:85 builtin/log.c:1083
+msgid "dir"
+msgstr "kat"
+
+#: builtin/fetch.c:86
+msgid "prepend this to submodule path output"
+msgstr "lägg till i början av undermodulens sökvägsutdata"
+
+#: builtin/fetch.c:89
+msgid "default mode for recursion"
+msgstr "standardläge för rekursion"
+
+#: builtin/fetch.c:201
 msgid "Couldn't find remote ref HEAD"
 msgstr "Kunde inte hitta fjärr-referensen HEAD"
 
-#: builtin/fetch.c:253
+#: builtin/fetch.c:254
 #, c-format
 msgid "object %s not found"
 msgstr "objektet %s hittades inte"
 
-#: builtin/fetch.c:259
+#: builtin/fetch.c:260
 msgid "[up to date]"
 msgstr "[àjour]"
 
-#: builtin/fetch.c:273
+#: builtin/fetch.c:274
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (kan inte hämta i aktuell gren)"
 
-#: builtin/fetch.c:274 builtin/fetch.c:360
+#: builtin/fetch.c:275 builtin/fetch.c:361
 msgid "[rejected]"
 msgstr "[refuserad]"
 
-#: builtin/fetch.c:285
+#: builtin/fetch.c:286
 msgid "[tag update]"
 msgstr "[uppdaterad tagg]"
 
-#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340
+#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341
 msgid "  (unable to update local ref)"
 msgstr "  (kunde inte uppdatera lokal ref)"
 
-#: builtin/fetch.c:305
+#: builtin/fetch.c:306
 msgid "[new tag]"
 msgstr "[ny tagg]"
 
-#: builtin/fetch.c:308
+#: builtin/fetch.c:309
 msgid "[new branch]"
 msgstr "[ny gren]"
 
-#: builtin/fetch.c:311
+#: builtin/fetch.c:312
 msgid "[new ref]"
 msgstr "[ny ref]"
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "unable to update local ref"
 msgstr "kunde inte uppdatera lokal ref"
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "forced update"
 msgstr "tvingad uppdatering"
 
-#: builtin/fetch.c:362
+#: builtin/fetch.c:363
 msgid "(non-fast-forward)"
 msgstr "(ej snabbspolad)"
 
-#: builtin/fetch.c:393 builtin/fetch.c:685
+#: builtin/fetch.c:394 builtin/fetch.c:686
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "kan inte öppna %s: %s\n"
 
-#: builtin/fetch.c:402
+#: builtin/fetch.c:403
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s sände inte alla nödvändiga objekt\n"
 
-#: builtin/fetch.c:488
+#: builtin/fetch.c:489
 #, c-format
 msgid "From %.*s\n"
 msgstr "Från %.*s\n"
 
-#: builtin/fetch.c:499
+#: builtin/fetch.c:500
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -3020,55 +4248,55 @@
 "vissa lokala referenser kunde inte uppdateras; testa att köra\n"
 " \"git remote prune %s\" för att ta bort gamla grenar som står i konflikt"
 
-#: builtin/fetch.c:549
+#: builtin/fetch.c:550
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s kommer bli dinglande)"
 
-#: builtin/fetch.c:550
+#: builtin/fetch.c:551
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s har blivit dinglande)"
 
-#: builtin/fetch.c:557
+#: builtin/fetch.c:558
 msgid "[deleted]"
 msgstr "[borttagen]"
 
-#: builtin/fetch.c:558 builtin/remote.c:1055
+#: builtin/fetch.c:559 builtin/remote.c:1055
 msgid "(none)"
 msgstr "(ingen)"
 
-#: builtin/fetch.c:675
+#: builtin/fetch.c:676
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv"
 
-#: builtin/fetch.c:709
+#: builtin/fetch.c:710
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "Vet inte hur man hämtar från %s"
 
-#: builtin/fetch.c:786
+#: builtin/fetch.c:787
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s"
 
-#: builtin/fetch.c:789
+#: builtin/fetch.c:790
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "Flaggan \"%s\" ignoreras för %s\n"
 
-#: builtin/fetch.c:888
+#: builtin/fetch.c:892
 #, c-format
 msgid "Fetching %s\n"
 msgstr "Hämtar %s\n"
 
-#: builtin/fetch.c:890 builtin/remote.c:100
+#: builtin/fetch.c:894 builtin/remote.c:100
 #, c-format
 msgid "Could not fetch %s"
 msgstr "Kunde inte hämta %s"
 
-#: builtin/fetch.c:907
+#: builtin/fetch.c:913
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
@@ -3076,27 +4304,146 @@
 "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n"
 "fjärrarkiv som nya incheckningar skall hämtas från."
 
-#: builtin/fetch.c:927
+#: builtin/fetch.c:933
 msgid "You need to specify a tag name."
 msgstr "Du måste ange namnet på en tagg."
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:985
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all tar inte namnet på ett arkiv som argument"
 
-#: builtin/fetch.c:981
+#: builtin/fetch.c:987
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all kan inte anges med referensspecifikationer"
 
-#: builtin/fetch.c:992
+#: builtin/fetch.c:998
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "Fjärren eller fjärrgruppen finns inte: %s"
 
-#: builtin/fetch.c:1000
+#: builtin/fetch.c:1006
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "Kan inte hämta från grupp och ange referensspecifikationer"
 
+#: builtin/fmt-merge-msg.c:13
+msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
+msgstr ""
+"git fmt-merge-msg [-m <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]"
+
+#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786
+#: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192
+#: builtin/tag.c:448 parse-options.h:133 parse-options.h:235
+msgid "n"
+msgstr "n"
+
+#: builtin/fmt-merge-msg.c:654
+msgid "populate log with at most <n> entries from shortlog"
+msgstr "fyll i loggen med som mest <n> poster från shortlog"
+
+#: builtin/fmt-merge-msg.c:657
+msgid "alias for --log (deprecated)"
+msgstr "alias för --log (avråds)"
+
+#: builtin/fmt-merge-msg.c:660
+msgid "text"
+msgstr "text"
+
+#: builtin/fmt-merge-msg.c:661
+msgid "use <text> as start of message"
+msgstr "inled meddelande med <text>"
+
+#: builtin/fmt-merge-msg.c:662
+msgid "file to read from"
+msgstr "fil att läsa från"
+
+#: builtin/for-each-ref.c:979
+msgid "git for-each-ref [options] [<pattern>]"
+msgstr "git for-each-ref [flaggor] [<mönster>]"
+
+#: builtin/for-each-ref.c:994
+msgid "quote placeholders suitably for shells"
+msgstr "citera platshållare passande för skal"
+
+#: builtin/for-each-ref.c:996
+msgid "quote placeholders suitably for perl"
+msgstr "citera platshållare passande för perl"
+
+#: builtin/for-each-ref.c:998
+msgid "quote placeholders suitably for python"
+msgstr "citera platshållare passande för python"
+
+#: builtin/for-each-ref.c:1000
+msgid "quote placeholders suitably for tcl"
+msgstr "citera platshållare passande för tcl"
+
+#: builtin/for-each-ref.c:1003
+msgid "show only <n> matched refs"
+msgstr "visa endast <n> träffade refs"
+
+#: builtin/for-each-ref.c:1004
+msgid "format"
+msgstr "format"
+
+#: builtin/for-each-ref.c:1004
+msgid "format to use for the output"
+msgstr "format att använda för utdata"
+
+#: builtin/for-each-ref.c:1005
+msgid "key"
+msgstr "nyckel"
+
+#: builtin/for-each-ref.c:1006
+msgid "field name to sort on"
+msgstr "fältnamn att sortera på"
+
+#: builtin/fsck.c:608
+msgid "git fsck [options] [<object>...]"
+msgstr "git fsck [flaggor] [<objekt>...]"
+
+#: builtin/fsck.c:614
+msgid "show unreachable objects"
+msgstr "visa onåbara objekt"
+
+#: builtin/fsck.c:615
+msgid "show dangling objects"
+msgstr "visa dinglande objekt"
+
+#: builtin/fsck.c:616
+msgid "report tags"
+msgstr "rapportera taggar"
+
+#: builtin/fsck.c:617
+msgid "report root nodes"
+msgstr "rapportera rotnoder"
+
+#: builtin/fsck.c:618
+msgid "make index objects head nodes"
+msgstr "gör indexojekt till huvudnoder"
+
+#: builtin/fsck.c:619
+msgid "make reflogs head nodes (default)"
+msgstr "gör refloggar till huvudnoder (standard)"
+
+#: builtin/fsck.c:620
+msgid "also consider packs and alternate objects"
+msgstr "ta även hänsyn till paket och alternativa objekt"
+
+#: builtin/fsck.c:621
+msgid "enable more strict checking"
+msgstr "aktivera striktare kontroll"
+
+#: builtin/fsck.c:623
+msgid "write dangling objects in .git/lost-found"
+msgstr "skriv dinglande objekt i .git/lost-found"
+
+#: builtin/fsck.c:624 builtin/prune.c:134
+msgid "show progress"
+msgstr "visa förlopp"
+
+#: builtin/gc.c:22
+msgid "git gc [options]"
+msgstr "git gc [flaggor]"
+
 #: builtin/gc.c:63
 #, c-format
 msgid "Invalid %s: '%s'"
@@ -3107,6 +4454,18 @@
 msgid "insanely long object directory %.*s"
 msgstr "tokigt lång objektkatalog %.*s"
 
+#: builtin/gc.c:179
+msgid "prune unreferenced objects"
+msgstr "rensa ej refererade objekt"
+
+#: builtin/gc.c:181
+msgid "be more thorough (increased runtime)"
+msgstr "var mer grundlig (ökar körtiden)"
+
+#: builtin/gc.c:182
+msgid "enable auto-gc mode"
+msgstr "aktivera auto-gc-läge"
+
 #: builtin/gc.c:221
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
@@ -3128,65 +4487,290 @@
 "Det finns för många onåbara lösa objekt; kör \"git prune\" för att ta bort "
 "dem."
 
+#: builtin/grep.c:22
+msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [flaggor] [-e] <mönster> [<rev>...] [[--] <sökväg>...]"
+
 #: builtin/grep.c:216
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: misslyckades skapa tråd. %s"
 
-#: builtin/grep.c:402
+#: builtin/grep.c:454
 #, c-format
 msgid "Failed to chdir: %s"
 msgstr "Kunde inte byta katalog (chdir): %s"
 
-#: builtin/grep.c:478 builtin/grep.c:512
+#: builtin/grep.c:530 builtin/grep.c:564
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "kunde inte läsa träd (%s)"
 
-#: builtin/grep.c:526
+#: builtin/grep.c:578
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "Kunde inte \"grep\" från objekt av typen %s"
 
-#: builtin/grep.c:584
+#: builtin/grep.c:636
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "flaggan \"%c\" antar ett numeriskt värde"
 
-#: builtin/grep.c:601
+#: builtin/grep.c:653
 #, c-format
 msgid "cannot open '%s'"
 msgstr "kan inte öppna \"%s\""
 
-#: builtin/grep.c:885
+#: builtin/grep.c:728
+msgid "search in index instead of in the work tree"
+msgstr "sök i indexet istället för i arbetskatalogen"
+
+#: builtin/grep.c:730
+msgid "find in contents not managed by git"
+msgstr "sök i innehål som inte hanteras av git"
+
+#: builtin/grep.c:732
+msgid "search in both tracked and untracked files"
+msgstr "sök i både spårade och ospårade filer"
+
+#: builtin/grep.c:734
+msgid "search also in ignored files"
+msgstr "sök även i ignorerade filer"
+
+#: builtin/grep.c:737
+msgid "show non-matching lines"
+msgstr "vis rader som inte träffas"
+
+#: builtin/grep.c:739
+msgid "case insensitive matching"
+msgstr "skiftlägesokänslig sökning"
+
+#: builtin/grep.c:741
+msgid "match patterns only at word boundaries"
+msgstr "matcha endast mönster vid ordgränser"
+
+#: builtin/grep.c:743
+msgid "process binary files as text"
+msgstr "hantera binärfiler som text"
+
+#: builtin/grep.c:745
+msgid "don't match patterns in binary files"
+msgstr "träffa inte mönster i binärfiler"
+
+#: builtin/grep.c:748
+msgid "descend at most <depth> levels"
+msgstr "gå som mest ned <djup> nivåer"
+
+#: builtin/grep.c:752
+msgid "use extended POSIX regular expressions"
+msgstr "använd utökade POSIX-reguljära uttryck"
+
+#: builtin/grep.c:755
+msgid "use basic POSIX regular expressions (default)"
+msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
+
+#: builtin/grep.c:758
+msgid "interpret patterns as fixed strings"
+msgstr "tolka mönster som fixerade strängar"
+
+#: builtin/grep.c:761
+msgid "use Perl-compatible regular expressions"
+msgstr "använd Perlkompatibla reguljära uttryck"
+
+#: builtin/grep.c:764
+msgid "show line numbers"
+msgstr "visa radnummer"
+
+#: builtin/grep.c:765
+msgid "don't show filenames"
+msgstr "visa inte filnamn"
+
+# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e.
+#: builtin/grep.c:766
+msgid "show filenames"
+msgstr "visa filnamn"
+
+#: builtin/grep.c:768
+msgid "show filenames relative to top directory"
+msgstr "visa filnamn relativa till toppkatalogen"
+
+#: builtin/grep.c:770
+msgid "show only filenames instead of matching lines"
+msgstr "visa endast filnamn istället för träffade rader"
+
+#: builtin/grep.c:772
+msgid "synonym for --files-with-matches"
+msgstr "synonym för --files-with-matches"
+
+#: builtin/grep.c:775
+msgid "show only the names of files without match"
+msgstr "visa endast namn på filer utan träffar"
+
+#: builtin/grep.c:777
+msgid "print NUL after filenames"
+msgstr "skriv NUL efter filnamn"
+
+#: builtin/grep.c:779
+msgid "show the number of matches instead of matching lines"
+msgstr "visa antal träffar istället för träffade rader"
+
+#: builtin/grep.c:780
+msgid "highlight matches"
+msgstr "ljusmarkera träffar"
+
+#: builtin/grep.c:782
+msgid "print empty line between matches from different files"
+msgstr "skriv tomma rader mellan träffar från olika filer"
+
+#: builtin/grep.c:784
+msgid "show filename only once above matches from same file"
+msgstr "visa filnamn endast en gång ovanför träffar från samma fil"
+
+#: builtin/grep.c:787
+msgid "show <n> context lines before and after matches"
+msgstr "visa <n> rader sammanhang före och efter träffar"
+
+#: builtin/grep.c:790
+msgid "show <n> context lines before matches"
+msgstr "visa <n> rader sammanhang före träffar"
+
+#: builtin/grep.c:792
+msgid "show <n> context lines after matches"
+msgstr "visa <n> rader sammanhang efter träffar"
+
+#: builtin/grep.c:793
+msgid "shortcut for -C NUM"
+msgstr "genväg för -C NUM"
+
+#: builtin/grep.c:796
+msgid "show a line with the function name before matches"
+msgstr "visa en rad med funktionsnamnet före träffen"
+
+#: builtin/grep.c:798
+msgid "show the surrounding function"
+msgstr "visa den omkringliggande funktionen"
+
+#: builtin/grep.c:801
+msgid "read patterns from file"
+msgstr "läs mönster från fil"
+
+#: builtin/grep.c:803
+msgid "match <pattern>"
+msgstr "träffa <mönster>"
+
+#: builtin/grep.c:805
+msgid "combine patterns specified with -e"
+msgstr "kombinera mönster som anges med -e"
+
+#: builtin/grep.c:817
+msgid "indicate hit with exit status without output"
+msgstr "ange träff med slutstatuskod utan utdata"
+
+#: builtin/grep.c:819
+msgid "show only matches from files that match all patterns"
+msgstr "visa endast träffar från filer som träffar alla mönster"
+
+#: builtin/grep.c:822
+msgid "pager"
+msgstr "bläddrare"
+
+#: builtin/grep.c:822
+msgid "show matching files in the pager"
+msgstr "visa träffade filer i filbläddraren"
+
+#: builtin/grep.c:825
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
+
+#: builtin/grep.c:826 builtin/show-ref.c:201
+msgid "show usage"
+msgstr "visa användning"
+
+#: builtin/grep.c:917
 msgid "no pattern given."
 msgstr "inget mönster angavs."
 
-#: builtin/grep.c:899
+#: builtin/grep.c:931
 #, c-format
 msgid "bad object %s"
 msgstr "felaktigt objekt %s"
 
-#: builtin/grep.c:940
+#: builtin/grep.c:972
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
 
-#: builtin/grep.c:963
+#: builtin/grep.c:995
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached och --untracked kan inte användas med --no-index."
 
-#: builtin/grep.c:968
+#: builtin/grep.c:1000
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index och --untracked kan inte användas med revisioner."
 
-#: builtin/grep.c:971
+#: builtin/grep.c:1003
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard kan inte användas för spårat innehåll."
 
-#: builtin/grep.c:979
+#: builtin/grep.c:1011
 msgid "both --cached and trees are given."
 msgstr "både --cached och träd angavs."
 
+#: builtin/hash-object.c:60
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
+"<file>..."
+msgstr ""
+"git hash-object [-t <typ>] [-w] [--path=<fil>|--no-filters] [--stdin] [--] "
+"<fil>..."
+
+#: builtin/hash-object.c:61
+msgid "git hash-object  --stdin-paths < <list-of-paths>"
+msgstr "git hash-object  --stdin-paths < <sökvägslista>"
+
+#: builtin/hash-object.c:72
+msgid "type"
+msgstr "typ"
+
+#: builtin/hash-object.c:72
+msgid "object type"
+msgstr "objekttyp"
+
+#: builtin/hash-object.c:73
+msgid "write the object into the object database"
+msgstr "skriv objektet till objektdatabasen"
+
+#: builtin/hash-object.c:74
+msgid "read the object from stdin"
+msgstr "läs objektet från standard in"
+
+#: builtin/hash-object.c:76
+msgid "store file as is without filters"
+msgstr "spara filen som den är utan filer"
+
+#: builtin/hash-object.c:77
+msgid "process file as it were from this path"
+msgstr "hantera filen som om den kom från sökvägen"
+
+#: builtin/help.c:43
+msgid "print all available commands"
+msgstr "visa alla tillgängliga kommandon"
+
+#: builtin/help.c:44
+msgid "show man page"
+msgstr "visa manualsida"
+
+#: builtin/help.c:45
+msgid "show manual in web browser"
+msgstr "visa manual i webbläsare"
+
+#: builtin/help.c:47
+msgid "show info page"
+msgstr "visa info-sida"
+
+#: builtin/help.c:53
+msgid "git help [--all] [--man|--web|--info] [command]"
+msgstr "git help [--all] [--man|--web|--info] [kommando]"
+
 #: builtin/help.c:65
 #, c-format
 msgid "unrecognized help format '%s'"
@@ -3301,6 +4885,11 @@
 msgid "pack signature mismatch"
 msgstr "paketsignatur stämmer inte överens"
 
+#: builtin/index-pack.c:294
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "paketversion %<PRIu32> stöds ej"
+
 #: builtin/index-pack.c:312
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
@@ -3381,7 +4970,7 @@
 
 #: builtin/index-pack.c:986
 msgid "Receiving objects"
-msgstr "Tar bort objekt"
+msgstr "Tar emot objekt"
 
 #: builtin/index-pack.c:986
 msgid "Indexing objects"
@@ -3407,93 +4996,123 @@
 msgid "Resolving deltas"
 msgstr "Analyserar delta"
 
-#: builtin/index-pack.c:1105
+#: builtin/index-pack.c:1064
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "kunde inte skapa tråd: %s"
+
+#: builtin/index-pack.c:1106
 msgid "confusion beyond insanity"
 msgstr "förvirrad bortom vanvett"
 
-#: builtin/index-pack.c:1124
+#: builtin/index-pack.c:1112
+#, c-format
+msgid "completed with %d local objects"
+msgstr "slutfördes med %d lokala objekt"
+
+#: builtin/index-pack.c:1121
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr "Oväntad svanschecksumma för %s (trasig disk?)"
+
+#: builtin/index-pack.c:1125
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "paketet har %d oanalyserat delta"
 msgstr[1] "paketet har %d oanalyserade delta"
 
-#: builtin/index-pack.c:1149
+#: builtin/index-pack.c:1150
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "kunde inte utföra \"deflate\" på tillagt objekt (%d)"
 
-#: builtin/index-pack.c:1228
+#: builtin/index-pack.c:1229
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "lokalt objekt %s är trasigt"
 
-#: builtin/index-pack.c:1252
+#: builtin/index-pack.c:1253
 msgid "error while closing pack file"
 msgstr "fel vid stängning av paketfil"
 
-#: builtin/index-pack.c:1265
+#: builtin/index-pack.c:1266
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "kan inte ta skriva \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1273
+#: builtin/index-pack.c:1274
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "akn inte stänga skriven \"keep\"-fil \"%s\""
 
-#: builtin/index-pack.c:1286
+#: builtin/index-pack.c:1287
 msgid "cannot store pack file"
 msgstr "kan inte spara paketfil"
 
-#: builtin/index-pack.c:1297
+#: builtin/index-pack.c:1298
 msgid "cannot store index file"
 msgstr "kan inte spara indexfil"
 
-#: builtin/index-pack.c:1398
+#: builtin/index-pack.c:1331
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "felaktig pack.indexversion=%<PRIu32>"
+
+#: builtin/index-pack.c:1337
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "felaktigt antal trådar angivet (%d)"
+
+#: builtin/index-pack.c:1341 builtin/index-pack.c:1514
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "trådstöd saknas, ignorerar %s"
+
+#: builtin/index-pack.c:1399
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "Kan inte öppna befintlig paketfil \"%s\""
 
-#: builtin/index-pack.c:1400
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "Kan inte öppna befintligt paket-idx-fil för \"%s\""
 
-#: builtin/index-pack.c:1447
+#: builtin/index-pack.c:1448
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "icke-delta: %d objekt"
 msgstr[1] "icke-delta: %d objekt"
 
-#: builtin/index-pack.c:1454
+#: builtin/index-pack.c:1455
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "kedjelängd = %d: %lu objekt"
 msgstr[1] "kedjelängd = %d: %lu objekt"
 
-#: builtin/index-pack.c:1481
+#: builtin/index-pack.c:1482
 msgid "Cannot come back to cwd"
 msgstr "Kan inte gå tillbaka till arbetskatalogen (cwd)"
 
-#: builtin/index-pack.c:1525 builtin/index-pack.c:1528
-#: builtin/index-pack.c:1540 builtin/index-pack.c:1544
+#: builtin/index-pack.c:1526 builtin/index-pack.c:1529
+#: builtin/index-pack.c:1541 builtin/index-pack.c:1545
 #, c-format
 msgid "bad %s"
 msgstr "felaktig %s"
 
-#: builtin/index-pack.c:1558
+#: builtin/index-pack.c:1559
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin kan inte användas med --stdin"
 
-#: builtin/index-pack.c:1562 builtin/index-pack.c:1572
+#: builtin/index-pack.c:1563 builtin/index-pack.c:1573
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "paketfilnamnet \"%s\" slutar inte med \".pack\""
 
-#: builtin/index-pack.c:1581
+#: builtin/index-pack.c:1582
 msgid "--verify with no packfile name given"
 msgstr "--verify angavs utan paketfilnamn"
 
@@ -3613,6 +5232,26 @@
 msgid "cannot tell cwd"
 msgstr "kan inte läsa aktuell katalog (cwd)"
 
+#: builtin/init-db.c:467
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
+"[=<permissions>]] [directory]"
+msgstr ""
+"git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--shared"
+"[=<behörigheter>]] [katalog]"
+
+#: builtin/init-db.c:490
+msgid "permissions"
+msgstr "behörigheter"
+
+#: builtin/init-db.c:491
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr "ange att git-arkivet skall delas bland flera användare"
+
+#: builtin/init-db.c:493 builtin/prune-packed.c:77
+msgid "be quiet"
+msgstr "var tyst"
+
 #: builtin/init-db.c:522 builtin/init-db.c:529
 #, c-format
 msgid "cannot mkdir %s"
@@ -3641,6 +5280,26 @@
 msgid "Cannot access work tree '%s'"
 msgstr "Kan inte komma åt arbetskatalogen \"%s\""
 
+#: builtin/log.c:37
+msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n"
+msgstr "git log [<flaggor>] [<sedan>..<till>] [[--] <sökväg>...]\n"
+
+#: builtin/log.c:38
+msgid "   or: git show [options] <object>..."
+msgstr "     eller: git show [flaggor] <objekt>..."
+
+#: builtin/log.c:100
+msgid "suppress diff output"
+msgstr "undertryck diff-utdata"
+
+#: builtin/log.c:101
+msgid "show source"
+msgstr "visa källkod"
+
+#: builtin/log.c:102
+msgid "decorate options"
+msgstr "dekoreringsflaggor"
+
 #: builtin/log.c:189
 #, c-format
 msgid "Final output: %d %s\n"
@@ -3677,68 +5336,332 @@
 msgid "Not a range."
 msgstr "Inte ett intervall."
 
-#: builtin/log.c:792
+#: builtin/log.c:789
 msgid "Cover letter needs email format"
 msgstr "Omslagsbrevet behöver e-postformat"
 
-#: builtin/log.c:865
+#: builtin/log.c:862
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "tokigt in-reply-to: %s"
 
-#: builtin/log.c:938
+#: builtin/log.c:890
+msgid "git format-patch [options] [<since> | <revision range>]"
+msgstr "git format-patch [flaggor] [<sedan> | <revisionsintervall>]"
+
+#: builtin/log.c:935
 msgid "Two output directories?"
 msgstr "Två utdatakataloger?"
 
-#: builtin/log.c:1160
+#: builtin/log.c:1063
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "använd [PATCH n/m] även för en ensam patch"
+
+#: builtin/log.c:1066
+msgid "use [PATCH] even with multiple patches"
+msgstr "använd [PATCH] även för flera patchar"
+
+#: builtin/log.c:1070
+msgid "print patches to standard out"
+msgstr "skriv patcharna på stnadard ut"
+
+#: builtin/log.c:1072
+msgid "generate a cover letter"
+msgstr "generera ett följebrev"
+
+#: builtin/log.c:1074
+msgid "use simple number sequence for output file names"
+msgstr "använd enkel nummersekvens för utdatafilnamn"
+
+#: builtin/log.c:1075
+msgid "sfx"
+msgstr "sfx"
+
+#: builtin/log.c:1076
+msgid "use <sfx> instead of '.patch'"
+msgstr "använd <sfx> istället för \".patch\""
+
+#: builtin/log.c:1078
+msgid "start numbering patches at <n> instead of 1"
+msgstr "börja numrera patchar på <n> istället för 1"
+
+#: builtin/log.c:1080
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "Använd [<prefix>] istället för [PATCH]"
+
+#: builtin/log.c:1083
+msgid "store resulting files in <dir>"
+msgstr "spara filerna i <katalog>"
+
+#: builtin/log.c:1086
+msgid "don't strip/add [PATCH]"
+msgstr "ta inte bort eller lägg till [PATCH]"
+
+#: builtin/log.c:1089
+msgid "don't output binary diffs"
+msgstr "skriv inte binära diffar"
+
+#: builtin/log.c:1091
+msgid "don't include a patch matching a commit upstream"
+msgstr "ta inte med patchar som motsvarar en uppströmsincheckning"
+
+#: builtin/log.c:1093
+msgid "show patch format instead of default (patch + stat)"
+msgstr "visa patchformat istället för standard (patch + stat)"
+
+#: builtin/log.c:1095
+msgid "Messaging"
+msgstr "E-post"
+
+#: builtin/log.c:1096
+msgid "header"
+msgstr "huvud"
+
+#: builtin/log.c:1097
+msgid "add email header"
+msgstr "lägg till e-posthuvud"
+
+#: builtin/log.c:1098 builtin/log.c:1100
+msgid "email"
+msgstr "epost"
+
+#: builtin/log.c:1098
+msgid "add To: header"
+msgstr "Lägg till mottagarhuvud (\"To:\")"
+
+#: builtin/log.c:1100
+msgid "add Cc: header"
+msgstr "Lägg till kopiehuvud (\"Cc:\")"
+
+#: builtin/log.c:1102
+msgid "message-id"
+msgstr "meddelande-id"
+
+#: builtin/log.c:1103
+msgid "make first mail a reply to <message-id>"
+msgstr "Gör det första brevet ett svar till <meddelande-id>"
+
+#: builtin/log.c:1104 builtin/log.c:1107
+msgid "boundary"
+msgstr "gräns"
+
+#: builtin/log.c:1105
+msgid "attach the patch"
+msgstr "bifoga patchen"
+
+#: builtin/log.c:1108
+msgid "inline the patch"
+msgstr "gör patchen ett inline-objekt"
+
+#: builtin/log.c:1112
+msgid "enable message threading, styles: shallow, deep"
+msgstr "aktivera brevtrådning, typer: shallow, deep"
+
+#: builtin/log.c:1114
+msgid "signature"
+msgstr "signatur"
+
+#: builtin/log.c:1115
+msgid "add a signature"
+msgstr "lägg till signatur"
+
+#: builtin/log.c:1117
+msgid "don't print the patch filenames"
+msgstr "visa inte filnamn för patchar"
+
+#: builtin/log.c:1157
 #, c-format
 msgid "bogus committer info %s"
 msgstr "felaktig incheckarinformation %s"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1202
 msgid "-n and -k are mutually exclusive."
 msgstr "-n och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1207
+#: builtin/log.c:1204
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix och -k kan inte användas samtidigt."
 
-#: builtin/log.c:1215
+#: builtin/log.c:1212
 msgid "--name-only does not make sense"
 msgstr "kan inte använda --name-only"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1214
 msgid "--name-status does not make sense"
 msgstr "kan inte använda --name-status"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1216
 msgid "--check does not make sense"
 msgstr "kan inte använda --check"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1239
 msgid "standard output, or directory, which one?"
 msgstr "standard ut, eller katalog, vilken skall det vara?"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1241
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Kunde inte skapa katalogen \"%s\""
 
-#: builtin/log.c:1397
+#: builtin/log.c:1394
 msgid "Failed to create output files"
 msgstr "Misslyckades skapa utdatafiler"
 
-#: builtin/log.c:1501
+#: builtin/log.c:1443
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<uppström> [<huvud> [<gräns>]]]"
+
+#: builtin/log.c:1498
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n"
 
-#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531
+#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Okänd incheckning %s"
 
+#: builtin/ls-files.c:408
+msgid "git ls-files [options] [<file>...]"
+msgstr "git ls-files [flaggor] [<fil>...]"
+
+#: builtin/ls-files.c:463
+msgid "identify the file status with tags"
+msgstr "identifiera filstatus med taggar"
+
+#: builtin/ls-files.c:465
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
+
+#: builtin/ls-files.c:467
+msgid "show cached files in the output (default)"
+msgstr "visa cachade filer i utdata (standard)"
+
+#: builtin/ls-files.c:469
+msgid "show deleted files in the output"
+msgstr "visa borttagna filer i utdata"
+
+#: builtin/ls-files.c:471
+msgid "show modified files in the output"
+msgstr "visa modifierade filer i utdata"
+
+#: builtin/ls-files.c:473
+msgid "show other files in the output"
+msgstr "visa andra filer i utdata"
+
+#: builtin/ls-files.c:475
+msgid "show ignored files in the output"
+msgstr "visa ignorerade filer i utdata"
+
+#: builtin/ls-files.c:478
+msgid "show staged contents' object name in the output"
+msgstr "visa köat innehålls objektnamn i utdata"
+
+#: builtin/ls-files.c:480
+msgid "show files on the filesystem that need to be removed"
+msgstr "visa filer i filsystemet som behöver tas bort"
+
+#: builtin/ls-files.c:482
+msgid "show 'other' directories' name only"
+msgstr "visa endast namn för \"andra\" kataloger"
+
+#: builtin/ls-files.c:485
+msgid "don't show empty directories"
+msgstr "visa inte tomma kataloger"
+
+#: builtin/ls-files.c:488
+msgid "show unmerged files in the output"
+msgstr "visa ej sammanslagna filer i utdata"
+
+#: builtin/ls-files.c:490
+msgid "show resolve-undo information"
+msgstr "visa \"resolve-undo\"-information"
+
+#: builtin/ls-files.c:492
+msgid "skip files matching pattern"
+msgstr "hoppa över filer som motsvarar mönster"
+
+#: builtin/ls-files.c:495
+msgid "exclude patterns are read from <file>"
+msgstr "exkludera mönster som läses från <fil>"
+
+#: builtin/ls-files.c:498
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
+
+#: builtin/ls-files.c:500
+msgid "add the standard git exclusions"
+msgstr "lägg till git:s standardexkluderingar"
+
+#: builtin/ls-files.c:503
+msgid "make the output relative to the project top directory"
+msgstr "gör utdata relativ till projektets toppkatalog"
+
+#: builtin/ls-files.c:506
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr "om en <fil> inte är indexet, betrakta det som ett fel"
+
+#: builtin/ls-files.c:507
+msgid "tree-ish"
+msgstr "träd-igt"
+
+#: builtin/ls-files.c:508
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr "låtsas att sökvägar borttagna sedan <träd-igt> fortfarande finns"
+
+#: builtin/ls-files.c:510
+msgid "show debugging data"
+msgstr "visa felsökningsutdata"
+
+#: builtin/ls-tree.c:27
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<flaggor>] <träd-igt> [<sökväg>...]"
+
+#: builtin/ls-tree.c:125
+msgid "only show trees"
+msgstr "visa endast träd"
+
+#: builtin/ls-tree.c:127
+msgid "recurse into subtrees"
+msgstr "rekursera ner i underträd"
+
+#: builtin/ls-tree.c:129
+msgid "show trees when recursing"
+msgstr "visa träd medan rekursering"
+
+#: builtin/ls-tree.c:132
+msgid "terminate entries with NUL byte"
+msgstr "terminera poster med NUL-byte"
+
+#: builtin/ls-tree.c:133
+msgid "include object size"
+msgstr "inkludera objektstorlek"
+
+#: builtin/ls-tree.c:135 builtin/ls-tree.c:137
+msgid "list only filenames"
+msgstr "visa endast filnamn"
+
+#: builtin/ls-tree.c:140
+msgid "use full path names"
+msgstr "använd fullständiga sökvägsnamn"
+
+#: builtin/ls-tree.c:142
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr "visa hela trädet; inte bara aktuell katalog (implicerar --full-name)"
+
+#: builtin/merge.c:43
+msgid "git merge [options] [<commit>...]"
+msgstr "git merge [flaggor] [<incheckning>...]"
+
+#: builtin/merge.c:44
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr "git merge [flaggor] <meddelande> HEAD <incheckning>"
+
+#: builtin/merge.c:45
+msgid "git merge --abort"
+msgstr "git merge --abort"
+
 #: builtin/merge.c:90
 msgid "switch `m' requires a value"
 msgstr "flaggan \"m\" behöver ett värde"
@@ -3758,6 +5681,67 @@
 msgid "Available custom strategies are:"
 msgstr "Tillgängliga skräddarsydda strategier är:"
 
+#: builtin/merge.c:183
+msgid "do not show a diffstat at the end of the merge"
+msgstr "visa inte en diffstat när sammanslagningen är färdig"
+
+#: builtin/merge.c:186
+msgid "show a diffstat at the end of the merge"
+msgstr "visa en diffstat när sammanslagningen är färdig"
+
+#: builtin/merge.c:187
+msgid "(synonym to --stat)"
+msgstr "(synonym till --stat)"
+
+#: builtin/merge.c:189
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr ""
+"lägg till (som mest <n>) poster från shortlog till incheckningsmeddelandet"
+
+#: builtin/merge.c:192
+msgid "create a single commit instead of doing a merge"
+msgstr "skapa en ensam incheckning istället för en sammanslagning"
+
+#: builtin/merge.c:194
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "utför en incheckning om sammanslagningen lyckades (standard)"
+
+#: builtin/merge.c:196
+msgid "edit message before committing"
+msgstr "redigera meddelande innan incheckning"
+
+#: builtin/merge.c:198
+msgid "allow fast-forward (default)"
+msgstr "tillåt snabbspolning (standard)"
+
+#: builtin/merge.c:200
+msgid "abort if fast-forward is not possible"
+msgstr "avbryt om snabbspolning inte är möjlig"
+
+#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112
+msgid "strategy"
+msgstr "strategi"
+
+#: builtin/merge.c:203
+msgid "merge strategy to use"
+msgstr "sammanslagninsstrategi att använda"
+
+#: builtin/merge.c:204
+msgid "option=value"
+msgstr "alternativ=värde"
+
+#: builtin/merge.c:205
+msgid "option for selected merge strategy"
+msgstr "alternativ för vald sammanslagningsstrategi"
+
+#: builtin/merge.c:207
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "incheckningsmeddelande för (icke snabbspolande) sammanslagning"
+
+#: builtin/merge.c:211
+msgid "abort the current in-progress merge"
+msgstr "avbryt den pågående sammanslagningen"
+
 #: builtin/merge.c:240
 msgid "could not run stash."
 msgstr "kunde köra stash."
@@ -3797,51 +5781,51 @@
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Inget sammanslagningsmeddelande -- uppdaterar inte HEAD\n"
 
-#: builtin/merge.c:437
+#: builtin/merge.c:436
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "\"%s\" verkar inte peka på en incheckning"
 
-#: builtin/merge.c:536
+#: builtin/merge.c:535
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
 
-#: builtin/merge.c:629
+#: builtin/merge.c:628
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree misslyckades skriva ett träd"
 
-#: builtin/merge.c:679
+#: builtin/merge.c:678
 msgid "failed to read the cache"
 msgstr "misslyckads läsa cachen"
 
-#: builtin/merge.c:710
+#: builtin/merge.c:709
 msgid "Not handling anything other than two heads merge."
 msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
 
-#: builtin/merge.c:724
+#: builtin/merge.c:723
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Felaktig flagga för merge-recursive: -X%s"
 
-#: builtin/merge.c:738
+#: builtin/merge.c:737
 #, c-format
 msgid "unable to write %s"
 msgstr "kunde inte skriva %s"
 
-#: builtin/merge.c:877
+#: builtin/merge.c:876
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Kunde inte läsa från \"%s\""
 
-#: builtin/merge.c:886
+#: builtin/merge.c:885
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr ""
 "Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra "
 "den.\n"
 
-#: builtin/merge.c:892
+#: builtin/merge.c:891
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
 "especially if it merges an updated upstream into a topic branch.\n"
@@ -3856,53 +5840,53 @@
 "Rader som inleds med \"#\" kommer ignoreras, och ett tomt meddelande\n"
 "avbryter incheckningen.\n"
 
-#: builtin/merge.c:916
+#: builtin/merge.c:915
 msgid "Empty commit message."
 msgstr "Tomt incheckningsmeddelande."
 
-#: builtin/merge.c:928
+#: builtin/merge.c:927
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Underbart.\n"
 
-#: builtin/merge.c:993
+#: builtin/merge.c:992
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr ""
 "Kunde inte slå ihop automatiskt; fixa konflikter och checka in resultatet.\n"
 
-#: builtin/merge.c:1009
+#: builtin/merge.c:1008
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "\"%s\" är inte en incheckning"
 
-#: builtin/merge.c:1050
+#: builtin/merge.c:1049
 msgid "No current branch."
 msgstr "Inte på någon gren."
 
-#: builtin/merge.c:1052
+#: builtin/merge.c:1051
 msgid "No remote for the current branch."
 msgstr "Ingen fjärr för aktuell gren."
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1053
 msgid "No default upstream defined for the current branch."
 msgstr "Ingen standarduppström angiven för aktuell gren."
 
-#: builtin/merge.c:1059
+#: builtin/merge.c:1058
 #, c-format
 msgid "No remote tracking branch for %s from %s"
 msgstr "Ingen fjärrspårande gren för %s från %s"
 
-#: builtin/merge.c:1146 builtin/merge.c:1303
+#: builtin/merge.c:1145 builtin/merge.c:1302
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - inte något vi kan slå ihop"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1213
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
 
-#: builtin/merge.c:1230 git-pull.sh:31
+#: builtin/merge.c:1229 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3910,11 +5894,11 @@
 "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
 "Checka in dina ändringar innan du kan slå ihop."
 
-#: builtin/merge.c:1233 git-pull.sh:34
+#: builtin/merge.c:1232 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
 
-#: builtin/merge.c:1237
+#: builtin/merge.c:1236
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3922,84 +5906,183 @@
 "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
 "Checka in dina ändringar innan du kan slå ihop."
 
-#: builtin/merge.c:1240
+#: builtin/merge.c:1239
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)."
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1248
 msgid "You cannot combine --squash with --no-ff."
 msgstr "Du kan inte kombinera --squash med --no-ff."
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1253
 msgid "You cannot combine --no-ff with --ff-only."
 msgstr "Du kan inte kombinera --no-ff med --ff-only."
 
-#: builtin/merge.c:1261
+#: builtin/merge.c:1260
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1292
 msgid "Can merge only exactly one commit into empty head"
 msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud."
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1295
 msgid "Squash commit into empty head not supported yet"
 msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
 
-#: builtin/merge.c:1298
+#: builtin/merge.c:1297
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud"
 
-#: builtin/merge.c:1413
+#: builtin/merge.c:1412
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Uppdaterar %s..%s\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
 
-#: builtin/merge.c:1458
+#: builtin/merge.c:1457
 #, c-format
 msgid "Nope.\n"
 msgstr "Nej.\n"
 
-#: builtin/merge.c:1490
+#: builtin/merge.c:1489
 msgid "Not possible to fast-forward, aborting."
 msgstr "Kan inte snabbspola, avbryter."
 
-#: builtin/merge.c:1513 builtin/merge.c:1592
+#: builtin/merge.c:1512 builtin/merge.c:1591
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Återspolar trädet till orört...\n"
 
-#: builtin/merge.c:1517
+#: builtin/merge.c:1516
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Försöker sammanslagninsstrategin %s...\n"
 
-#: builtin/merge.c:1583
+#: builtin/merge.c:1582
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
 
-#: builtin/merge.c:1585
+#: builtin/merge.c:1584
 #, c-format
 msgid "Merge with strategy %s failed.\n"
-msgstr "Sammanslaning med strategin %s misslyckades.\n"
+msgstr "Sammanslagning med strategin %s misslyckades.\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1593
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Använder %s för att förbereda lösning för hand.\n"
 
-#: builtin/merge.c:1606
+#: builtin/merge.c:1605
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr ""
 "Automatisk sammanslagning lyckades; stoppar före incheckning som önskat\n"
 
+#: builtin/merge-base.c:26
+msgid "git merge-base [-a|--all] <commit> <commit>..."
+msgstr "git merge-base [-a|--all] <incheckning> <incheckning>..."
+
+#: builtin/merge-base.c:27
+msgid "git merge-base [-a|--all] --octopus <commit>..."
+msgstr "git merge-base [-a|--all] --octopus <incheckning>..."
+
+#: builtin/merge-base.c:28
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <incheckning>..."
+
+#: builtin/merge-base.c:29
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <incheckning> <incheckning>"
+
+#: builtin/merge-base.c:98
+msgid "output all common ancestors"
+msgstr "skriv ut alla gemensamma anfäder"
+
+#: builtin/merge-base.c:99
+msgid "find ancestors for a single n-way merge"
+msgstr "hitta anfader för enkel n-vägssammanslagning"
+
+#: builtin/merge-base.c:100
+msgid "list revs not reachable from others"
+msgstr "visa revisioner som inte kan nås från andra"
+
+#: builtin/merge-base.c:102
+msgid "is the first one ancestor of the other?"
+msgstr "är den första anfader till den andra?"
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
+"file2"
+msgstr ""
+"git merge-file [alternativ] [-L namn1 [-L orig [-L namn2]]] fil1 origfil fil2"
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "sänd resultat till standard ut"
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr "använd diff3-baserad sammanslagning"
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr "för konflikter, använd vår version"
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr "för konflikter, använd deras version"
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr "för konflikter, använd en förenad version"
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr "för konflikter, använd denna markörstorlek"
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr "varna inte om konflikter"
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig_file/file2"
+msgstr "sätt etiketter för fil1/origfil/fil2"
+
+#: builtin/mktree.c:67
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr "git mktree [-z] [--missing] [--batch]"
+
+#: builtin/mktree.c:153
+msgid "input is NUL terminated"
+msgstr "indata är NUL-terminerad"
+
+#: builtin/mktree.c:154 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "tillåt saknade objekt"
+
+#: builtin/mktree.c:155
+msgid "allow creation of more than one tree"
+msgstr "tillåt skapa mer än ett träd"
+
+#: builtin/mv.c:14
+msgid "git mv [options] <source>... <destination>"
+msgstr "git mv [flaggor] <källa>... <mål>"
+
+#: builtin/mv.c:64
+msgid "force move/rename even if target exists"
+msgstr "tvinga flytta/ändra namn även om målet finns"
+
+#: builtin/mv.c:65
+msgid "skip move/rename errors"
+msgstr "hoppa över fel vid flytt/namnändring"
+
 #: builtin/mv.c:108
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
@@ -4062,6 +6145,154 @@
 msgid "renaming '%s' failed"
 msgstr "misslyckades byta namn på \"%s\""
 
+#: builtin/name-rev.c:175
+msgid "git name-rev [options] <commit>..."
+msgstr "git name-rev [flaggor] <incheckning>..."
+
+#: builtin/name-rev.c:176
+msgid "git name-rev [options] --all"
+msgstr "git name-rev [flaggor] --all"
+
+#: builtin/name-rev.c:177
+msgid "git name-rev [options] --stdin"
+msgstr "git name-rev [flaggor] --stdin"
+
+#: builtin/name-rev.c:229
+msgid "print only names (no SHA-1)"
+msgstr "skriv endast namn (ingen SHA-1)"
+
+#: builtin/name-rev.c:230
+msgid "only use tags to name the commits"
+msgstr "använd endast taggar för att namnge incheckningar"
+
+#: builtin/name-rev.c:232
+msgid "only use refs matching <pattern>"
+msgstr "använd endast referenser som motsvarar <mönster>"
+
+#: builtin/name-rev.c:234
+msgid "list all commits reachable from all refs"
+msgstr "lista alla incheckningar som kan nås alla referenser"
+
+#: builtin/name-rev.c:235
+msgid "read from stdin"
+msgstr "läs från standard in"
+
+#: builtin/name-rev.c:236
+msgid "allow to print `undefined` names"
+msgstr "tillåt att skriva \"odefinierade\" namn"
+
+#: builtin/notes.c:23
+msgid "git notes [--ref <notes_ref>] [list [<object>]]"
+msgstr "git notes [--ref <anteckningsref>] [list [<objekt>]]"
+
+#: builtin/notes.c:24
+msgid ""
+"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+"git notes [--ref <anteckningsref>] add [-f] [-m <medd> | -F <fil> | (-c | -"
+"C) <objekt>] [<objekt>]"
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+"git notes [--ref <anteckningsref>] copy [-f] <från-objekt> <till-objekt>"
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+"git notes [--ref <anteckningsref>] append [-m <medd> | -F <fil> | (-c | -C) "
+"<objekt>] [<objekt>]"
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes_ref>] edit [<object>]"
+msgstr "git notes [--ref <anteckningsref>] edit [<objekt>]"
+
+#: builtin/notes.c:28
+msgid "git notes [--ref <notes_ref>] show [<object>]"
+msgstr "git notes [--ref <anteckningsref>] show [<objekt>]"
+
+#: builtin/notes.c:29
+msgid ""
+"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"
+msgstr ""
+"git notes [--ref <anteckningsref>] merge [-v | -q] [-s <strategi> ] "
+"<anteckningsref>"
+
+#: builtin/notes.c:30
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
+
+#: builtin/notes.c:31
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
+
+#: builtin/notes.c:32
+msgid "git notes [--ref <notes_ref>] remove [<object>...]"
+msgstr "git notes [--ref <anteckningsref>] remove [<objekt>...]"
+
+#: builtin/notes.c:33
+msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
+msgstr "git notes [--ref <anteckningsref>] prune [-n | -v]"
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes_ref>] get-ref"
+msgstr "git notes [--ref <anteckningsref>] get-ref"
+
+#: builtin/notes.c:39
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [<objekt>]]"
+
+#: builtin/notes.c:44
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<flaggor>] [<objekt>]"
+
+#: builtin/notes.c:49
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<flaggor>] <från-objekt> <till-objekt>"
+
+#: builtin/notes.c:50
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<från-objekt> <till-objekt>]..."
+
+#: builtin/notes.c:55
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<flaggor>] [<objekt>]"
+
+#: builtin/notes.c:60
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<objekt>]"
+
+#: builtin/notes.c:65
+msgid "git notes show [<object>]"
+msgstr "git notes show [<objekt>]"
+
+#: builtin/notes.c:70
+msgid "git notes merge [<options>] <notes_ref>"
+msgstr "git notes merge [<flaggor>] <anteckningsref>"
+
+#: builtin/notes.c:71
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<flaggor>]"
+
+#: builtin/notes.c:72
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<flaggor>]"
+
+#: builtin/notes.c:77
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<objekt>]"
+
+#: builtin/notes.c:82
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<flaggor>]"
+
+#: builtin/notes.c:87
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
+
 #: builtin/notes.c:139
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -4169,6 +6400,31 @@
 msgid "No note found for object %s."
 msgstr "Inga anteckningar hittades för objektet %s."
 
+#: builtin/notes.c:535 builtin/notes.c:692
+msgid "note contents as a string"
+msgstr "anteckningsinnehåll som sträng"
+
+#: builtin/notes.c:538 builtin/notes.c:695
+msgid "note contents in a file"
+msgstr "anteckningsinnehåll i en fil"
+
+#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697
+#: builtin/notes.c:700 builtin/tag.c:476
+msgid "object"
+msgstr "objekt"
+
+#: builtin/notes.c:541 builtin/notes.c:698
+msgid "reuse and edit specified note object"
+msgstr "återanvänd och redigera angivet anteckningsobjekt"
+
+#: builtin/notes.c:544 builtin/notes.c:701
+msgid "reuse specified note object"
+msgstr "återanvänd angivet anteckningsobjekt"
+
+#: builtin/notes.c:546 builtin/notes.c:614
+msgid "replace existing notes"
+msgstr "ersätt befintliga anteckningar"
+
 #: builtin/notes.c:580
 #, c-format
 msgid ""
@@ -4183,6 +6439,14 @@
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Skriver över befintliga anteckningar för objektet %s\n"
 
+#: builtin/notes.c:615
+msgid "read objects from stdin"
+msgstr "läs objekt från standard in"
+
+#: builtin/notes.c:617
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
+
 #: builtin/notes.c:635
 msgid "too few parameters"
 msgstr "för få parametrar"
@@ -4210,16 +6474,74 @@
 "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n"
 "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n"
 
+#: builtin/notes.c:864
+msgid "General options"
+msgstr "Allmänna flaggor"
+
+#: builtin/notes.c:866
+msgid "Merge options"
+msgstr "Flaggor för sammanslagning"
+
+#: builtin/notes.c:868
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+"läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+
+#: builtin/notes.c:870
+msgid "Committing unmerged notes"
+msgstr "Checkar in ej sammanslagna anteckningar"
+
+#: builtin/notes.c:872
+msgid "finalize notes merge by committing unmerged notes"
+msgstr ""
+"färdigställ sammanslagning av anteckningar genom att checka in ej "
+"sammanslagna anteckningar"
+
+#: builtin/notes.c:874
+msgid "Aborting notes merge resolution"
+msgstr "Avbryt lösning av sammanslagning av anteckningar"
+
+#: builtin/notes.c:876
+msgid "abort notes merge"
+msgstr "avbryt sammanslagning av anteckningar"
+
 #: builtin/notes.c:971
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objektet %s har ingen anteckning\n"
 
+#: builtin/notes.c:983
+msgid "attempt to remove non-existent note is not an error"
+msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel"
+
+#: builtin/notes.c:986
+msgid "read object names from the standard input"
+msgstr "läs objektnamn från standard in"
+
+#: builtin/notes.c:1067
+msgid "notes_ref"
+msgstr "anteckningar-ref"
+
+#: builtin/notes.c:1068
+msgid "use notes from <notes_ref>"
+msgstr "använd anteckningar från <anteckningsref>"
+
 #: builtin/notes.c:1103 builtin/remote.c:1598
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Okänt underkommando: %s"
 
+#: builtin/pack-objects.c:23
+msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]"
+
+#: builtin/pack-objects.c:24
+msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgstr "git pack-objects [flaggor...] basnamn [< reflista | < objektlista]"
+
 #: builtin/pack-objects.c:183 builtin/pack-objects.c:186
 #, c-format
 msgid "deflate error (%d)"
@@ -4245,6 +6567,162 @@
 msgid "unable to parse value '%s' for option %s"
 msgstr "kunde inte tolka värdet \"%s\" för flaggan %s"
 
+#: builtin/pack-objects.c:2448
+msgid "do not show progress meter"
+msgstr "visa inte förloppsindikator"
+
+#: builtin/pack-objects.c:2450
+msgid "show progress meter"
+msgstr "visa förloppsindikator"
+
+#: builtin/pack-objects.c:2452
+msgid "show progress meter during object writing phase"
+msgstr "visa förloppsindikator under objektskrivningsfasen"
+
+#: builtin/pack-objects.c:2455
+msgid "similar to --all-progress when progress meter is shown"
+msgstr "som --all-progress när förloppsmätaren visas"
+
+#: builtin/pack-objects.c:2456
+msgid "version[,offset]"
+msgstr "version[,offset]"
+
+#: builtin/pack-objects.c:2457
+msgid "write the pack index file in the specified idx format version"
+msgstr "skriv paketindexfilen i angiven indexformatversion"
+
+#: builtin/pack-objects.c:2460
+msgid "maximum size of each output pack file"
+msgstr "maximal storlek på varje utdatapaketfil"
+
+#: builtin/pack-objects.c:2462
+msgid "ignore borrowed objects from alternate object store"
+msgstr "ignorera lånade objekt från alternativa objektlager"
+
+#: builtin/pack-objects.c:2464
+msgid "ignore packed objects"
+msgstr "ignorera packade objekt"
+
+#: builtin/pack-objects.c:2466
+msgid "limit pack window by objects"
+msgstr "begränsa paketfönster efter objekt"
+
+#: builtin/pack-objects.c:2468
+msgid "limit pack window by memory in addition to object limit"
+msgstr "begränsa paketfönster efter minne förutom objektgräns"
+
+#: builtin/pack-objects.c:2470
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr "maximal längd på deltakedja tillåten i slutligt paket"
+
+#: builtin/pack-objects.c:2472
+msgid "reuse existing deltas"
+msgstr "återanvänd befintliga delta"
+
+#: builtin/pack-objects.c:2474
+msgid "reuse existing objects"
+msgstr "återanvänd befintliga objekt"
+
+#: builtin/pack-objects.c:2476
+msgid "use OFS_DELTA objects"
+msgstr "använd OFS_DELTA-objekt"
+
+#: builtin/pack-objects.c:2478
+msgid "use threads when searching for best delta matches"
+msgstr "använd trådar vid sökning efter bästa deltaträffar"
+
+#: builtin/pack-objects.c:2480
+msgid "do not create an empty pack output"
+msgstr "försök inte skapa tom paketutdata"
+
+#: builtin/pack-objects.c:2482
+msgid "read revision arguments from standard input"
+msgstr "läs revisionsargument från standard in"
+
+#: builtin/pack-objects.c:2484
+msgid "limit the objects to those that are not yet packed"
+msgstr "begränsa objekt till de som ännu inte packats"
+
+#: builtin/pack-objects.c:2487
+msgid "include objects reachable from any reference"
+msgstr "inkludera objekt som kan nås från någon referens"
+
+#: builtin/pack-objects.c:2490
+msgid "include objects referred by reflog entries"
+msgstr "inkludera objekt som refereras från referensloggposter"
+
+#: builtin/pack-objects.c:2493
+msgid "output pack to stdout"
+msgstr "skriv paket på standard ut"
+
+#: builtin/pack-objects.c:2495
+msgid "include tag objects that refer to objects to be packed"
+msgstr "inkludera taggobjekt som refererar objekt som skall packas"
+
+#: builtin/pack-objects.c:2497
+msgid "keep unreachable objects"
+msgstr "behåll onåbara objekt"
+
+#: builtin/pack-objects.c:2498 parse-options.h:141
+msgid "time"
+msgstr "tid"
+
+#: builtin/pack-objects.c:2499
+msgid "unpack unreachable objects newer than <time>"
+msgstr "packa upp onåbara objekt nyare än <tid>"
+
+#: builtin/pack-objects.c:2502
+msgid "create thin packs"
+msgstr "skapa tunna paket"
+
+#: builtin/pack-objects.c:2504
+msgid "ignore packs that have companion .keep file"
+msgstr "ignorera paket som har tillhörande .keep-fil"
+
+#: builtin/pack-objects.c:2506
+msgid "pack compression level"
+msgstr "komprimeringsgrad för paket"
+
+#: builtin/pack-objects.c:2508
+msgid "do not hide commits by grafts"
+msgstr "göm inte incheckningar med ympningar (\"grafts\")"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [options]"
+msgstr "git pack-refs [flaggor]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "packa allt"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "ta bort lösa referenser (standard)"
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
+msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+
+#: builtin/prune.c:12
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
+
+#: builtin/prune.c:132
+msgid "do not remove, show only"
+msgstr "ta inte bort, bara visa"
+
+#: builtin/prune.c:133
+msgid "report pruned objects"
+msgstr "rapportera borttagna objekt"
+
+#: builtin/prune.c:136
+msgid "expire objects older than <time>"
+msgstr "låt tid gå ut för objekt äldre än <tid>"
+
+#: builtin/push.c:14
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
+
 #: builtin/push.c:45
 msgid "tag shorthand without <tag>"
 msgstr "taggförkortning utan <tagg>"
@@ -4331,14 +6809,48 @@
 "aktuella grenen \"%s\", utan att tala om för mig vad som\n"
 "skall sändas för att uppdatera fjärrgrenen."
 
-#: builtin/push.c:174
+#: builtin/push.c:151
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"push.default har inte ställts in; dess underförstådda värde\n"
+"ändras i Git 2.0 från \"matching\" till \"simple\". För att\n"
+"undertrycka det här meddelandet och behålla nuvarande beteende\n"
+"efter att förvalet ändras,\n"
+"skriver du:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"För att undertrycka meddelandet och välja det nya beteendet nu skriver du:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"Se \"git help config\" och sök efter \"push.default\" för ytterligare \n"
+"information. (Läget \"simple\" introducerades i Git 1.7.11. Använd det\n"
+"liknande läget \"current\" istället för \"simple\" om du ibland använder\n"
+"äldre versioner av Git.)"
+
+#: builtin/push.c:199
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr ""
 "Du angav inga referensspecifikationer att sända, och push.default är "
 "\"nothing\"."
 
-#: builtin/push.c:181
+#: builtin/push.c:206
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n"
@@ -4350,20 +6862,21 @@
 "innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:187
+#: builtin/push.c:212
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration\n"
-"variable to 'current' or 'upstream' to push only the current branch."
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
 msgstr ""
 "Uppdateringar avvisades då änden på en insänd gren är bakom dess\n"
 "fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n"
 "du specificera grenar att sända, eller ändra inställningsvariabeln\n"
-"\"push-default\" till \"current\" eller \"upstream\" för att endast sända\n"
-"aktuell gren."
+"\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att "
+"endast\n"
+"sända aktuell gren."
 
-#: builtin/push.c:193
+#: builtin/push.c:218
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and merge the remote changes\n"
@@ -4375,22 +6888,22 @@
 "\"git pull\") innan du sänder igen.\n"
 "Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
 
-#: builtin/push.c:233
+#: builtin/push.c:258
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Sänder till %s\n"
 
-#: builtin/push.c:237
+#: builtin/push.c:262
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "misslyckades sända vissa referenser till \"%s\""
 
-#: builtin/push.c:269
+#: builtin/push.c:294
 #, c-format
 msgid "bad repository '%s'"
 msgstr "felaktigt arkiv \"%s\""
 
-#: builtin/push.c:270
+#: builtin/push.c:295
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -4411,34 +6924,238 @@
 "\n"
 "    git push <namn>\n"
 
-#: builtin/push.c:285
+#: builtin/push.c:310
 msgid "--all and --tags are incompatible"
 msgstr "--all och --tags är inkompatibla"
 
-#: builtin/push.c:286
+#: builtin/push.c:311
 msgid "--all can't be combined with refspecs"
 msgstr "--all kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:291
+#: builtin/push.c:316
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror och --tags är inkompatibla"
 
-#: builtin/push.c:292
+#: builtin/push.c:317
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror kan inte kombineras med referensspecifikationer"
 
-#: builtin/push.c:297
+#: builtin/push.c:322
 msgid "--all and --mirror are incompatible"
 msgstr "--all och --mirror är inkompatibla"
 
-#: builtin/push.c:385
+#: builtin/push.c:382
+msgid "repository"
+msgstr "arkiv"
+
+#: builtin/push.c:383
+msgid "push all refs"
+msgstr "sänd alla referenser"
+
+#: builtin/push.c:384
+msgid "mirror all refs"
+msgstr "spegla alla referenser"
+
+#: builtin/push.c:386
+msgid "delete refs"
+msgstr "ta bort referenser"
+
+#: builtin/push.c:387
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr "sänd taggar (kan inte användas med --all eller --mirror)"
+
+#: builtin/push.c:390
+msgid "force updates"
+msgstr "tvinga uppdateringar"
+
+#: builtin/push.c:391
+msgid "check"
+msgstr "kontrollera"
+
+#: builtin/push.c:392
+msgid "control recursive pushing of submodules"
+msgstr "styr rekursiv insändning av undermoduler"
+
+#: builtin/push.c:394
+msgid "use thin pack"
+msgstr "använd tunna paket"
+
+#: builtin/push.c:395 builtin/push.c:396
+msgid "receive pack program"
+msgstr "program för att ta emot paket"
+
+#: builtin/push.c:397
+msgid "set upstream for git pull/status"
+msgstr "ställ in uppström för git pull/status"
+
+#: builtin/push.c:400
+msgid "prune locally removed refs"
+msgstr "ta bort lokalt borttagna referenser"
+
+#: builtin/push.c:410
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete är imkompatibel med --all, --mirror och --tags"
 
-#: builtin/push.c:387
+#: builtin/push.c:412
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete kan inte användas utan referenser"
 
+#: builtin/read-tree.c:36
+msgid ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<fil>] (--empty | <träd-igt1> [<träd-igt2> [<träd-igt3>]])"
+
+#: builtin/read-tree.c:108
+msgid "write resulting index to <file>"
+msgstr "skriv resulterande index till <fil>"
+
+#: builtin/read-tree.c:111
+msgid "only empty the index"
+msgstr "töm bara indexet"
+
+#: builtin/read-tree.c:113
+msgid "Merging"
+msgstr "Sammanslagning"
+
+#: builtin/read-tree.c:115
+msgid "perform a merge in addition to a read"
+msgstr "utför en sammanslagning i tillägg till en läsning"
+
+#: builtin/read-tree.c:117
+msgid "3-way merge if no file level merging required"
+msgstr "3-vägssammanslagning om sammanslagning på filnivå ej krävs"
+
+#: builtin/read-tree.c:119
+msgid "3-way merge in presence of adds and removes"
+msgstr "3-vägssammanslagning när det finns tillägg och borttagningar"
+
+#: builtin/read-tree.c:121
+msgid "same as -m, but discard unmerged entries"
+msgstr "som -m, men kasta bort ej sammanslagna poster"
+
+#: builtin/read-tree.c:122
+msgid "<subdirectory>/"
+msgstr "<underkatalog>/"
+
+#: builtin/read-tree.c:123
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "läs in trädet i indexet under <underkatalog>/"
+
+#: builtin/read-tree.c:126
+msgid "update working tree with merge result"
+msgstr "uppdatera arbetskatalogen med resultatet från sammanslagningen"
+
+#: builtin/read-tree.c:128
+msgid "gitignore"
+msgstr "gitignore"
+
+#: builtin/read-tree.c:129
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "tillåt explicit ignorerade filer att skrivas över"
+
+#: builtin/read-tree.c:132
+msgid "don't check the working tree after merging"
+msgstr "kontrollera inte arbetskatalogen efter sammanslagning"
+
+#: builtin/read-tree.c:133
+msgid "don't update the index or the work tree"
+msgstr "uppdatera inte indexet eller arbetskatalogen"
+
+#: builtin/read-tree.c:135
+msgid "skip applying sparse checkout filter"
+msgstr "hoppa över att applicera filter för gles utcheckning"
+
+#: builtin/read-tree.c:137
+msgid "debug unpack-trees"
+msgstr "felsök unpack-trees"
+
+#: builtin/remote.c:11
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
+
+#: builtin/remote.c:12
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+"git remote add [-t <gren>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <namn> <url>"
+
+#: builtin/remote.c:13 builtin/remote.c:32
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <gammal> <ny>"
+
+#: builtin/remote.c:14 builtin/remote.c:37
+msgid "git remote remove <name>"
+msgstr "git remote remove <namn>"
+
+#: builtin/remote.c:15
+msgid "git remote set-head <name> (-a | -d | <branch>)"
+msgstr "git remote set-head <namn> (-a | -d | <gren>)"
+
+#: builtin/remote.c:16
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <namn>"
+
+#: builtin/remote.c:17
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <namn>"
+
+#: builtin/remote.c:18
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<grupp> | <fjärr>)...]"
+
+#: builtin/remote.c:19
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <namn> <gren>..."
+
+#: builtin/remote.c:20 builtin/remote.c:68
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <namn> <nyurl> [<gammalurl>]"
+
+#: builtin/remote.c:21 builtin/remote.c:69
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <namn> <nyurl>"
+
+#: builtin/remote.c:22 builtin/remote.c:70
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <namn> <url>"
+
+#: builtin/remote.c:27
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<flaggor>] <namn> <url>"
+
+#: builtin/remote.c:42
+msgid "git remote set-head <name> (-a | -d | <branch>])"
+msgstr "git remote set-head <namn> (-a | -d | <gren>])"
+
+#: builtin/remote.c:47
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <namn> <gren>..."
+
+#: builtin/remote.c:48
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <namn> <gren>..."
+
+#: builtin/remote.c:53
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<flaggor>] <namn>"
+
+#: builtin/remote.c:58
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<flaggor>] <namn>"
+
+#: builtin/remote.c:63
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<flaggor>] [<grupp> | <fjärr>]..."
+
 #: builtin/remote.c:98
 #, c-format
 msgid "Updating %s"
@@ -4457,6 +7174,34 @@
 msgid "unknown mirror argument: %s"
 msgstr "okänt argument till mirror: %s"
 
+#: builtin/remote.c:163
+msgid "fetch the remote branches"
+msgstr "hämta fjärrgrenarna"
+
+#: builtin/remote.c:165
+msgid "import all tags and associated objects when fetching"
+msgstr "importera alla taggar och associerade objekt vid hämtning"
+
+#: builtin/remote.c:168
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "eller hämta inte några taggar alls (--no-tags)"
+
+#: builtin/remote.c:170
+msgid "branch(es) to track"
+msgstr "gren(ar) att spåra"
+
+#: builtin/remote.c:171
+msgid "master branch"
+msgstr "huvudgren"
+
+#: builtin/remote.c:172
+msgid "push|fetch"
+msgstr "push|fetch"
+
+#: builtin/remote.c:173
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "ställ in arkiv som spegel att sända eller ta emot från"
+
 #: builtin/remote.c:185
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "att ange en master-gren ger ingen mening med --mirror"
@@ -4653,6 +7398,10 @@
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s sänder till %s"
 
+#: builtin/remote.c:1091
+msgid "do not query remotes"
+msgstr "fråga inte fjärrar"
+
 #: builtin/remote.c:1118
 #, c-format
 msgid "* remote %s"
@@ -4711,6 +7460,14 @@
 msgstr[0] "  Lokal referens konfigurerad för \"git push\"%s:"
 msgstr[1] "  Lokala referenser konfigurerade för \"git push\"%s:"
 
+#: builtin/remote.c:1199
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "sätt refs/remotes/<namn>/HEAD enligt fjärren"
+
+#: builtin/remote.c:1201
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "ta bort refs/remotes/<namn>/HEAD"
+
 #: builtin/remote.c:1216
 msgid "Cannot determine remote HEAD"
 msgstr "Kan inte bestämma HEAD på fjärren"
@@ -4764,15 +7521,35 @@
 msgid " * [pruned] %s"
 msgstr " * [rensad] %s"
 
+#: builtin/remote.c:1321
+msgid "prune remotes after fetching"
+msgstr "rensa fjärrar efter hämtning"
+
 #: builtin/remote.c:1387 builtin/remote.c:1461
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Ingen sådan fjärr \"%s\""
 
+#: builtin/remote.c:1407
+msgid "add branch"
+msgstr "lägg till gren"
+
 #: builtin/remote.c:1414
 msgid "no remote specified"
 msgstr "ingen fjärr angavs"
 
+#: builtin/remote.c:1436
+msgid "manipulate push URLs"
+msgstr "manipulera URL:ar för sändning"
+
+#: builtin/remote.c:1438
+msgid "add URL"
+msgstr "lägg till URL"
+
+#: builtin/remote.c:1440
+msgid "delete URLs"
+msgstr "ta bort URL:ar"
+
 #: builtin/remote.c:1447
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete ger ingen mening"
@@ -4791,6 +7568,56 @@
 msgid "Will not delete all non-push URLs"
 msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
 
+#: builtin/remote.c:1569
+msgid "be verbose; must be placed before a subcommand"
+msgstr "var pratsam; måste skrivas före ett underkommando"
+
+#: builtin/replace.c:17
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <objekt> <ersättning>"
+
+#: builtin/replace.c:18
+msgid "git replace -d <object>..."
+msgstr "git replace -d <objekt>..."
+
+#: builtin/replace.c:19
+msgid "git replace -l [<pattern>]"
+msgstr "git replace -l [<mönster>]"
+
+#: builtin/replace.c:118
+msgid "list replace refs"
+msgstr "visa ersättningsreferenser"
+
+#: builtin/replace.c:119
+msgid "delete replace refs"
+msgstr "ta bort ersättningsreferenser"
+
+#: builtin/replace.c:120
+msgid "replace the ref if it exists"
+msgstr "ersätt referensen om den finns"
+
+#: builtin/rerere.c:11
+msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget path... | status | remaining | diff | gc]"
+
+#: builtin/rerere.c:56
+msgid "register clean resolutions in index"
+msgstr "registrera rena lösningar i indexet"
+
+#: builtin/reset.c:25
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<incheckning>]"
+
+#: builtin/reset.c:26
+msgid "git reset [-q] <commit> [--] <paths>..."
+msgstr "git reset [-q] <incheckning> [--] <sökvägar>..."
+
+#: builtin/reset.c:27
+msgid "git reset --patch [<commit>] [--] [<paths>...]"
+msgstr "git reset --patch [<incheckning>] [--] [<sökvägar>...]"
+
 #: builtin/reset.c:33
 msgid "mixed"
 msgstr "blandad"
@@ -4846,6 +7673,26 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "Kan inte utföra en %s återställning mitt i en sammanslagning."
 
+#: builtin/reset.c:238
+msgid "be quiet, only report errors"
+msgstr "var tyst, rapportera endast fel"
+
+#: builtin/reset.c:240
+msgid "reset HEAD and index"
+msgstr "återställ HEAD och index"
+
+#: builtin/reset.c:241
+msgid "reset only HEAD"
+msgstr "återställ endast HEAD"
+
+#: builtin/reset.c:243 builtin/reset.c:245
+msgid "reset HEAD, index and working tree"
+msgstr "återställ HEAD, index och arbetskatalog"
+
+#: builtin/reset.c:247
+msgid "reset HEAD but keep local changes"
+msgstr "återställ HEAD men behåll lokala ändringar"
+
 #: builtin/reset.c:303
 #, c-format
 msgid "Could not parse object '%s'."
@@ -4875,23 +7722,126 @@
 msgid "Could not reset index file to revision '%s'."
 msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
 
+#: builtin/rev-parse.c:339
+msgid "git rev-parse --parseopt [options] -- [<args>...]"
+msgstr "git rev-parse --parseopt [options] -- [<argument>...]"
+
+#: builtin/rev-parse.c:344
+msgid "keep the `--` passed as an arg"
+msgstr "behåll \"--\" sänt som argument"
+
+#: builtin/rev-parse.c:346
+msgid "stop parsing after the first non-option argument"
+msgstr "sluta tolka efter första argument som inte är flagga"
+
+#: builtin/rev-parse.c:464
+msgid ""
+"git rev-parse --parseopt [options] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [options] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+"git rev-parse --parseopt [flaggor] -- [<argument>...]\n"
+"     eller: git rev-parse --sq-quote [<argument>...]\n"
+"     eller: git rev-parse [flaggor] [<argument>...]\n"
+"\n"
+"Kör \"git rev-parse --parseopt -h\" för mer information om den första "
+"varianten."
+
+#: builtin/revert.c:22
+msgid "git revert [options] <commit-ish>"
+msgstr "git revert [flaggor] <incheckning-igt>"
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <underkommando>"
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [options] <commit-ish>"
+msgstr "git cherry-pick [flaggor] <incheckning-igt>"
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <underkommando>"
+
 #: builtin/revert.c:70 builtin/revert.c:92
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s kan inte användas med %s"
 
-#: builtin/revert.c:131
+#: builtin/revert.c:103
+msgid "end revert or cherry-pick sequence"
+msgstr "avsluta revert- eller cherry-pick-sekvens"
+
+#: builtin/revert.c:104
+msgid "resume revert or cherry-pick sequence"
+msgstr "återuppta revert- eller cherry-pick-sekvens"
+
+#: builtin/revert.c:105
+msgid "cancel revert or cherry-pick sequence"
+msgstr "avbryt revert- eller cherry-pick-sekvens"
+
+#: builtin/revert.c:106
+msgid "don't automatically commit"
+msgstr "checka inte in automatiskt"
+
+#: builtin/revert.c:107
+msgid "edit the commit message"
+msgstr "redigera incheckningsmeddelandet"
+
+#: builtin/revert.c:110
+msgid "parent number"
+msgstr "nummer på förälder"
+
+#: builtin/revert.c:112
+msgid "merge strategy"
+msgstr "sammanslagninsstrategi"
+
+#: builtin/revert.c:113
+msgid "option"
+msgstr "alternativ"
+
+#: builtin/revert.c:114
+msgid "option for merge strategy"
+msgstr "alternativ för sammanslagningsstrategi"
+
+#: builtin/revert.c:125
+msgid "append commit name"
+msgstr "lägg till incheckningsnamn"
+
+#: builtin/revert.c:126
+msgid "allow fast-forward"
+msgstr "tillåt snabbspolning"
+
+#: builtin/revert.c:127
+msgid "preserve initially empty commits"
+msgstr "behåll incheckningar som börjar som tomma"
+
+#: builtin/revert.c:128
+msgid "allow commits with empty messages"
+msgstr "tillåt incheckningar med tomt meddelande"
+
+#: builtin/revert.c:129
+msgid "keep redundant, empty commits"
+msgstr "behåll redundanta, tomma incheckningar"
+
+#: builtin/revert.c:133
 msgid "program error"
 msgstr "programfel"
 
-#: builtin/revert.c:221
+#: builtin/revert.c:223
 msgid "revert failed"
 msgstr "\"revert\" misslyckades"
 
-#: builtin/revert.c:236
+#: builtin/revert.c:238
 msgid "cherry-pick failed"
 msgstr "\"cherry-pick\" misslyckades"
 
+#: builtin/rm.c:14
+msgid "git rm [options] [--] <file>..."
+msgstr "git rm [flaggor] [--] <fil>..."
+
 #: builtin/rm.c:109
 #, c-format
 msgid ""
@@ -4919,6 +7869,26 @@
 "\"%s\" har lokala ändringar\n"
 "(använd --cached för att behålla filen eller -f för att tvinga borttagning)"
 
+#: builtin/rm.c:134
+msgid "do not list removed files"
+msgstr "lista inte borttagna filer"
+
+#: builtin/rm.c:135
+msgid "only remove from the index"
+msgstr "ta bara bort från indexet"
+
+#: builtin/rm.c:136
+msgid "override the up-to-date check"
+msgstr "överstyr àjour-testet"
+
+#: builtin/rm.c:137
+msgid "allow recursive removal"
+msgstr "tillåt rekursiv borttagning"
+
+#: builtin/rm.c:139
+msgid "exit with a zero status even if nothing matched"
+msgstr "avsluta med nollstatus även om inget träffades"
+
 #: builtin/rm.c:194
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -4929,11 +7899,203 @@
 msgid "git rm: unable to remove %s"
 msgstr "git rm: kan inte ta bort %s"
 
+#: builtin/shortlog.c:13
+msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"
+msgstr ""
+"git shortlog [-n] [-s] [-e] [-w] [rev-flaggor] [--] [<incheckning-id>... ]"
+
 #: builtin/shortlog.c:157
 #, c-format
 msgid "Missing author: %s"
 msgstr "Författare saknas: %s"
 
+#: builtin/shortlog.c:253
+msgid "sort output according to the number of commits per author"
+msgstr "sortera utdata enligt antal incheckningar per författare"
+
+#: builtin/shortlog.c:255
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr "Undertryck beskrivningar, visa bara antal incheckningar"
+
+#: builtin/shortlog.c:257
+msgid "Show the email address of each author"
+msgstr "Visa e-postadress för varje författare"
+
+#: builtin/shortlog.c:258
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
+
+#: builtin/shortlog.c:259
+msgid "Linewrap output"
+msgstr "Radbryt utdata"
+
+#: builtin/show-branch.c:9
+msgid ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
+"<glob>)...]"
+msgstr ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<när>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
+"<mönster>)...]"
+
+#: builtin/show-branch.c:10
+msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr "git show-branch (-g|--reflog)[=<n>[,<bas>]] [--list] [<ref>]"
+
+#: builtin/show-branch.c:651
+msgid "show remote-tracking and local branches"
+msgstr "visa fjärrspårande och lokala grenar"
+
+#: builtin/show-branch.c:653
+msgid "show remote-tracking branches"
+msgstr "visa fjärrspårande grenar"
+
+#: builtin/show-branch.c:655
+msgid "color '*!+-' corresponding to the branch"
+msgstr "färga \"*!+-\" enligt grenen"
+
+#: builtin/show-branch.c:657
+msgid "show <n> more commits after the common ancestor"
+msgstr "visa <n> ytterligare incheckningar efter gemensam anfader"
+
+#: builtin/show-branch.c:659
+msgid "synonym to more=-1"
+msgstr "synonym till more=-1"
+
+#: builtin/show-branch.c:660
+msgid "suppress naming strings"
+msgstr "undertyck namnsträngar"
+
+#: builtin/show-branch.c:662
+msgid "include the current branch"
+msgstr "inkludera aktuell gren"
+
+#: builtin/show-branch.c:664
+msgid "name commits with their object names"
+msgstr "namnge incheckningar med deras objektnamn"
+
+#: builtin/show-branch.c:666
+msgid "show possible merge bases"
+msgstr "visa möjliga sammanslaningsbaser"
+
+#: builtin/show-branch.c:668
+msgid "show refs unreachable from any other ref"
+msgstr "visa referenser som inte kan nås från någon annan referens"
+
+#: builtin/show-branch.c:670
+msgid "show commits in topological order"
+msgstr "visa incheckningar i topologisk ordning"
+
+#: builtin/show-branch.c:672
+msgid "show only commits not on the first branch"
+msgstr "visa endast incheckningar inte på den första grenen"
+
+#: builtin/show-branch.c:674
+msgid "show merges reachable from only one tip"
+msgstr "visa sammanslagningar som endast kan nås från en spets"
+
+#: builtin/show-branch.c:676
+msgid "show commits where no parent comes before its children"
+msgstr "visa incheckningar där ingen förälder kommer före dess barn"
+
+#: builtin/show-branch.c:678
+msgid "<n>[,<base>]"
+msgstr "<n>[,<bas>]"
+
+#: builtin/show-branch.c:679
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "visa <n> nyaste refloggposter med början på bas"
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+msgstr ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mönster*] "
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=pattern] < ref-list"
+msgstr "git show-ref --exclude-existing[=mönster] < reflista"
+
+#: builtin/show-ref.c:182
+msgid "only show tags (can be combined with heads)"
+msgstr "visa endast taggar (kan kombineras med huvuden)"
+
+#: builtin/show-ref.c:183
+msgid "only show heads (can be combined with tags)"
+msgstr "visa endast huvuden (kan kombineras med taggar)"
+
+#: builtin/show-ref.c:184
+msgid "stricter reference checking, requires exact ref path"
+msgstr "striktare referenskontroll, kräver exakt referenssökväg"
+
+#: builtin/show-ref.c:187 builtin/show-ref.c:189
+msgid "show the HEAD reference"
+msgstr "visa HEAD-referensen"
+
+#: builtin/show-ref.c:191
+msgid "dereference tags into object IDs"
+msgstr "avreferera taggar till objekt-id"
+
+#: builtin/show-ref.c:193
+msgid "only show SHA1 hash using <n> digits"
+msgstr "visa SHA1-hash endast med <n> siffror"
+
+#: builtin/show-ref.c:197
+msgid "do not print results to stdout (useful with --verify)"
+msgstr "visa inte resultat på standard ut (användbart med --verify)"
+
+#: builtin/show-ref.c:199
+msgid "show refs from stdin that aren't in local repository"
+msgstr "visa referenser från standard in som inte finns i lokalt arkiv"
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [options] name [ref]"
+msgstr "git symbolic-ref [flaggor] namn [ref]"
+
+#: builtin/symbolic-ref.c:38
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr ""
+"undertryck felmeddelanden för icke-symboliska (frånkopplade) referenser"
+
+#: builtin/symbolic-ref.c:39
+msgid "shorten ref output"
+msgstr "förkorta ref-utdata"
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason"
+msgstr "skäl"
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason of the update"
+msgstr "skäl till uppdateringen"
+
+#: builtin/tag.c:22
+msgid ""
+"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"
+msgstr ""
+"git tag [-a|-s|-u <nyckel-id>] [-f] [-m <medd>|-F <fil>] <taggnamn> [<huvud>]"
+
+#: builtin/tag.c:23
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <taggnamn>..."
+
+#: builtin/tag.c:24
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
+"\t\t[<pattern>...]"
+msgstr ""
+"git tag -l [-n[<antal>]] [--contains <incheckning>] [--points-at <objekt>] \n"
+"\t\t[<mönster>...]"
+
+#: builtin/tag.c:26
+msgid "git tag -v <tagname>..."
+msgstr "git tag -v <taggnamn>..."
+
 #: builtin/tag.c:60
 #, c-format
 msgid "malformed object at '%s'"
@@ -5023,6 +8185,62 @@
 msgid "malformed object name '%s'"
 msgstr "felformat objektnamn \"%s\""
 
+#: builtin/tag.c:447
+msgid "list tag names"
+msgstr "lista taggnamn"
+
+#: builtin/tag.c:449
+msgid "print <n> lines of each tag message"
+msgstr "visa <n> rader från varje taggmeddelande"
+
+#: builtin/tag.c:451
+msgid "delete tags"
+msgstr "ta bort taggar"
+
+#: builtin/tag.c:452
+msgid "verify tags"
+msgstr "verifiera taggar"
+
+#: builtin/tag.c:454
+msgid "Tag creation options"
+msgstr "Alternativ för att skapa taggar"
+
+#: builtin/tag.c:456
+msgid "annotated tag, needs a message"
+msgstr "annoterad tagg, behöver meddelande"
+
+#: builtin/tag.c:458
+msgid "tag message"
+msgstr "taggmeddelande"
+
+#: builtin/tag.c:460
+msgid "annotated and GPG-signed tag"
+msgstr "annoterad och GPG-signerad tagg"
+
+#: builtin/tag.c:464
+msgid "use another key to sign the tag"
+msgstr "använd annan nyckel för att signera taggen"
+
+#: builtin/tag.c:465
+msgid "replace the tag if exists"
+msgstr "ersätt taggen om den finns"
+
+#: builtin/tag.c:466
+msgid "show tag list in columns"
+msgstr "lista taggar i spalter"
+
+#: builtin/tag.c:468
+msgid "Tag listing options"
+msgstr "Alternativ för listning av taggar"
+
+#: builtin/tag.c:471
+msgid "print only tags that contain the commit"
+msgstr "visa endast taggar som innehåller incheckningen"
+
+#: builtin/tag.c:477
+msgid "print only tags of the object"
+msgstr "visa endast taggar för objektet"
+
 #: builtin/tag.c:506
 msgid "--column and -n are incompatible"
 msgstr "--column och -n är inkompatibla"
@@ -5072,28 +8290,183 @@
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
 
+#: builtin/update-index.c:401
+msgid "git update-index [options] [--] [<file>...]"
+msgstr "git update-index [flaggor] [--] [<fil>...]"
+
+#: builtin/update-index.c:717
+msgid "continue refresh even when index needs update"
+msgstr "fortsätt uppdatera även när index inte är àjour"
+
+#: builtin/update-index.c:720
+msgid "refresh: ignore submodules"
+msgstr "refresh: ignorera undermoduler"
+
+#: builtin/update-index.c:723
+msgid "do not ignore new files"
+msgstr "ignorera inte nya filer"
+
+#: builtin/update-index.c:725
+msgid "let files replace directories and vice-versa"
+msgstr "låt filer ersätta kataloger och omvänt"
+
+#: builtin/update-index.c:727
+msgid "notice files missing from worktree"
+msgstr "lägg märke till filer som saknas i arbetskatalogen"
+
+#: builtin/update-index.c:729
+msgid "refresh even if index contains unmerged entries"
+msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
+
+#: builtin/update-index.c:732
+msgid "refresh stat information"
+msgstr "uppdatera statusinformation"
+
+#: builtin/update-index.c:736
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "som --refresh, men ignorera assume-unchanged-inställning"
+
+#: builtin/update-index.c:740
+msgid "<mode> <object> <path>"
+msgstr "<läge> <objekt> <sökväg>"
+
+#: builtin/update-index.c:741
+msgid "add the specified entry to the index"
+msgstr "lägg till angiven post i indexet"
+
+#: builtin/update-index.c:745
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/update-index.c:746
+msgid "override the executable bit of the listed files"
+msgstr "överstyr exekveringsbiten för angivna filer"
+
+#: builtin/update-index.c:750
+msgid "mark files as \"not changing\""
+msgstr "markera filer som \"ändras inte\""
+
+#: builtin/update-index.c:753
+msgid "clear assumed-unchanged bit"
+msgstr "rensa \"assume-unchanged\"-biten"
+
+#: builtin/update-index.c:756
+msgid "mark files as \"index-only\""
+msgstr "markera filer som \"endast index\""
+
+#: builtin/update-index.c:759
+msgid "clear skip-worktree bit"
+msgstr "töm \"skip-worktree\"-biten"
+
+#: builtin/update-index.c:762
+msgid "add to index only; do not add content to object database"
+msgstr "lägg endast till indexet; lägg inte till innehållet i objektdatabasen"
+
+#: builtin/update-index.c:764
+msgid "remove named paths even if present in worktree"
+msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
+
+#: builtin/update-index.c:766
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr "med --stdin: indatarader termineras med null-byte"
+
+#: builtin/update-index.c:768
+msgid "read list of paths to be updated from standard input"
+msgstr "läs lista över sökvägar att uppdatera från standard in"
+
+#: builtin/update-index.c:772
+msgid "add entries from standard input to the index"
+msgstr "lägg poster från från standard in till indexet"
+
+#: builtin/update-index.c:776
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
+
+#: builtin/update-index.c:780
+msgid "only update entries that differ from HEAD"
+msgstr "uppdatera endast poster som skiljer sig från HEAD"
+
+#: builtin/update-index.c:784
+msgid "ignore files missing from worktree"
+msgstr "ignorera filer som saknas i arbetskatalogen"
+
+#: builtin/update-index.c:787
+msgid "report actions to standard output"
+msgstr "raportera åtgärder på standard ut"
+
+#: builtin/update-index.c:789
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr "(för porslin) glöm sparade olösta konflikter"
+
+#: builtin/update-index.c:793
+msgid "write index in this format"
+msgstr "skriv index i detta format"
+
+#: builtin/update-ref.c:7
+msgid "git update-ref [options] -d <refname> [<oldval>]"
+msgstr "git update-ref [flaggor] -d <refnamn> [<gammaltvärde>]"
+
+#: builtin/update-ref.c:8
+msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
+msgstr "git update-ref [flaggor]    <refnamn> <gammaltvärde> [<nyttvärde>]"
+
+#: builtin/update-ref.c:19
+msgid "delete the reference"
+msgstr "ta bort referensen"
+
+#: builtin/update-ref.c:21
+msgid "update <refname> not the one it points to"
+msgstr "uppdatera <refnamn> inte det den pekar på"
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "uppdatera informationsfilerna från grunden"
+
+#: builtin/verify-pack.c:56
+msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
+msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] <paket>..."
+
+#: builtin/verify-pack.c:66
+msgid "verbose"
+msgstr "pratsam"
+
+#: builtin/verify-pack.c:68
+msgid "show statistics only"
+msgstr "visa endast statistik"
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v|--verbose] <tag>..."
+msgstr "git verify-tag [-v|--verbose] <tagg>..."
+
+#: builtin/verify-tag.c:73
+msgid "print tag contents"
+msgstr "visa innehåll för tag"
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<prefix>/"
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "visa trädobjekt för underkatalogen <prefix>"
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "endast användbart vid felsökning"
+
 #: git.c:16
 msgid "See 'git help <command>' for more information on a specific command."
 msgstr ""
 "Se \"git help <kommando>\" för mer information om ett specifikt kommando."
 
-#: parse-options.h:133 parse-options.h:235
-msgid "n"
-msgstr "n"
-
-#: parse-options.h:141
-msgid "time"
-msgstr "tid"
-
-# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e.
-#: parse-options.h:149
-msgid "file"
-msgstr "fil"
-
-#: parse-options.h:151
-msgid "when"
-msgstr "när"
-
 #: parse-options.h:156
 msgid "no-op (backward compatibility)"
 msgstr "ingen funktion (bakåtkompatibilitet)"
@@ -5350,6 +8723,15 @@
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "Patchen misslyckades vid $msgnum $FIRSTLINE"
 
+#: git-am.sh:858
+#, sh-format
+msgid ""
+"The copy of the patch that failed is found in:\n"
+"   $dotest/patch"
+msgstr ""
+"En kopia av patchen som misslyckades finns i:\n"
+"   $dotest/patch"
+
 #: git-am.sh:876
 msgid "applying to an empty history"
 msgstr "tillämpar på en tom historik"
@@ -5780,25 +9162,25 @@
 msgid "Cannot unstage modified files"
 msgstr "Kan inte ta bort ändrade filer ur kön"
 
-#: git-stash.sh:474
+#: git-stash.sh:475
 msgid "Index was not unstashed."
 msgstr "Indexet har inte tagits ur kön."
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Kastade ${REV} ($s)"
 
-#: git-stash.sh:492
+#: git-stash.sh:493
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Kunde inte kasta \"stash\"-post"
 
-#: git-stash.sh:499
+#: git-stash.sh:500
 msgid "No branch name specified"
 msgstr "Inget grennamn angavs"
 
-#: git-stash.sh:570
+#: git-stash.sh:571
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(För att återställa dem, skriv \"git stash apply\")"
 
@@ -5807,33 +9189,33 @@
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "kan inte ta bort en komponent från url:en \"$remoteurl\""
 
-#: git-submodule.sh:145
+#: git-submodule.sh:167
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr ""
 "Hittade ingen undermodulmappning i .gitmodules för sökvägen \"$sm_path\""
 
-#: git-submodule.sh:189
+#: git-submodule.sh:211
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:201
+#: git-submodule.sh:223
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr "Gitkatalog \"$a\" ingår i underkatalogsökvägen \"$b\" eller omvänt"
 
-#: git-submodule.sh:290
+#: git-submodule.sh:312
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
 
-#: git-submodule.sh:307
+#: git-submodule.sh:329
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "\"$sm_path\" finns redan i indexet"
 
-#: git-submodule.sh:311
+#: git-submodule.sh:333
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -5844,64 +9226,64 @@
 "$sm_path\n"
 "Använd -f om du verkligen vill lägga till den"
 
-#: git-submodule.sh:322
+#: git-submodule.sh:344
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
 
-#: git-submodule.sh:324
+#: git-submodule.sh:346
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "\"$sm_path\" finns redan och är inte ett giltigt git-arkiv"
 
-#: git-submodule.sh:338
+#: git-submodule.sh:360
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kan inte checka ut undermodulen \"$sm_path\""
 
-#: git-submodule.sh:343
+#: git-submodule.sh:365
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
 
-#: git-submodule.sh:348
+#: git-submodule.sh:370
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Misslyckades registrera undermodulen \"$sm_path\""
 
-#: git-submodule.sh:390
+#: git-submodule.sh:413
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
 msgstr "Går in i \"$prefix$sm_path\""
 
-#: git-submodule.sh:404
+#: git-submodule.sh:427
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
 msgstr ""
 "Stoppar på \"$sm_path\"; skriptet returnerade en status skild från noll."
 
-#: git-submodule.sh:447
+#: git-submodule.sh:471
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
 msgstr "Hittade ingen url för undermodulsökvägen \"$sm_path\" i .gitmodules"
 
-#: git-submodule.sh:456
+#: git-submodule.sh:480
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
 msgstr "Misslyckades registrera url för underkatalogsökväg \"$sm_path\""
 
-#: git-submodule.sh:458
+#: git-submodule.sh:482
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
 msgstr "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$sm_path\""
 
-#: git-submodule.sh:466
+#: git-submodule.sh:490
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
 msgstr ""
 "Misslyckades registrera uppdateringsläge för undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:565
+#: git-submodule.sh:590
 #, sh-format
 msgid ""
 "Submodule path '$sm_path' not initialized\n"
@@ -5910,93 +9292,131 @@
 "Undermodulen \"$sm_path\" har inte initierats\n"
 "Kanske du vill köra \"update --init\"?"
 
-#: git-submodule.sh:578
+#: git-submodule.sh:603
 #, sh-format
 msgid "Unable to find current revision in submodule path '$sm_path'"
 msgstr "Kan inte hitta aktuell revision i undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:597
+#: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:611
+#: git-submodule.sh:636
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$sm_path'"
 msgstr "Kan inte ombasera \"$sha1\" i undermodulsökväg \"$sm_path\""
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Submodule path '$sm_path': rebased into '$sha1'"
 msgstr "Undermodulsökvägen \"$sm_path\": ombaserade in i \"$sha1\""
 
-#: git-submodule.sh:617
+#: git-submodule.sh:642
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$sm_path'"
 msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:618
+#: git-submodule.sh:643
 #, sh-format
 msgid "Submodule path '$sm_path': merged in '$sha1'"
 msgstr "Undermodulsökvägen \"$sm_path\": sammanslagen i \"$sha1\""
 
-#: git-submodule.sh:623
+#: git-submodule.sh:648
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$sm_path'"
 msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:624
+#: git-submodule.sh:649
 #, sh-format
 msgid "Submodule path '$sm_path': checked out '$sha1'"
 msgstr "Undermodulsökvägen \"$sm_path\": checkade ut \"$sha1\""
 
-#: git-submodule.sh:646 git-submodule.sh:969
+#: git-submodule.sh:671 git-submodule.sh:995
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
 
-#: git-submodule.sh:754
+#: git-submodule.sh:779
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Flaggan --cached kan inte användas med flaggan --files"
 
 #. unexpected type
-#: git-submodule.sh:794
+#: git-submodule.sh:819
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "oväntat läge $mod_dst"
 
-#: git-submodule.sh:812
+#: git-submodule.sh:837
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
 msgstr "  Varning: $name innehåller inte incheckning $sha1_src"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
 msgstr "  Varning: $name innehåller inte incheckning $sha1_dst"
 
-#: git-submodule.sh:818
+#: git-submodule.sh:843
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  Varning: $name innehåller inte incheckningar $sha1_src och $sha1_dst"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:868
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:881
+#: git-submodule.sh:906
 msgid "# Submodules changed but not updated:"
 msgstr "# Undermoduler ändrade men inte uppdaterade:"
 
-#: git-submodule.sh:883
+#: git-submodule.sh:908
 msgid "# Submodule changes to be committed:"
 msgstr "# Undermodulers ändringar att checka in:"
 
-#: git-submodule.sh:1027
+#: git-submodule.sh:1054
 #, sh-format
 msgid "Synchronizing submodule url for '$name'"
 msgstr "Synkroniserar undermodul-url för \"$name\""
 
+#~ msgid " (use \"git add\" to track)"
+#~ msgstr " (spåra med \"git add\")"
+
+#~ msgid "-B cannot be used with -b"
+#~ msgstr "-B kan inte användas med -b"
+
+#~ msgid "--patch is incompatible with all other options"
+#~ msgstr "--patch är inkompatibel med alla andra flaggor"
+
+#~ msgid "--detach cannot be used with -b/-B/--orphan"
+#~ msgstr "--detcah kan inte användas med -b/-B/--orphan"
+
+#~ msgid "--detach cannot be used with -t"
+#~ msgstr "--detach kan inte användas med -t"
+
+#~ msgid "--orphan and -b|-B are mutually exclusive"
+#~ msgstr "--orphan och -b|-B kan inte användas samtidigt"
+
+#~ msgid "--orphan cannot be used with -t"
+#~ msgstr "--orphan kan inte användas med -t"
+
+#~ msgid "git checkout: -f and -m are incompatible"
+#~ msgstr "git checkout: -f och -m är inkompatibla"
+
+#~ msgid ""
+#~ "git checkout: updating paths is incompatible with switching branches."
+#~ msgstr ""
+#~ "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren."
+
+#~ msgid "diff setup failed"
+#~ msgstr "misslyckades sätta upp för diff"
+
+#~ msgid "merge-recursive: disk full?"
+#~ msgstr "merge-recursive: disk full?"
+
+#~ msgid "diff_setup_done failed"
+#~ msgstr "diff_setup_done misslyckades"
+
 #~ msgid "%s: has been deleted/renamed"
 #~ msgstr "%s: har tagits bort/ändrat namn"
 
@@ -6018,9 +9438,6 @@
 #~ msgid "--"
 #~ msgstr "--"
 
-#~ msgid "Too many options specified"
-#~ msgstr "För många flaggor angavs"
-
 #~ msgid "# Changed but not updated:"
 #~ msgstr "# Ändrade men inte uppdaterade:"
 
@@ -6045,26 +9462,17 @@
 #~ msgid "cannot mix --fixed-strings and regexp"
 #~ msgstr "kan inte blanda --fixed-strings och reguljära uttryck"
 
-#~ msgid "invalid --decorate option: %s"
-#~ msgstr "felaktigt värde till --decorate: %s"
-
 #~ msgid "%s; will overwrite!"
 #~ msgstr "%s; kommer skriva över!"
 
 #~ msgid "Failed to write current notes tree to database"
 #~ msgstr "Kunde inte skriva aktuellt anteckningsträd till databasen"
 
-#~ msgid "Failed to commit notes tree to database"
-#~ msgstr "Kunde inte checka in anteckningsträd i databasen"
-
 # FIXME: Untranslatable!
 #
 #~ msgid "Refusing to %s notes in %s (outside of refs/notes/)"
 #~ msgstr "Vägrar %s anteckningar i %s (utanför refs/notes/)"
 
-#~ msgid "list"
-#~ msgstr "list"
-
 #~ msgid "add"
 #~ msgstr "add"
 
diff --git a/po/vi.po b/po/vi.po
index f2c77ec..f858ce3 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -2,23 +2,22 @@
 # Copyright (C) 2012, Trần Ngọc Quân.
 # This file is distributed under the same license as the git-core package.
 # First translated by Trần Ngọc Quân <vnwildman@gmail.com>, 2012.
+# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: git-1.7.12-rc1-18-ge0453\n"
+"Project-Id-Version: git-1.7.12-146-g16d26\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2012-08-06 23:47+0800\n"
-"PO-Revision-Date: 2012-08-07 07:11+0700\n"
+"POT-Creation-Date: 2012-09-05 06:20+0800\n"
+"PO-Revision-Date: 2012-09-08 08:00+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
+"Language: vi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
 "Plural-Forms: nplurals=2; plural=1;\n"
-"X-Poedit-Language: Vietnamese\n"
-"X-Poedit-Country: VIET NAM\n"
-"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-SourceCharset: UTF-8\n"
 "X-Poedit-Basepath: ../\n"
 
 #: advice.c:40
@@ -38,9 +37,9 @@
 "or use 'git commit -a'."
 msgstr ""
 "Sửa chúng trong cây làm việc,\n"
-"và sau đó sử dụng lệnh 'git add/rm <tập-tin>'\n"
+"và sau đó dùng lệnh 'git add/rm <tập-tin>'\n"
 "dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao,\n"
-"hoặc là sử dụng lệnh 'git commit -a'."
+"hoặc là dùng lệnh 'git commit -a'."
 
 #: bundle.c:36
 #, c-format
@@ -52,8 +51,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "phần đầu (header) không được thừa nhận: %s%s (%d)"
 
-#: bundle.c:89
-#: builtin/commit.c:699
+#: bundle.c:89 builtin/commit.c:699
 #, c-format
 msgid "could not open '%s'"
 msgstr "không thể mở '%s'"
@@ -62,14 +60,8 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "Khó chứa thiếu những lần chuyển giao (commit) cần trước hết này:"
 
-#: bundle.c:164
-#: sequencer.c:550
-#: sequencer.c:982
-#: builtin/log.c:290
-#: builtin/log.c:726
-#: builtin/log.c:1316
-#: builtin/log.c:1535
-#: builtin/merge.c:347
+#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290
+#: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347
 #: builtin/shortlog.c:181
 msgid "revision walk setup failed"
 msgstr "Cài đặt việc di chuyển qua các điểm xét lại gặp lỗi"
@@ -96,9 +88,7 @@
 msgid "rev-list died"
 msgstr "rev-list bị chết"
 
-#: bundle.c:300
-#: builtin/log.c:1212
-#: builtin/shortlog.c:284
+#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "đối số không được thừa nhận: %s"
@@ -139,8 +129,7 @@
 msgid "%s %s is not a commit!"
 msgstr "%s %s không phải là một lần commit!"
 
-#: compat/obstack.c:406
-#: compat/obstack.c:408
+#: compat/obstack.c:406 compat/obstack.c:408
 msgid "memory exhausted"
 msgstr "cạn bộ nhớ"
 
@@ -218,8 +207,7 @@
 msgstr[0] "%s, %lu tháng trước"
 msgstr[1] "%s, %lu tháng trước"
 
-#: date.c:154
-#: date.c:159
+#: date.c:154 date.c:159
 #, c-format
 msgid "%lu year ago"
 msgid_plural "%lu years ago"
@@ -245,32 +233,32 @@
 "Tìm thấy các lỗi trong biến cấu hình 'diff.dirstat':\n"
 "%s"
 
-#: diff.c:1400
+#: diff.c:1401
 msgid " 0 files changed"
-msgstr " 0 có tập tin nào bị sửa đổi"
+msgstr " 0 có tập tin nào thay đổi cả"
 
-#: diff.c:1404
+#: diff.c:1405
 #, c-format
 msgid " %d file changed"
 msgid_plural " %d files changed"
-msgstr[0] " %d tập tin đã bị thay đổi"
-msgstr[1] " %d tập tin đã bị thay đổi"
+msgstr[0] " %d tập tin thay đổi"
+msgstr[1] " %d tập tin thay đổi"
 
-#: diff.c:1421
+#: diff.c:1422
 #, c-format
 msgid ", %d insertion(+)"
 msgid_plural ", %d insertions(+)"
-msgstr[0] ", %d được thêm vào(+)"
-msgstr[1] ", %d được thêm vào(+)"
+msgstr[0] ", %d thêm(+)"
+msgstr[1] ", %d thêm(+)"
 
-#: diff.c:1432
+#: diff.c:1433
 #, c-format
 msgid ", %d deletion(-)"
 msgid_plural ", %d deletions(-)"
-msgstr[0] ", %d bị xóa(-)"
-msgstr[1] ", %d bị xóa(-)"
+msgstr[0] ", %d xóa(-)"
+msgstr[1] ", %d xóa(-)"
 
-#: diff.c:3461
+#: diff.c:3460
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -334,7 +322,7 @@
 "WARNING: You called a Git command named '%s', which does not exist.\n"
 "Continuing under the assumption that you meant '%s'"
 msgstr ""
-"CẢNH BÁO: Bạn đã gọi lệnh Git có tên '%s', mà nó lại không sẵn có.\n"
+"CẢNH BÁO: Bạn đã gọi lệnh Git có tên '%s', mà nó lại không có sẵn.\n"
 "Giả định rằng ý bạn là '%s'"
 
 #: help.c:359
@@ -345,7 +333,7 @@
 #: help.c:366
 #, c-format
 msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr "git: '%s' không phải là một lệnh của git. Xem thêm 'git --help'."
+msgstr "git: '%s' không phải là một lệnh của git. Xem 'git --help'."
 
 #: help.c:370
 msgid ""
@@ -375,244 +363,245 @@
 msgid "error building trees"
 msgstr "gặp lỗi khi xây dựng cây"
 
-#: merge-recursive.c:497
-msgid "diff setup failed"
-msgstr "cài đặt diff gặp lỗi"
-
-#: merge-recursive.c:627
-msgid "merge-recursive: disk full?"
-msgstr "merge-recursive: đĩa bị đầy?"
-
-#: merge-recursive.c:690
+#: merge-recursive.c:672
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "gặp lỗi khi tạo đường dẫn '%s'%s"
 
-#: merge-recursive.c:701
+#: merge-recursive.c:683
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "Gỡ bỏ %s để tạo chỗ (room) cho thư mục con\n"
 
 #. something else exists
 #. .. but not some other error (who really cares what?)
-#: merge-recursive.c:715
-#: merge-recursive.c:736
+#: merge-recursive.c:697 merge-recursive.c:718
 msgid ": perhaps a D/F conflict?"
 msgstr ": có lẽ là một xung đột D/F?"
 
-#: merge-recursive.c:726
+#: merge-recursive.c:708
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "từ chối đóng tập tin không được theo vết tại '%s'"
 
-#: merge-recursive.c:766
+#: merge-recursive.c:748
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "không thể đọc đối tượng %s '%s'"
 
-#: merge-recursive.c:768
+#: merge-recursive.c:750
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "đối tượng blob được mong đợi cho %s '%s'"
 
-#: merge-recursive.c:791
-#: builtin/clone.c:302
+#: merge-recursive.c:773 builtin/clone.c:302
 #, c-format
 msgid "failed to open '%s'"
 msgstr "gặp lỗi khi mở '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
-msgstr "gặp lỗi khi tạo liên kết tượng trưng symlink '%s'"
+msgstr "gặp lỗi khi tạo liên kết tượng trưng (symlink) '%s'"
 
-#: merge-recursive.c:802
+#: merge-recursive.c:784
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "không hiểu phải làm gì với %06o %s '%s'"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:921
 msgid "Failed to execute internal merge"
 msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:925
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "Không thể thêm %s vào cơ sở dữ liệu"
 
-#: merge-recursive.c:959
+#: merge-recursive.c:941
 msgid "unsupported object type in the tree"
 msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)"
 
-#: merge-recursive.c:1038
-#: merge-recursive.c:1052
+#: merge-recursive.c:1020 merge-recursive.c:1034
 #, c-format
-msgid "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left in tree."
-msgstr "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s còn lại trong cây (tree)."
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
+"còn lại trong cây (tree)."
 
-#: merge-recursive.c:1044
-#: merge-recursive.c:1057
+#: merge-recursive.c:1026 merge-recursive.c:1039
 #, c-format
-msgid "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left in tree at %s."
-msgstr "XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s còn lại trong cây (tree) tại %s."
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"XUNG ĐỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
+"còn lại trong cây (tree) tại %s."
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1080
 msgid "rename"
 msgstr "đổi tên"
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1080
 msgid "renamed"
 msgstr "đã đổi tên"
 
-#: merge-recursive.c:1154
+#: merge-recursive.c:1136
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
 
-#: merge-recursive.c:1176
+#: merge-recursive.c:1158
 #, c-format
-msgid "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s\"->\"%s\" in \"%s\"%s"
-msgstr "XUNG ĐỘT (đổi tên/đổi tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi tên \"%s\"->\"%s\" trong \"%s\"%s"
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
+"tên \"%s\"->\"%s\" trong \"%s\"%s"
 
-#: merge-recursive.c:1181
+#: merge-recursive.c:1163
 msgid " (left unresolved)"
 msgstr " (cần giải quyết)"
 
-#: merge-recursive.c:1235
+#: merge-recursive.c:1217
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr "XUNG ĐỘT (đổi tên/đổi tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/đổi-tên): Đổi tên %s->%s trong %s. Đổi tên %s->%s trong %s"
 
-#: merge-recursive.c:1265
+#: merge-recursive.c:1247
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "Đang đổi tên %s thành %s thay vì %s thành %s"
 
-#: merge-recursive.c:1464
+#: merge-recursive.c:1446
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
-msgstr "XUNG ĐỘT (đổi tên/thêm): Đổi tên %s->%s trong %s. %s được thêm vào trong %s"
+msgstr ""
+"XUNG ĐỘT (đổi-tên/thêm): Đổi tên %s->%s trong %s. %s được thêm vào trong %s"
 
-#: merge-recursive.c:1474
+#: merge-recursive.c:1456
 #, c-format
 msgid "Adding merged %s"
 msgstr "Thêm hòa trộn %s"
 
-#: merge-recursive.c:1479
-#: merge-recursive.c:1677
+#: merge-recursive.c:1461 merge-recursive.c:1659
 #, c-format
 msgid "Adding as %s instead"
 msgstr "Thay vào đó thêm vào %s"
 
-#: merge-recursive.c:1530
+#: merge-recursive.c:1512
 #, c-format
 msgid "cannot read object %s"
 msgstr "không thể đọc đối tượng %s"
 
-#: merge-recursive.c:1533
+#: merge-recursive.c:1515
 #, c-format
 msgid "object %s is not a blob"
 msgstr "đối tượng %s không phải là một blob"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1563
 msgid "modify"
 msgstr "sửa đổi"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1563
 msgid "modified"
-msgstr "đã sửa"
+msgstr "đã bị sửa"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1573
 msgid "content"
 msgstr "nội dung"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1580
 msgid "add/add"
 msgstr "thêm/thêm"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1614
 #, c-format
 msgid "Skipped %s (merged same as existing)"
-msgstr "Đã bỏ qua %s (đã sẵn có lần hòa trộn này)"
+msgstr "Đã bỏ qua %s (đã có sẵn lần hòa trộn này)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1628
 #, c-format
 msgid "Auto-merging %s"
 msgstr "Tự-động-hòa-trộn %s"
 
-#: merge-recursive.c:1650
-#: git-submodule.sh:844
+#: merge-recursive.c:1632 git-submodule.sh:869
 msgid "submodule"
 msgstr "mô-đun con"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1633
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "XUNG ĐỘT (%s): Xung đột hòa trộn trong %s"
 
-#: merge-recursive.c:1741
+#: merge-recursive.c:1723
 #, c-format
 msgid "Removing %s"
 msgstr "Đang xóa %s"
 
-#: merge-recursive.c:1766
+#: merge-recursive.c:1748
 msgid "file/directory"
 msgstr "tập-tin/thư-mục"
 
-#: merge-recursive.c:1772
+#: merge-recursive.c:1754
 msgid "directory/file"
 msgstr "thư-mục/tập tin"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1759
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr "XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là %s"
+msgstr ""
+"XUNG ĐỘT (%s): Ở đây không có thư mục nào có tên %s trong %s. Thêm %s như là "
+"%s"
 
-#: merge-recursive.c:1787
+#: merge-recursive.c:1769
 #, c-format
 msgid "Adding %s"
-msgstr "Đang thêm \"%s\""
+msgstr "Thêm \"%s\""
 
-#: merge-recursive.c:1804
+#: merge-recursive.c:1786
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "Việc hòa trộn hỏng nghiêm trọng, không nên để xảy ra."
 
-#: merge-recursive.c:1823
+#: merge-recursive.c:1805
 msgid "Already up-to-date!"
 msgstr "Đã cập nhật rồi!"
 
-#: merge-recursive.c:1832
+#: merge-recursive.c:1814
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "hòa trộn cây (tree) %s và %s gặp lỗi"
 
-#: merge-recursive.c:1862
+#: merge-recursive.c:1844
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "Đường dẫn chưa được xử lý??? %s"
 
-#: merge-recursive.c:1907
+#: merge-recursive.c:1889
 msgid "Merging:"
 msgstr "Đang trộn:"
 
-#: merge-recursive.c:1920
+#: merge-recursive.c:1902
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "tìm thấy %u tổ tiên chung:"
 msgstr[1] "tìm thấy %u tổ tiên chung:"
 
-#: merge-recursive.c:1957
+#: merge-recursive.c:1939
 msgid "merge returned no commit"
 msgstr "hòa trộn không trả về lần chuyển giao (commit) nào"
 
-#: merge-recursive.c:2014
+#: merge-recursive.c:1996
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "Không thể phân tích đối tượng '%s'"
 
-#: merge-recursive.c:2026
-#: builtin/merge.c:697
+#: merge-recursive.c:2008 builtin/merge.c:696
 msgid "Unable to write index."
 msgstr "Không thể ghi bảng mục lục"
 
@@ -623,14 +612,14 @@
 #: parse-options.c:512
 #, c-format
 msgid "usage: %s"
-msgstr "cách sử dụng: %s"
+msgstr "cách dùng: %s"
 
 #. TRANSLATORS: the colon here should align with the
 #. one in "usage: %s" translation
 #: parse-options.c:516
 #, c-format
 msgid "   or: %s"
-msgstr "   hoặc: %s"
+msgstr "     hoặc: %s"
 
 #: parse-options.c:519
 #, c-format
@@ -647,9 +636,14 @@
 #: remote.c:1638
 #, c-format
 msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] "Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể được fast-forward.\n"
-msgstr[1] "Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể được fast-forward.\n"
+msgid_plural ""
+"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
+msgstr[0] ""
+"Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể "
+"được fast-forward.\n"
+msgstr[1] ""
+"Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể "
+"được fast-forward.\n"
 
 #: remote.c:1646
 #, c-format
@@ -667,20 +661,14 @@
 "Your branch and '%s' have diverged,\n"
 "and have %d and %d different commit each, respectively.\n"
 
-#: sequencer.c:121
-#: builtin/merge.c:865
-#: builtin/merge.c:978
-#: builtin/merge.c:1088
-#: builtin/merge.c:1098
+#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977
+#: builtin/merge.c:1087 builtin/merge.c:1097
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "Không thể mở %s' để ghi"
 
-#: sequencer.c:123
-#: builtin/merge.c:333
-#: builtin/merge.c:868
-#: builtin/merge.c:1090
-#: builtin/merge.c:1103
+#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867
+#: builtin/merge.c:1089 builtin/merge.c:1102
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "Không thể ghi vào '%s'"
@@ -703,9 +691,7 @@
 "với lệnh 'git add <đường_dẫn>' hoặc 'git rm <đường_dẫn>'\n"
 "và chuyển giao (commit) kết quả bằng lệnh 'git commit'"
 
-#: sequencer.c:160
-#: sequencer.c:758
-#: sequencer.c:841
+#: sequencer.c:160 sequencer.c:758 sequencer.c:841
 #, c-format
 msgid "Could not write to %s"
 msgstr "Không thể ghi vào %s"
@@ -725,7 +711,7 @@
 
 #: sequencer.c:183
 msgid "Commit your changes or stash them to proceed."
-msgstr "Chuyển giao (commit) các thay đổi hay stash chúng để tiến hành."
+msgstr "Chuyển giao (commit) các thay đổi của bạn hay stash chúng để xử lý."
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
 #: sequencer.c:233
@@ -762,7 +748,9 @@
 #: sequencer.c:413
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
-msgstr "Lần chuyển giao (commit) %s là một lần hòa trộn nhưng không đưa ra tùy chọn  -m."
+msgstr ""
+"Lần chuyển giao (commit) %s là một lần hòa trộn nhưng không đưa ra tùy chọn -"
+"m."
 
 #: sequencer.c:421
 #, c-format
@@ -772,7 +760,9 @@
 #: sequencer.c:425
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
-msgstr "Luồng chính được chỉ định nhưng lần chuyển giao (commit) %s không phải là một lần hòa trộn."
+msgstr ""
+"Luồng chính được chỉ ra nhưng lần chuyển giao (commit) %s không phải là một "
+"lần hòa trộn."
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
@@ -867,14 +857,12 @@
 msgid "Could not create sequencer directory %s"
 msgstr "Không thể tạo thư mục xếp dãy %s"
 
-#: sequencer.c:760
-#: sequencer.c:845
+#: sequencer.c:760 sequencer.c:845
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "Lỗi bao bọc %s."
 
-#: sequencer.c:779
-#: sequencer.c:913
+#: sequencer.c:779 sequencer.c:913
 msgid "no cherry-pick or revert in progress"
 msgstr "không cherry-pick hay revert trong tiến trình"
 
@@ -886,8 +874,7 @@
 msgid "cannot abort from a branch yet to be born"
 msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra"
 
-#: sequencer.c:805
-#: builtin/apply.c:3988
+#: sequencer.c:805 builtin/apply.c:3987
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "không thể mở %s: %s"
@@ -936,7 +923,9 @@
 #: sha1_name.c:1052
 #, c-format
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
-msgstr "Nhánh dòng ngược (upstream) '%s' không được lưu lại như là một nhánh 'remote-tracking'"
+msgstr ""
+"Nhánh dòng ngược (upstream) '%s' không được lưu lại như là một nhánh 'remote-"
+"tracking'"
 
 #: wrapper.c:413
 #, c-format
@@ -951,29 +940,28 @@
 msgid "Unmerged paths:"
 msgstr "Những đường dẫn chưa được hòa trộn:"
 
-#: wt-status.c:167
-#: wt-status.c:194
+#: wt-status.c:167 wt-status.c:194
 #, c-format
 msgid "  (use \"git reset %s <file>...\" to unstage)"
-msgstr "  (sử dụng \"git reset %s <tập-tin>...\" để bỏ một stage (trạng thái))"
+msgstr "  (dùng \"git reset %s <tập-tin>...\" để bỏ một stage (trạng thái))"
 
-#: wt-status.c:169
-#: wt-status.c:196
+#: wt-status.c:169 wt-status.c:196
 msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr "  (sử dụng \"git rm --cached <tập-tin>...\" để bỏ trạng thái (stage))"
+msgstr "  (dùng \"git rm --cached <tập-tin>...\" để bỏ trạng thái (stage))"
 
 #: wt-status.c:173
 msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr "  (sử dụng \"git add <tập-tin>...\" để đánh dấu là cần giải quyết)"
+msgstr "  (dùng \"git add <tập-tin>...\" để đánh dấu là cần giải quyết)"
 
-#: wt-status.c:175
-#: wt-status.c:179
+#: wt-status.c:175 wt-status.c:179
 msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr "  (sử dụng \"git add/rm <tập-tin>...\" như là một cách  thích hợp để đánh dấu là cần được giải quyết)"
+msgstr ""
+"  (dùng \"git add/rm <tập-tin>...\" như là một cách  thích hợp để đánh "
+"dấu là cần được giải quyết)"
 
 #: wt-status.c:177
 msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr "  (sử dụng \"git rm <tập-tin>...\" để đánh dấu là cần giải quyết)"
+msgstr "  (dùng \"git rm <tập-tin>...\" để đánh dấu là cần giải quyết)"
 
 #: wt-status.c:188
 msgid "Changes to be committed:"
@@ -981,33 +969,45 @@
 
 #: wt-status.c:206
 msgid "Changes not staged for commit:"
-msgstr "Các thay đổi không được đặt trạng thái (stage) cho lần chuyển giao (commit):"
+msgstr ""
+"Các thay đổi không được đặt trạng thái (stage) cho lần chuyển giao (commit):"
 
 #: wt-status.c:210
 msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr "  (sử dụng \"git add <tập-tin>...\" để cập nhật những gì cần chuyển giao (commit))"
+msgstr ""
+"  (dùng \"git add <tập-tin>...\" để cập nhật những gì cần chuyển giao "
+"(commit))"
 
 #: wt-status.c:212
 msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr "  (sử dụng \"git add/rm <tập_tin>...\" để cập nhật những gì sẽ được chuyển giao)"
+msgstr ""
+"  (dùng \"git add/rm <tập-tin>...\" để cập nhật những gì sẽ được chuyển "
+"giao)"
 
 #: wt-status.c:213
-msgid "  (use \"git checkout -- <file>...\" to discard changes in working directory)"
-msgstr "  (sử dụng \"git checkout -- <tập_tin>...\" để loại bỏ những thay đổi trong thư mục làm việc)"
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (dùng \"git checkout -- <tập-tin>...\" để bỏ thay đổi trong thư mục làm "
+"việc)"
 
 #: wt-status.c:215
 msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr "  (chuyển giao (commit) hoặc là loại bỏ các nội dung không-bị-theo-vết hay đã bị chỉnh sửa trong mô-đun-con)"
+msgstr ""
+"  (chuyển giao (commit) hoặc là loại bỏ các nội dung không-bị-theo-vết hay "
+"đã bị chỉnh sửa trong mô-đun-con)"
 
 #: wt-status.c:224
 #, c-format
 msgid "%s files:"
-msgstr "%s tệp tin:"
+msgstr "%s tập tin:"
 
 #: wt-status.c:227
 #, c-format
 msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr "  (sử dụng \"git %s <tập-tin>...\" để bao gồm thêm vào những gì cần chuyển giao (commit))"
+msgstr ""
+"  (dùng \"git %s <tập-tin>...\" để thêm vào những gì cần chuyển giao "
+"(commit))"
 
 #: wt-status.c:244
 msgid "bug"
@@ -1043,15 +1043,15 @@
 
 #: wt-status.c:285
 msgid "new commits, "
-msgstr " lần chuyển giao (commit) mới, "
+msgstr "lần chuyển giao (commit) mới, "
 
 #: wt-status.c:287
 msgid "modified content, "
-msgstr "nội dung được sửa đổi,"
+msgstr "nội dung được sửa đổi, "
 
 #: wt-status.c:289
 msgid "untracked content, "
-msgstr "nội dung chưa được theo dõi"
+msgstr "nội dung chưa được theo dõi, "
 
 #: wt-status.c:303
 #, c-format
@@ -1066,12 +1066,12 @@
 #: wt-status.c:309
 #, c-format
 msgid "deleted:    %s"
-msgstr "bị xóa:    %s"
+msgstr "đã xóa:    %s"
 
 #: wt-status.c:312
 #, c-format
 msgid "modified:   %s"
-msgstr "bị sửa đổi:   %s"
+msgstr "đã sửa đổi:   %s"
 
 #: wt-status.c:315
 #, c-format
@@ -1086,7 +1086,7 @@
 #: wt-status.c:321
 #, c-format
 msgid "unknown:    %s"
-msgstr "không rõ:    %s"
+msgstr "không hiểu:    %s"
 
 #: wt-status.c:324
 #, c-format
@@ -1102,8 +1102,7 @@
 msgid "You have unmerged paths."
 msgstr "Bạn có những đường dẫn chưa được hòa trộn."
 
-#: wt-status.c:788
-#: wt-status.c:912
+#: wt-status.c:788 wt-status.c:912
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr "  (sửa các xung đột sau đó chạy \"git commit\")"
 
@@ -1113,7 +1112,7 @@
 
 #: wt-status.c:794
 msgid "  (use \"git commit\" to conclude merge)"
-msgstr "  (sử dụng \"git commit\" để hoàn tất việc hòa trộn)"
+msgstr "  (dùng \"git commit\" để hoàn tất việc hòa trộn)"
 
 #: wt-status.c:804
 msgid "You are in the middle of an am session."
@@ -1129,14 +1128,13 @@
 
 #: wt-status.c:813
 msgid "  (use \"git am --skip\" to skip this patch)"
-msgstr "  (sử dụng \"git am --skip\" để bỏ qua lần vá này)"
+msgstr "  (dùng \"git am --skip\" để bỏ qua lần vá này)"
 
 #: wt-status.c:815
 msgid "  (use \"git am --abort\" to restore the original branch)"
-msgstr "  (sử dụng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
+msgstr "  (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
 
-#: wt-status.c:873
-#: wt-status.c:883
+#: wt-status.c:873 wt-status.c:883
 msgid "You are currently rebasing."
 msgstr "Bạn hiện nay đang thực hiện việc rebase (tái cấu trúc)."
 
@@ -1146,23 +1144,28 @@
 
 #: wt-status.c:878
 msgid "  (use \"git rebase --skip\" to skip this patch)"
-msgstr "  (sử dụng \"git rebase --skip\" để bỏ qua lần vá này)"
+msgstr "  (dùng \"git rebase --skip\" để bỏ qua lần vá này)"
 
 #: wt-status.c:880
 msgid "  (use \"git rebase --abort\" to check out the original branch)"
-msgstr "  (sử dụng \"git rebase --abort\" để check-out nhánh nguyên thủy)"
+msgstr "  (dùng \"git rebase --abort\" để check-out nhánh nguyên thủy)"
 
 #: wt-status.c:886
 msgid "  (all conflicts fixed: run \"git rebase --continue\")"
-msgstr "  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git rebase --continue\")"
+msgstr ""
+"  (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git rebase --continue\")"
 
 #: wt-status.c:888
 msgid "You are currently splitting a commit during a rebase."
-msgstr "Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc rebase."
+msgstr ""
+"Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
+"rebase."
 
 #: wt-status.c:891
 msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
-msgstr "  (Một khi thư mục làm việc của bạn đã gọn gàng, chạy \"git rebase --continue\")"
+msgstr ""
+"  (Một khi thư mục làm việc của bạn đã gọn gàng, chạy \"git rebase --continue"
+"\")"
 
 #: wt-status.c:893
 msgid "You are currently editing a commit during a rebase."
@@ -1170,11 +1173,15 @@
 
 #: wt-status.c:896
 msgid "  (use \"git commit --amend\" to amend the current commit)"
-msgstr "  (sử dụng \"git commit --amend\" để tu bổ lần chuyển giao (commit) hiện tại)"
+msgstr ""
+"  (dùng \"git commit --amend\" để tu bổ lần chuyển giao (commit) hiện tại)"
 
 #: wt-status.c:898
-msgid "  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (sử dụng \"git rebase --continue\" một khi bạn cảm thấy hài lòng về những thay đổi của mình)"
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr ""
+"  (dùng \"git rebase --continue\" một khi bạn cảm thấy hài lòng về những "
+"thay đổi của mình)"
 
 #: wt-status.c:908
 msgid "You are currently cherry-picking."
@@ -1190,11 +1197,11 @@
 
 #: wt-status.c:927
 msgid "  (use \"git bisect reset\" to get back to the original branch)"
-msgstr "  (sử dụng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
+msgstr "  (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
 
 #: wt-status.c:978
 msgid "On branch "
-msgstr "Trên nhánh"
+msgstr "Trên nhánh "
 
 #: wt-status.c:985
 msgid "Not currently on any branch."
@@ -1219,7 +1226,7 @@
 
 #: wt-status.c:1017
 msgid " (use -u option to show untracked files)"
-msgstr " (sử dụng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
+msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
 
 #: wt-status.c:1023
 msgid "No changes"
@@ -1232,31 +1239,31 @@
 
 #: wt-status.c:1029
 msgid " (use \"git add\" and/or \"git commit -a\")"
-msgstr " (sử dụng \"git add\" và/hoặc \"git commit -a\")"
+msgstr " (dùng \"git add\" và/hoặc \"git commit -a\")"
 
 #: wt-status.c:1031
 #, c-format
 msgid "nothing added to commit but untracked files present%s\n"
-msgstr "không có gì được thêm vào lần chuyển giao (commit) nhưng có những tập tin không được theo dấu vết hiện diện%s\n"
+msgstr ""
+"không có gì được thêm vào lần chuyển giao (commit) nhưng có những tập tin "
+"không được theo dấu vết hiện diện%s\n"
 
 #: wt-status.c:1033
 msgid " (use \"git add\" to track)"
-msgstr " (sử dụng \"git add\" để theo dõi dấu vết)"
+msgstr " (dùng \"git add\" để theo dõi dấu vết)"
 
-#: wt-status.c:1035
-#: wt-status.c:1038
-#: wt-status.c:1041
+#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041
 #, c-format
 msgid "nothing to commit%s\n"
 msgstr "không có gì để chuyển giao (commit) %s\n"
 
 #: wt-status.c:1036
 msgid " (create/copy files and use \"git add\" to track)"
-msgstr " (tạo/sao-chép các tập tin và sử dụng \"git add\" để theo dõi dấu vết)"
+msgstr " (tạo/sao-chép các tập tin và dùng \"git add\" để theo dõi dấu vết)"
 
 #: wt-status.c:1039
 msgid " (use -u to show untracked files)"
-msgstr " (sử dụng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
+msgstr " (dùng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)"
 
 #: wt-status.c:1042
 msgid " (working directory clean)"
@@ -1264,32 +1271,35 @@
 
 #: wt-status.c:1150
 msgid "HEAD (no branch)"
-msgstr "HEAD (chưa có nhánh nào)"
+msgstr "HEAD (không nhánh)"
 
 #: wt-status.c:1156
 msgid "Initial commit on "
-msgstr "Lần chuyển giao (commit)  khởi tạo trên"
+msgstr "Lần chuyển giao (commit) khởi tạo trên "
 
 #: wt-status.c:1171
 msgid "behind "
-msgstr "đằng sau"
+msgstr "đằng sau "
 
-#: wt-status.c:1174
-#: wt-status.c:1177
+#: wt-status.c:1174 wt-status.c:1177
 msgid "ahead "
-msgstr "phía trước"
+msgstr "phía trước "
 
 #: wt-status.c:1179
 msgid ", behind "
-msgstr ", đằng sau"
+msgstr ", đằng sau "
+
+#: compat/precompose_utf8.c:58 builtin/clone.c:341
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "bỏ liên kết (unlink) %s không thành công"
 
 #: builtin/add.c:62
 #, c-format
 msgid "unexpected diff status %c"
 msgstr "trạng thái lệnh diff không như mong đợi %c"
 
-#: builtin/add.c:67
-#: builtin/commit.c:229
+#: builtin/add.c:67 builtin/commit.c:229
 msgid "updating files failed"
 msgstr "Cập nhật tập tin gặp lỗi"
 
@@ -1305,11 +1315,10 @@
 
 #: builtin/add.c:192
 msgid "Unstaged changes after refreshing the index:"
-msgstr "Các thay đổi không được lưu trạng thái sau khi làm tươi mới lại bảng mục lục:"
+msgstr ""
+"Các thay đổi không được lưu trạng thái sau khi làm tươi mới lại bảng mục lục:"
 
-#: builtin/add.c:195
-#: builtin/add.c:459
-#: builtin/rm.c:186
+#: builtin/add.c:195 builtin/add.c:459 builtin/rm.c:186
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "pathspec '%s' không khớp với bất kỳ tập tin nào"
@@ -1348,7 +1357,9 @@
 
 #: builtin/add.c:312
 msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore của bạn:\n"
+msgstr ""
+"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
+"của bạn:\n"
 
 #: builtin/add.c:352
 #, c-format
@@ -1369,7 +1380,7 @@
 
 #: builtin/add.c:393
 msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr "Tùy chọn --ignore-missing chỉ có thể được sử dụng cùng với --dry-run"
+msgstr "Tùy chọn --ignore-missing chỉ có thể được dùng cùng với --dry-run"
 
 #: builtin/add.c:413
 #, c-format
@@ -1381,18 +1392,12 @@
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Có lẽ bạn muốn nói là 'git add .' phải không?\n"
 
-#: builtin/add.c:420
-#: builtin/clean.c:95
-#: builtin/commit.c:289
-#: builtin/mv.c:82
+#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
 #: builtin/rm.c:162
 msgid "index file corrupt"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/add.c:480
-#: builtin/apply.c:4433
-#: builtin/mv.c:229
-#: builtin/rm.c:260
+#: builtin/add.c:480 builtin/apply.c:4432 builtin/mv.c:229 builtin/rm.c:260
 msgid "Unable to write new index file"
 msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
 
@@ -1410,134 +1415,144 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng '%s'"
 
-#: builtin/apply.c:824
+#: builtin/apply.c:823
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
-msgstr "Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) %s"
+msgstr ""
+"Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) "
+"%s"
 
-#: builtin/apply.c:833
+#: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "thi hành biểu thức chính quy trả về %d cho kết xuất: %s"
 
-#: builtin/apply.c:914
+#: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d"
 
-#: builtin/apply.c:946
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
 msgstr "git apply: git-diff sai - mong đợi /dev/null, đã nhận %s trên dòng %d"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply: git-diff sai - tên tập tin mới mâu thuấn trên dòng %d"
 
-#: builtin/apply.c:951
+#: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply: git-diff sai - tên tập tin cũ mâu thuấn trên dòng %d"
 
-#: builtin/apply.c:958
+#: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
 msgstr "git apply: git-diff sai - mong đợi /dev/null trên dòng %d"
 
-#: builtin/apply.c:1403
+#: builtin/apply.c:1402
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "chi tiết: dòng không được mong đợi: %.*s"
 
-#: builtin/apply.c:1460
+#: builtin/apply.c:1459
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s"
 
-#: builtin/apply.c:1477
+#: builtin/apply.c:1476
 #, c-format
-msgid "git diff header lacks filename information when removing %d leading pathname component (line %d)"
-msgid_plural "git diff header lacks filename information when removing %d leading pathname components (line %d)"
-msgstr[0] "phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong thành phần dẫn đầu tên của đường dẫn (dòng %d)"
-msgstr[1] "phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong thành phần dẫn đầu tên của đường dẫn (dòng %d)"
+msgid ""
+"git diff header lacks filename information when removing %d leading pathname "
+"component (line %d)"
+msgid_plural ""
+"git diff header lacks filename information when removing %d leading pathname "
+"components (line %d)"
+msgstr[0] ""
+"phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
+"thành phần dẫn đầu tên của đường dẫn (dòng %d)"
+msgstr[1] ""
+"phần đầu diff cho git  thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong "
+"thành phần dẫn đầu tên của đường dẫn (dòng %d)"
 
-#: builtin/apply.c:1637
+#: builtin/apply.c:1636
 msgid "new file depends on old contents"
 msgstr "tập tin mới phụ thuộc vào nội dung cũ"
 
-#: builtin/apply.c:1639
+#: builtin/apply.c:1638
 msgid "deleted file still has contents"
 msgstr "tập tin đã xóa vẫn còn nội dung"
 
-#: builtin/apply.c:1665
+#: builtin/apply.c:1664
 #, c-format
 msgid "corrupt patch at line %d"
 msgstr "miếng vá hỏng tại dòng %d"
 
-#: builtin/apply.c:1701
+#: builtin/apply.c:1700
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "tập tin mới %s phụ thuộc vào nội dung cũ"
 
-#: builtin/apply.c:1703
+#: builtin/apply.c:1702
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "tập tin đã xóa %s vẫn còn nội dung"
 
-#: builtin/apply.c:1706
+#: builtin/apply.c:1705
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa"
 
-#: builtin/apply.c:1852
+#: builtin/apply.c:1851
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s"
 
 #. there has to be one hunk (forward hunk)
-#: builtin/apply.c:1881
+#: builtin/apply.c:1880
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d"
 
-#: builtin/apply.c:1967
+#: builtin/apply.c:1966
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "vá chỉ với 'garbage' tại dòng %d"
 
-#: builtin/apply.c:2057
+#: builtin/apply.c:2056
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "không thể đọc liên kết tượng trưng %s"
 
-#: builtin/apply.c:2061
+#: builtin/apply.c:2060
 #, c-format
 msgid "unable to open or read %s"
 msgstr "không thể mở để đọc hay ghi %s"
 
-#: builtin/apply.c:2132
+#: builtin/apply.c:2131
 msgid "oops"
 msgstr "ôi?"
 
-#: builtin/apply.c:2654
+#: builtin/apply.c:2653
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "sai khởi đầu dòng: '%c'"
 
-#: builtin/apply.c:2772
+#: builtin/apply.c:2771
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
 msgstr[1] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)."
 
-#: builtin/apply.c:2784
+#: builtin/apply.c:2783
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr "Nội dung được giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
+msgstr "Nội dung bị giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %d"
 
-#: builtin/apply.c:2790
+#: builtin/apply.c:2789
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -1546,334 +1561,327 @@
 "Trong khi đang tìm kiếm cho:\n"
 "%.*s"
 
-#: builtin/apply.c:2809
+#: builtin/apply.c:2808
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho '%s'"
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2911
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "miếng vá định dạng nhị phân không được áp dụng cho '%s'"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2917
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "vá nhị phân cho '%s' tạo ra kết quả không chính xác (đang chờ %s, đã nhận %s)"
+msgstr ""
+"vá nhị phân cho '%s' tạo ra kết quả không chính xác (mong chờ %s, lại nhận %s)"
 
-#: builtin/apply.c:2939
+#: builtin/apply.c:2938
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "vá gặp lỗi: %s:%ld"
 
-#: builtin/apply.c:3061
+#: builtin/apply.c:3060
 #, c-format
 msgid "cannot checkout %s"
 msgstr "không thể \"checkout\" %s"
 
-#: builtin/apply.c:3106
-#: builtin/apply.c:3115
-#: builtin/apply.c:3159
+#: builtin/apply.c:3105 builtin/apply.c:3114 builtin/apply.c:3158
 #, c-format
 msgid "read of %s failed"
 msgstr "đọc %s gặp lỗi"
 
-#: builtin/apply.c:3139
-#: builtin/apply.c:3361
+#: builtin/apply.c:3138 builtin/apply.c:3360
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "đường dẫn %s đã bị xóa/đổi tên"
 
-#: builtin/apply.c:3220
-#: builtin/apply.c:3375
+#: builtin/apply.c:3219 builtin/apply.c:3374
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s: không tồn tại trong bảng mục lục"
 
-#: builtin/apply.c:3224
-#: builtin/apply.c:3367
-#: builtin/apply.c:3389
+#: builtin/apply.c:3223 builtin/apply.c:3366 builtin/apply.c:3388
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: builtin/apply.c:3229
-#: builtin/apply.c:3383
+#: builtin/apply.c:3228 builtin/apply.c:3382
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s: không khớp trong mục lục"
 
-#: builtin/apply.c:3331
+#: builtin/apply.c:3330
 msgid "removal patch leaves file contents"
 msgstr "loại bỏ miếng vá để lại nội dung tập tin"
 
-#: builtin/apply.c:3400
+#: builtin/apply.c:3399
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s: sai kiểu"
 
-#: builtin/apply.c:3402
+#: builtin/apply.c:3401
 #, c-format
 msgid "%s has type %o, expected %o"
 msgstr "%s có kiểu %o, mong chờ %o"
 
-#: builtin/apply.c:3503
+#: builtin/apply.c:3502
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s: đã có từ trước trong bảng mục lục"
 
-#: builtin/apply.c:3506
+#: builtin/apply.c:3505
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s: đã sẵn có trong thư mục đang làm việc"
 
-#: builtin/apply.c:3526
+#: builtin/apply.c:3525
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)"
 
-#: builtin/apply.c:3531
+#: builtin/apply.c:3530
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s"
 
-#: builtin/apply.c:3539
+#: builtin/apply.c:3538
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s: miếng vá không được áp dụng"
 
-#: builtin/apply.c:3552
+#: builtin/apply.c:3551
 #, c-format
 msgid "Checking patch %s..."
 msgstr "Đang kiểm tra miếng vá %s..."
 
-#: builtin/apply.c:3607
-#: builtin/checkout.c:213
-#: builtin/reset.c:158
+#: builtin/apply.c:3606 builtin/checkout.c:213 builtin/reset.c:158
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "make_cache_entry gặp lỗi đối với đường dẫn '%s'"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3749
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "không thể gỡ bỏ %s từ mục lục"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3777
 #, c-format
 msgid "corrupt patch for subproject %s"
 msgstr "miếng vá sai hỏng cho dự án con (subproject) %s"
 
-#: builtin/apply.c:3782
+#: builtin/apply.c:3781
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "không thể lấy trạng thái về tập tin %s mới hơn đã được tạo"
 
-#: builtin/apply.c:3787
+#: builtin/apply.c:3786
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "không thể tạo 'backing store' cho tập tin được tạo mới hơn %s"
 
-#: builtin/apply.c:3790
-#: builtin/apply.c:3898
+#: builtin/apply.c:3789 builtin/apply.c:3897
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "không thể thêm mục nhớ tạm cho %s"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3822
 #, c-format
 msgid "closing file '%s'"
 msgstr "đang đóng tập tin '%s'"
 
-#: builtin/apply.c:3872
+#: builtin/apply.c:3871
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "không thể ghi vào tập tin '%s' chế độ (mode) %o"
 
-#: builtin/apply.c:3959
+#: builtin/apply.c:3958
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "Đã áp dụng miếng và %s một cách sạch sẽ."
 
-#: builtin/apply.c:3967
+#: builtin/apply.c:3966
 msgid "internal error"
 msgstr "lỗi nội bộ"
 
 #. Say this even without --verbose
-#: builtin/apply.c:3970
+#: builtin/apply.c:3969
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
 msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối..."
 msgstr[1] "Đang áp dụng miếng vá %%s với %d lần từ chối..."
 
-#: builtin/apply.c:3980
+#: builtin/apply.c:3979
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "đang cắt cụt tên tập tin .rej thành %.*s.rej"
 
-#: builtin/apply.c:4001
+#: builtin/apply.c:4000
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "Khối nhớ #%d được áp dụng gọn gàng."
 
-#: builtin/apply.c:4004
+#: builtin/apply.c:4003
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "hunk #%d bị từ chối."
 
-#: builtin/apply.c:4154
+#: builtin/apply.c:4153
 msgid "unrecognized input"
 msgstr "không thừa nhận đầu vào"
 
-#: builtin/apply.c:4165
+#: builtin/apply.c:4164
 msgid "unable to read index file"
 msgstr "không thể đọc tập tin lưu bảng mục lục"
 
-#: builtin/apply.c:4284
-#: builtin/apply.c:4287
+#: builtin/apply.c:4283 builtin/apply.c:4286
 msgid "path"
 msgstr "đường-dẫn"
 
-#: builtin/apply.c:4285
+#: builtin/apply.c:4284
 msgid "don't apply changes matching the given path"
 msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho"
 
-#: builtin/apply.c:4288
+#: builtin/apply.c:4287
 msgid "apply changes matching the given path"
 msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho"
 
-#: builtin/apply.c:4290
+#: builtin/apply.c:4289
 msgid "num"
 msgstr "số"
 
-#: builtin/apply.c:4291
+#: builtin/apply.c:4290
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "gỡ bỏ <số> phần dẫn đầu (slashe) từ đường dẫn diff cổ điển"
 
-#: builtin/apply.c:4294
+#: builtin/apply.c:4293
 msgid "ignore additions made by the patch"
 msgstr "lờ đi phần phụ thêm tạo ra bởi miếng vá"
 
-#: builtin/apply.c:4296
+#: builtin/apply.c:4295
 msgid "instead of applying the patch, output diffstat for the input"
-msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
+msgstr ""
+"thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra"
 
-#: builtin/apply.c:4300
+#: builtin/apply.c:4299
 msgid "shows number of added and deleted lines in decimal notation"
-msgstr "hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
+msgstr ""
+"hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân"
 
-#: builtin/apply.c:4302
+#: builtin/apply.c:4301
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4303
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không"
 
-#: builtin/apply.c:4306
+#: builtin/apply.c:4305
 msgid "make sure the patch is applicable to the current index"
 msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành"
 
-#: builtin/apply.c:4308
+#: builtin/apply.c:4307
 msgid "apply a patch without touching the working tree"
 msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc"
 
-#: builtin/apply.c:4310
+#: builtin/apply.c:4309
 msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "đồng thời áp dụng miếng vá (sử dụng với tùy chọn --stat/--summary/--check)"
+msgstr ""
+"đồng thời áp dụng miếng vá (dùng với tùy chọn --stat/--summary/--check)"
 
-#: builtin/apply.c:4312
+#: builtin/apply.c:4311
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "thử hòa trộn kiểu three-way nếu việc vá không thể thực hiện được"
 
-#: builtin/apply.c:4314
+#: builtin/apply.c:4313
 msgid "build a temporary index based on embedded index information"
-msgstr "xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
+msgstr ""
+"xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng"
 
-#: builtin/apply.c:4316
+#: builtin/apply.c:4315
 msgid "paths are separated with NUL character"
 msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL"
 
-#: builtin/apply.c:4319
+#: builtin/apply.c:4318
 msgid "ensure at least <n> lines of context match"
 msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp"
 
-#: builtin/apply.c:4320
+#: builtin/apply.c:4319
 msgid "action"
 msgstr "hành động"
 
-#: builtin/apply.c:4321
+#: builtin/apply.c:4320
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng"
 
-#: builtin/apply.c:4324
-#: builtin/apply.c:4327
+#: builtin/apply.c:4323 builtin/apply.c:4326
 msgid "ignore changes in whitespace when finding context"
 msgstr "lờ đi sự thay đổi do khoảng trắng khi quét nội dung"
 
-#: builtin/apply.c:4330
+#: builtin/apply.c:4329
 msgid "apply the patch in reverse"
 msgstr "áp dụng miếng vá theo chiều ngược"
 
-#: builtin/apply.c:4332
+#: builtin/apply.c:4331
 msgid "don't expect at least one line of context"
 msgstr "đừng hy vọng có ít nhất một dòng nội dung"
 
-#: builtin/apply.c:4334
+#: builtin/apply.c:4333
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng"
 
-#: builtin/apply.c:4336
+#: builtin/apply.c:4335
 msgid "allow overlapping hunks"
 msgstr "cho phép chồng khối nhớ"
 
-#: builtin/apply.c:4337
+#: builtin/apply.c:4336
 msgid "be verbose"
 msgstr "chi tiết"
 
-#: builtin/apply.c:4339
+#: builtin/apply.c:4338
 msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "dung sai không chính xác đã tìm thấy thiếu dòng mới tại cuối tập tin"
+msgstr ""
+"đã dò tìm thấy dung sai không chính xác thiếu dòng mới tại cuối tập tin"
 
-#: builtin/apply.c:4342
+#: builtin/apply.c:4341
 msgid "do not trust the line counts in the hunk headers"
 msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu"
 
-#: builtin/apply.c:4344
+#: builtin/apply.c:4343
 msgid "root"
 msgstr "root"
 
-#: builtin/apply.c:4345
+#: builtin/apply.c:4344
 msgid "prepend <root> to all filenames"
 msgstr "treo thêm <root> vào tất cả các tên tập tin"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4366
 msgid "--3way outside a repository"
 msgstr "--3way ở ngoài một kho chứa"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4374
 msgid "--index outside a repository"
 msgstr "--index ở ngoài một kho chứa"
 
-#: builtin/apply.c:4378
+#: builtin/apply.c:4377
 msgid "--cached outside a repository"
 msgstr "--cached ở ngoài một kho chứa"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4393
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "không thể mở miếng vá '%s'"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4407
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "đã chấm dứt %d lỗi khoảng trắng"
 msgstr[1] "đã chấm dứt %d lỗi khoảng trắng"
 
-#: builtin/apply.c:4414
-#: builtin/apply.c:4424
+#: builtin/apply.c:4413 builtin/apply.c:4423
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -1935,7 +1943,7 @@
 
 #: builtin/branch.c:180
 msgid "cannot use -a with -d"
-msgstr "không thể sử dụng -a với -d"
+msgstr "không thể dùng tùy chọn -a với -d"
 
 #: builtin/branch.c:186
 msgid "Couldn't look up commit object for HEAD"
@@ -1949,7 +1957,7 @@
 #: builtin/branch.c:202
 #, c-format
 msgid "remote branch '%s' not found."
-msgstr "nhánh máy chủ '%s' không tìm thấy."
+msgstr "không tìm thấy nhánh máy chủ '%s'."
 
 #: builtin/branch.c:203
 #, c-format
@@ -1983,16 +1991,16 @@
 #: builtin/branch.c:233
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
-msgstr "Nhánh máy chủ đã xóa %s (trước là %s).\n"
+msgstr "Nhánh máy chủ \"%s\" đã bị xóa (từng là %s).\n"
 
 #: builtin/branch.c:234
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
-msgstr "Nhánh đã bị xóa '%s' (trước là %s)\n"
+msgstr "Nhánh '%s' đã bị xóa (từng là %s)\n"
 
 #: builtin/branch.c:239
 msgid "Update of config-file failed"
-msgstr "Cập nhật tệp tin cấu hình gặp lỗi"
+msgstr "Cập nhật tập tin cấu hình gặp lỗi"
 
 #: builtin/branch.c:337
 #, c-format
@@ -2031,7 +2039,7 @@
 
 #: builtin/branch.c:535
 msgid "(no branch)"
-msgstr "(không có nhánh nào)"
+msgstr "(không nhánh)"
 
 #: builtin/branch.c:600
 msgid "some refs could not be read"
@@ -2044,7 +2052,7 @@
 #: builtin/branch.c:623
 #, c-format
 msgid "Invalid branch name: '%s'"
-msgstr "tên nhánh sai: '%s'"
+msgstr "Sai tên nhánh: '%s'"
 
 #: builtin/branch.c:638
 msgid "Branch rename failed"
@@ -2078,10 +2086,9 @@
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "Gặp lỗi khi giải quyết HEAD như là một tham chiếu (ref) hợp lệ."
 
-#: builtin/branch.c:788
-#: builtin/clone.c:561
+#: builtin/branch.c:788 builtin/clone.c:561
 msgid "HEAD not found below refs/heads!"
-msgstr "HEAD không tìm thấy ở dưới refs/heads!"
+msgstr "không tìm thấy HEAD ở dưới refs/heads!"
 
 #: builtin/branch.c:808
 msgid "--column and --verbose are incompatible"
@@ -2089,7 +2096,9 @@
 
 #: builtin/branch.c:857
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
-msgstr "hai tùy chọn -a và -r áp dụng cho lệnh 'git branch' không hợp lý đối với tên nhánh"
+msgstr ""
+"hai tùy chọn -a và -r áp dụng cho lệnh 'git branch' không hợp lý đối với tên "
+"nhánh"
 
 #: builtin/bundle.c:47
 #, c-format
@@ -2104,14 +2113,12 @@
 msgid "Need a repository to unbundle."
 msgstr "Cần một kho chứa để mà bung một bundle."
 
-#: builtin/checkout.c:114
-#: builtin/checkout.c:147
+#: builtin/checkout.c:114 builtin/checkout.c:147
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "đường dẫn '%s' không có các phiên bản của chúng ta"
 
-#: builtin/checkout.c:116
-#: builtin/checkout.c:149
+#: builtin/checkout.c:116 builtin/checkout.c:149
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "đường dẫn '%s' không có các phiên bản của chúng"
@@ -2136,75 +2143,65 @@
 msgid "Unable to add merge result for '%s'"
 msgstr "Không thể thêm kết quả hòa trộn cho '%s'"
 
-#: builtin/checkout.c:235
-#: builtin/checkout.c:393
+#: builtin/checkout.c:235 builtin/checkout.c:392
 msgid "corrupt index file"
 msgstr "tập tin ghi bảng mục lục bị hỏng"
 
-#: builtin/checkout.c:265
-#: builtin/checkout.c:272
+#: builtin/checkout.c:265 builtin/checkout.c:272
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "đường dẫn '%s' không được hòa trộn"
 
-#: builtin/checkout.c:303
-#: builtin/checkout.c:499
-#: builtin/clone.c:586
-#: builtin/merge.c:812
+#: builtin/checkout.c:303 builtin/checkout.c:498 builtin/clone.c:586
+#: builtin/merge.c:811
 msgid "unable to write new index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới"
 
-#: builtin/checkout.c:320
-#: builtin/diff.c:302
-#: builtin/merge.c:408
-msgid "diff_setup_done failed"
-msgstr "diff_setup_done gặp lỗi"
-
-#: builtin/checkout.c:415
+#: builtin/checkout.c:414
 msgid "you need to resolve your current index first"
 msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã!"
 
-#: builtin/checkout.c:534
+#: builtin/checkout.c:533
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "Không thể thực hiện reflog cho '%s'\n"
 
-#: builtin/checkout.c:567
+#: builtin/checkout.c:566
 msgid "HEAD is now at"
 msgstr "HEAD hiện giờ tại"
 
-#: builtin/checkout.c:574
+#: builtin/checkout.c:573
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "Đặt lại nhánh '%s'\n"
 
-#: builtin/checkout.c:577
+#: builtin/checkout.c:576
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "Đã sẵn sàng trên '%s'\n"
 
-#: builtin/checkout.c:581
+#: builtin/checkout.c:580
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "Đã chuyển tới và reset nhánh '%s'\n"
 
-#: builtin/checkout.c:583
+#: builtin/checkout.c:582
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "Đã chuyển đến nhánh mới '%s'\n"
 
-#: builtin/checkout.c:585
+#: builtin/checkout.c:584
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "Đã chuyển đến nhánh '%s'\n"
 
-#: builtin/checkout.c:641
+#: builtin/checkout.c:640
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... và nhiều hơn %d.\n"
 
 #. The singular version
-#: builtin/checkout.c:647
+#: builtin/checkout.c:646
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -2217,17 +2214,19 @@
 "\n"
 "%s\n"
 msgstr[0] ""
-"Cảnh báo: bạn đã rời bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n"
+"Cảnh báo: bạn đã rời bỏ %d lần chuyển giao (commit) lại đằng sau, không được "
+"kết nối đến\n"
 "bất kỳ nhánh nào của bạn:\n"
 "\n"
 "%s\n"
 msgstr[1] ""
-"Cảnh báo: bạn đã rời bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n"
+"Cảnh báo: bạn đã rời bỏ %d lần chuyển giao (commit) lại đằng sau, không được "
+"kết nối đến\n"
 "bất kỳ nhánh nào của bạn:\n"
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:665
+#: builtin/checkout.c:664
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -2236,95 +2235,99 @@
 " git branch new_branch_name %s\n"
 "\n"
 msgstr ""
-"Nếu bạn muốn giữ chúng bằng cách tạo ra một nhánh mới, đây có lẽ là một thời điểm thích hợp\n"
+"Nếu bạn muốn giữ chúng bằng cách tạo ra một nhánh mới, đây có lẽ là một thời "
+"điểm thích hợp\n"
 "để làm thế bằng lệnh:\n"
 "\n"
 " git branch tên_nhánh_mới %s\n"
 "\n"
 
-#: builtin/checkout.c:695
+#: builtin/checkout.c:694
 msgid "internal error in revision walk"
 msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét lại"
 
-#: builtin/checkout.c:699
+#: builtin/checkout.c:698
 msgid "Previous HEAD position was"
 msgstr "Vị trí kế trước của HEAD là"
 
-#: builtin/checkout.c:725
-#: builtin/checkout.c:920
+#: builtin/checkout.c:724 builtin/checkout.c:919
 msgid "You are on a branch yet to be born"
 msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra"
 
 #. case (1)
-#: builtin/checkout.c:856
+#: builtin/checkout.c:855
 #, c-format
 msgid "invalid reference: %s"
 msgstr "tham chiếu sai: %s"
 
 #. case (1): want a tree
-#: builtin/checkout.c:895
+#: builtin/checkout.c:894
 #, c-format
 msgid "reference is not a tree: %s"
-msgstr "tham chiếu không phải là cây:%s"
+msgstr "tham chiếu không phải là một cây (tree):%s"
 
-#: builtin/checkout.c:977
+#: builtin/checkout.c:976
 msgid "-B cannot be used with -b"
-msgstr "-B không thể được sử dụng với -b"
+msgstr "tùy chọn -B không thể dùng -b"
 
-#: builtin/checkout.c:986
+#: builtin/checkout.c:985
 msgid "--patch is incompatible with all other options"
 msgstr "--patch xung khắc với tất cả các tùy chọn khác"
 
-#: builtin/checkout.c:989
+#: builtin/checkout.c:988
 msgid "--detach cannot be used with -b/-B/--orphan"
-msgstr "--detach không thể được sử dụng với -b/-B/--orphan"
+msgstr "--detach không thể được sử dụng với tùy chọn -b/-B/--orphan"
 
-#: builtin/checkout.c:991
+#: builtin/checkout.c:990
 msgid "--detach cannot be used with -t"
 msgstr "--detach không thể được sử dụng với tùy chọn -t"
 
-#: builtin/checkout.c:997
+#: builtin/checkout.c:996
 msgid "--track needs a branch name"
 msgstr "--track cần tên một nhánh"
 
-#: builtin/checkout.c:1004
+#: builtin/checkout.c:1003
 msgid "Missing branch name; try -b"
 msgstr "Thiếu tên nhánh; hãy thử -b"
 
-#: builtin/checkout.c:1010
+#: builtin/checkout.c:1009
 msgid "--orphan and -b|-B are mutually exclusive"
 msgstr "Tùy chọn --orphan và -b|-B loại từ lẫn nhau"
 
-#: builtin/checkout.c:1012
+#: builtin/checkout.c:1011
 msgid "--orphan cannot be used with -t"
 msgstr "--orphan không thể được sử dụng với tùy chọn -t"
 
-#: builtin/checkout.c:1022
+#: builtin/checkout.c:1021
 msgid "git checkout: -f and -m are incompatible"
-msgstr "git checkout: -f và -m xung khắc nhau"
+msgstr "git checkout: hai tùy chọn -f và -m xung khắc nhau"
 
-#: builtin/checkout.c:1056
+#: builtin/checkout.c:1055
 msgid "invalid path specification"
 msgstr "đường dẫn đã cho không hợp lệ"
 
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1063
 #, c-format
 msgid ""
 "git checkout: updating paths is incompatible with switching branches.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
-"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi các nhánh..\n"
-"Bạn đã có ý định checkout '%s' cái mà không thể được phân giải như là lần chuyển giao (commit)?"
+"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi "
+"các nhánh..\n"
+"Bạn đã có ý định checkout '%s' cái mà không thể được phân giải như là lần "
+"chuyển giao (commit)?"
 
-#: builtin/checkout.c:1066
+#: builtin/checkout.c:1065
 msgid "git checkout: updating paths is incompatible with switching branches."
-msgstr "git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi các nhánh."
+msgstr ""
+"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi "
+"các nhánh."
 
-#: builtin/checkout.c:1071
+#: builtin/checkout.c:1070
 msgid "git checkout: --detach does not take a path argument"
 msgstr "git checkout: --detach không nhận một đối số là đường dẫn"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1073
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
@@ -2332,11 +2335,11 @@
 "git checkout: --ours/--theirs, --force và --merge là xung khắc với nhau khi\n"
 "checkout bảng mục lục (index)."
 
-#: builtin/checkout.c:1093
+#: builtin/checkout.c:1092
 msgid "Cannot switch branch to a non-commit."
 msgstr "Không thể chuyển đến một non-commit."
 
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
 msgid "--ours/--theirs is incompatible with switching branches."
 msgstr "--ours/--theirs là xung khắc nhau khi chuyển đổi các nhánh."
 
@@ -2345,27 +2348,31 @@
 msgstr "-x và -X không thể dùng cùng một lúc với nhau"
 
 #: builtin/clean.c:82
-msgid "clean.requireForce set to true and neither -n nor -f given; refusing to clean"
-msgstr "clean.requireForce được đặt thành true và không đưa ra tùy chọn  -n mà cũng không -f; từ chối lệnh dọn dẹp (clean)"
+msgid ""
+"clean.requireForce set to true and neither -n nor -f given; refusing to clean"
+msgstr ""
+"clean.requireForce được đặt thành true và không đưa ra tùy chọn  -n mà cũng "
+"không -f; từ chối lệnh dọn dẹp (clean)"
 
 #: builtin/clean.c:85
-msgid "clean.requireForce defaults to true and neither -n nor -f given; refusing to clean"
-msgstr "clean.requireForce mặc định được đặt thành true và không đưa ra tùy chọn  -n mà cũng không -f; từ chối lệnh dọn dẹp (clean)"
+msgid ""
+"clean.requireForce defaults to true and neither -n nor -f given; refusing to "
+"clean"
+msgstr ""
+"clean.requireForce mặc định được đặt thành true và không đưa ra tùy chọn  -n "
+"mà cũng không -f; từ chối lệnh dọn dẹp (clean)"
 
-#: builtin/clean.c:155
-#: builtin/clean.c:176
+#: builtin/clean.c:155 builtin/clean.c:176
 #, c-format
 msgid "Would remove %s\n"
 msgstr "Có thể gỡ bỏ %s\n"
 
-#: builtin/clean.c:159
-#: builtin/clean.c:179
+#: builtin/clean.c:159 builtin/clean.c:179
 #, c-format
 msgid "Removing %s\n"
 msgstr "Đang gỡ bỏ %s\n"
 
-#: builtin/clean.c:162
-#: builtin/clean.c:182
+#: builtin/clean.c:162 builtin/clean.c:182
 #, c-format
 msgid "failed to remove %s"
 msgstr "gặp lỗi khi gỡ bỏ %s"
@@ -2390,8 +2397,7 @@
 msgid "failed to create directory '%s'"
 msgstr "tạo thư mục \"%s\" gặp lỗi"
 
-#: builtin/clone.c:308
-#: builtin/diff.c:75
+#: builtin/clone.c:308 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "gặp lỗi stat (lấy trạng thái về) '%s'"
@@ -2406,20 +2412,15 @@
 msgid "failed to stat %s\n"
 msgstr "lỗi stat (lấy trạng thái về) %s\n"
 
-#: builtin/clone.c:341
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "bỏ liên kết (unlink) %s không thành công"
-
 #: builtin/clone.c:346
 #, c-format
 msgid "failed to create link '%s'"
-msgstr "tạo được liên kết mềm tới %s gặp lỗi"
+msgstr "gặp lỗi khi tạo được liên kết mềm %s"
 
 #: builtin/clone.c:350
 #, c-format
 msgid "failed to copy file to '%s'"
-msgstr "sao chép tệp tin tới '%s' gặp lỗi"
+msgstr "gặp lỗi khi chép tập tin tới '%s'"
 
 #: builtin/clone.c:373
 #, c-format
@@ -2467,8 +2468,7 @@
 msgid "working tree '%s' already exists."
 msgstr "cây làm việc '%s' đã sẵn tồn tại rồi."
 
-#: builtin/clone.c:709
-#: builtin/clone.c:723
+#: builtin/clone.c:709 builtin/clone.c:723
 #, c-format
 msgid "could not create leading directories of '%s'"
 msgstr "không thể tạo các thư mục dẫn đầu của '%s'"
@@ -2519,14 +2519,18 @@
 "\n"
 "    git commit --amend --reset-author\n"
 msgstr ""
-"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ sở\n"
-"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính xác không.\n"
-"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin trên một cách rõ ràng:\n"
+"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ "
+"sở\n"
+"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính "
+"xác không.\n"
+"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin "
+"trên một cách rõ ràng:\n"
 "\n"
 "    git config --global user.name \"Tên của bạn\"\n"
 "    git config --global user.email you@example.com\n"
 "\n"
-"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho lần chuyển giao (commit) này với lệnh:\n"
+"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho lần "
+"chuyển giao (commit) này với lệnh:\n"
 "\n"
 "    git commit --amend --reset-author\n"
 
@@ -2536,8 +2540,10 @@
 "it empty. You can repeat your command with --allow-empty, or you can\n"
 "remove the commit entirely with \"git reset HEAD^\".\n"
 msgstr ""
-"Bạn đã yêu cầu amend (tu bổ) phần lớn các lần chuyển giao (commit) gần đây, nhưng làm như thế\n"
-"có thể làm cho nó trở nên trống rỗng. Bạn có thể lặp lại lệnh của mình bằng --allow-empty,\n"
+"Bạn đã yêu cầu amend (tu bổ) phần lớn các lần chuyển giao (commit) gần đây, "
+"nhưng làm như thế\n"
+"có thể làm cho nó trở nên trống rỗng. Bạn có thể lặp lại lệnh của mình bằng "
+"--allow-empty,\n"
 "hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n"
 "\"git reset HEAD^\".\n"
 
@@ -2550,12 +2556,13 @@
 "\n"
 "Otherwise, please use 'git reset'\n"
 msgstr ""
-"Lần cherry-pick trước hiện nay trống rỗng, có lẽ là bởi vì sự phân giải xung đột.\n"
+"Lần cherry-pick trước hiện nay trống rỗng, có lẽ là bởi vì sự phân giải xung "
+"đột.\n"
 "Nếu bạn muốn chuyển giao nó cho dù thế nào đi nữa, sử dụng:\n"
 "\n"
 "    git commit --allow-empty\n"
 "\n"
-"Nếu không, hãy thử sử dụng 'git reset'\n"
+"Nếu không, hãy thử dùng 'git reset'\n"
 
 #: builtin/commit.c:256
 msgid "failed to unpack HEAD tree object"
@@ -2569,19 +2576,21 @@
 msgid "interactive add failed"
 msgstr "việc thêm tương tác gặp lỗi"
 
-#: builtin/commit.c:337
-#: builtin/commit.c:358
-#: builtin/commit.c:408
+#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408
 msgid "unable to write new_index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)"
 
 #: builtin/commit.c:389
 msgid "cannot do a partial commit during a merge."
-msgstr "không thể thực hiện việc chuyển giao (commit) cục bộ trong khi đang được hòa trộn."
+msgstr ""
+"không thể thực hiện việc chuyển giao (commit) cục bộ trong khi đang được hòa "
+"trộn."
 
 #: builtin/commit.c:391
 msgid "cannot do a partial commit during a cherry-pick."
-msgstr "không thể thực hiện việc chuyển giao (commit) bộ phận trong khi đang cherry-pick."
+msgstr ""
+"không thể thực hiện việc chuyển giao (commit) bộ phận trong khi đang cherry-"
+"pick."
 
 #: builtin/commit.c:401
 msgid "cannot read the index"
@@ -2591,8 +2600,7 @@
 msgid "unable to write temporary index file"
 msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời"
 
-#: builtin/commit.c:496
-#: builtin/commit.c:502
+#: builtin/commit.c:496 builtin/commit.c:502
 #, c-format
 msgid "invalid commit: %s"
 msgstr "lần chuyển giao (commit) không hợp lệ: %s"
@@ -2606,15 +2614,12 @@
 msgid "Malformed ident string: '%s'"
 msgstr "Chuỗi thụt lề đầu dòng dị hình: '%s'"
 
-#: builtin/commit.c:623
-#: builtin/commit.c:656
-#: builtin/commit.c:970
+#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "không thể tìm kiếm commit (lần chuyển giao) %s"
 
-#: builtin/commit.c:635
-#: builtin/shortlog.c:296
+#: builtin/commit.c:635 builtin/shortlog.c:296
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n"
@@ -2684,8 +2689,10 @@
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be ignored, and an empty message aborts the commit.\n"
 msgstr ""
-"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng được\n"
-"bắt đầu bằng '#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm hủy bỏ lần chuyển giao (commit).\n"
+"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng "
+"được\n"
+"bắt đầu bằng '#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm hủy bỏ "
+"lần chuyển giao (commit).\n"
 
 #: builtin/commit.c:756
 msgid ""
@@ -2693,7 +2700,8 @@
 "with '#' will be kept; you may remove them yourself if you want to.\n"
 "An empty message aborts the commit.\n"
 msgstr ""
-"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn.Những dòng được\n"
+"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn.Những dòng "
+"được\n"
 "bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n"
 "Phần chú thích này nếu rỗng sẽ làm hủy bỏ lần chuyển giao (commit).\n"
 
@@ -2715,8 +2723,7 @@
 msgid "Error building trees"
 msgstr "Gặp lỗi khi xây dựng cây"
 
-#: builtin/commit.c:848
-#: builtin/tag.c:361
+#: builtin/commit.c:848 builtin/tag.c:361
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "Xin hãy áp dụng thông điệp sử dụng hoặc là tùy chọn -m hoặc là -F.\n"
@@ -2724,10 +2731,9 @@
 #: builtin/commit.c:945
 #, c-format
 msgid "No existing author found with '%s'"
-msgstr "Không tìm thấy tác giả đã sẵn có với '%s'"
+msgstr "Không tìm thấy tác giả có sẵn với '%s'"
 
-#: builtin/commit.c:960
-#: builtin/commit.c:1160
+#: builtin/commit.c:960 builtin/commit.c:1160
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "Chế độ cho các tập tin không bị theo vết không hợp lệ '%s'"
@@ -2742,11 +2748,14 @@
 
 #: builtin/commit.c:1014
 msgid "You are in the middle of a merge -- cannot amend."
-msgstr "Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện amend (tu bổ)."
+msgstr ""
+"Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện amend (tu bổ)."
 
 #: builtin/commit.c:1016
 msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr "Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện amend (tu bổ)."
+msgstr ""
+"Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện amend (tu "
+"bổ)."
 
 #: builtin/commit.c:1019
 msgid "Options --squash and --fixup cannot be used together"
@@ -2762,11 +2771,14 @@
 
 #: builtin/commit.c:1039
 msgid "--reset-author can be used only with -C, -c or --amend."
-msgstr "--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend."
+msgstr ""
+"--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend."
 
 #: builtin/commit.c:1056
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
-msgstr "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được sử dụng."
+msgstr ""
+"Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được "
+"sử dụng."
 
 #: builtin/commit.c:1058
 msgid "No paths with --include/--only does not make sense."
@@ -2774,14 +2786,15 @@
 
 #: builtin/commit.c:1060
 msgid "Clever... amending the last one with dirty index."
-msgstr "Giỏi... đang tu bổ cái cuối với bảng mục lục phi nghĩa."
+msgstr "Giỏi...  tu bổ cái cuối với bảng mục lục phi nghĩa."
 
 #: builtin/commit.c:1062
 msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
-msgstr "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; đang giả định --only những-đường-dẫn..."
+msgstr ""
+"Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; đang "
+"giả định --only những-đường-dẫn..."
 
-#: builtin/commit.c:1072
-#: builtin/tag.c:577
+#: builtin/commit.c:1072 builtin/tag.c:577
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "Chế độ dọn dẹp không hợp lệ %s"
@@ -2796,7 +2809,8 @@
 
 #: builtin/commit.c:1262
 msgid "could not parse newly created commit"
-msgstr "không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
+msgstr ""
+"không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
 
 #: builtin/commit.c:1303
 msgid "detached HEAD"
@@ -2810,8 +2824,7 @@
 msgid "could not parse HEAD commit"
 msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
 
-#: builtin/commit.c:1487
-#: builtin/merge.c:509
+#: builtin/commit.c:1487 builtin/merge.c:508
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "không thể mở %s' để đọc"
@@ -2833,16 +2846,17 @@
 #: builtin/commit.c:1534
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
-msgstr "Đang bỏ qua việc chuyển giao (commit); bạn đã không biên soạn thông điệp (message).\n"
+msgstr ""
+"Đang bỏ qua việc chuyển giao (commit); bạn đã không biên soạn thông điệp "
+"(message).\n"
 
 #: builtin/commit.c:1539
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
-msgstr "Đang bỏ qua lần chuyển giao (commit) bởi vì thông điệp của nó trống rỗng.\n"
+msgstr ""
+"Đang bỏ qua lần chuyển giao (commit) bởi vì thông điệp của nó trống rỗng.\n"
 
-#: builtin/commit.c:1554
-#: builtin/merge.c:936
-#: builtin/merge.c:961
+#: builtin/commit.c:1554 builtin/merge.c:935 builtin/merge.c:960
 msgid "failed to write commit object"
 msgstr "gặp lỗi khi ghi đối tượng chuyển giao (commit)"
 
@@ -2852,7 +2866,7 @@
 
 #: builtin/commit.c:1579
 msgid "cannot update HEAD ref"
-msgstr "không thể cập nhật HEAD ref (tham chiếu)"
+msgstr "không thể cập nhật ref (tham chiếu) HEAD"
 
 #: builtin/commit.c:1590
 msgid ""
@@ -2862,7 +2876,8 @@
 msgstr ""
 "Kho chứa đã hoàn tất việc cập nhật, nhưng không thể ghi vào\n"
 "tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa có bị đầy quá\n"
-"hay quota (hạn nghạch đĩa cứng) bị vượt quá, và sau đó \"git reset HEAD\" để khắc phục."
+"hay quota (hạn nghạch đĩa cứng) bị vượt quá, và sau đó \"git reset HEAD\" để "
+"khắc phục."
 
 #: builtin/describe.c:234
 #, c-format
@@ -2948,36 +2963,36 @@
 msgid "--dirty is incompatible with committishes"
 msgstr "--dirty là xung khắc với các tùy chọn dành cho chuyển giao (commit)"
 
-#: builtin/diff.c:77
+#: builtin/diff.c:79
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s': không phải tập tin bình thường hay liên kết tượng trưng"
 
-#: builtin/diff.c:220
+#: builtin/diff.c:224
 #, c-format
 msgid "invalid option: %s"
 msgstr "tùy chọn sai: %s"
 
-#: builtin/diff.c:297
+#: builtin/diff.c:301
 msgid "Not a git repository"
 msgstr "Không phải là kho git"
 
-#: builtin/diff.c:341
+#: builtin/diff.c:344
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "đối tượng đã cho '%s' không hợp lệ."
 
-#: builtin/diff.c:346
+#: builtin/diff.c:349
 #, c-format
 msgid "more than %d trees given: '%s'"
 msgstr "đã chỉ ra nhiều hơn %d cây (tree): '%s'"
 
-#: builtin/diff.c:356
+#: builtin/diff.c:359
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "đã cho nhiều hơn hai đối tượng blob: '%s'"
 
-#: builtin/diff.c:364
+#: builtin/diff.c:367
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "đã cho đối tượng không thể nắm giữ '%s'."
@@ -2998,10 +3013,9 @@
 #: builtin/fetch.c:273
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
-msgstr "! %-*s %-*s -> %s  (không thể fetch (lấy về) trong nhánh hiện hành)"
+msgstr "! %-*s %-*s -> %s  (không thể fetch (lấy) về nhánh hiện hành)"
 
-#: builtin/fetch.c:274
-#: builtin/fetch.c:360
+#: builtin/fetch.c:274 builtin/fetch.c:360
 msgid "[rejected]"
 msgstr "[Bị từ chối]"
 
@@ -3009,9 +3023,7 @@
 msgid "[tag update]"
 msgstr "[cập nhật thẻ]"
 
-#: builtin/fetch.c:287
-#: builtin/fetch.c:322
-#: builtin/fetch.c:340
+#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340
 msgid "  (unable to update local ref)"
 msgstr "  (không thể cập nhật tham chiếu (ref) nội bộ)"
 
@@ -3039,8 +3051,7 @@
 msgid "(non-fast-forward)"
 msgstr "(non-fast-forward)"
 
-#: builtin/fetch.c:393
-#: builtin/fetch.c:685
+#: builtin/fetch.c:393 builtin/fetch.c:685
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "không thể mở %s: %s\n"
@@ -3067,26 +3078,27 @@
 #: builtin/fetch.c:549
 #, c-format
 msgid "   (%s will become dangling)"
-msgstr "   (%s sẽ trở thành lủng lẳng (không được quản lý))"
+msgstr "   (%s sẽ trở thành không đầu (không được quản lý))"
 
 #: builtin/fetch.c:550
 #, c-format
 msgid "   (%s has become dangling)"
-msgstr "   (%s phải trở thành lủng lẳng (không được quản lý))"
+msgstr "   (%s đã trở thành không đầu (không được quản lý))"
 
 #: builtin/fetch.c:557
 msgid "[deleted]"
 msgstr "[đã xóa]"
 
-#: builtin/fetch.c:558
-#: builtin/remote.c:1055
+#: builtin/fetch.c:558 builtin/remote.c:1055
 msgid "(none)"
 msgstr "(không)"
 
 #: builtin/fetch.c:675
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
-msgstr "Từ chối việc lấy (fetch) vào trong nhánh hiện tại %s của một kho chứa không phải kho trần (bare)"
+msgstr ""
+"Từ chối việc lấy (fetch) vào trong nhánh hiện tại %s của một kho chứa không "
+"phải kho trần (bare)"
 
 #: builtin/fetch.c:709
 #, c-format
@@ -3108,8 +3120,7 @@
 msgid "Fetching %s\n"
 msgstr "Đang lấy (fetch) %s\n"
 
-#: builtin/fetch.c:890
-#: builtin/remote.c:100
+#: builtin/fetch.c:890 builtin/remote.c:100
 #, c-format
 msgid "Could not fetch %s"
 msgstr "không thể fetch (lấy) %s"
@@ -3128,11 +3139,11 @@
 
 #: builtin/fetch.c:979
 msgid "fetch --all does not take a repository argument"
-msgstr "lệnh lấy về sử dụng tùy chọn --all sẽ không lấy đối số kho chứa"
+msgstr "lệnh lấy về \"fetch --all\" không lấy đối số kho chứa"
 
 #: builtin/fetch.c:981
 msgid "fetch --all does not make sense with refspecs"
-msgstr "lệnh lấy về fetch sử dụng tùy chọn --all không hợp lý với refspecs"
+msgstr "lệnh lấy về \"fetch --all\" không hợp lý với refspecs"
 
 #: builtin/fetch.c:992
 #, c-format
@@ -3165,69 +3176,74 @@
 "run \"git gc\" manually. See \"git help gc\" for more information.\n"
 msgstr ""
 "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
-"chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm chi tiết.\n"
+"chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm "
+"chi tiết.\n"
 
 #: builtin/gc.c:251
-msgid "There are too many unreachable loose objects; run 'git prune' to remove them."
-msgstr "Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh 'git prune' để xóa bỏ chúng đi."
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr ""
+"Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh 'git prune' "
+"để xóa bỏ chúng đi."
 
 #: builtin/grep.c:216
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep: gặp lỗi tạo tuyến (thread): %s"
 
-#: builtin/grep.c:402
+#: builtin/grep.c:454
 #, c-format
 msgid "Failed to chdir: %s"
 msgstr "Gặp lỗi với lệnh chdir: %s"
 
-#: builtin/grep.c:478
-#: builtin/grep.c:512
+#: builtin/grep.c:530 builtin/grep.c:564
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "không thể đọc cây (%s)"
 
-#: builtin/grep.c:526
+#: builtin/grep.c:578
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "không thể thực hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s"
 
-#: builtin/grep.c:584
+#: builtin/grep.c:636
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "chuyển đến `%c' mong chờ một giá trị bằng số"
 
-#: builtin/grep.c:601
+#: builtin/grep.c:653
 #, c-format
 msgid "cannot open '%s'"
 msgstr "không mở được '%s'"
 
-#: builtin/grep.c:885
+#: builtin/grep.c:917
 msgid "no pattern given."
 msgstr "chưa chỉ ra mẫu."
 
-#: builtin/grep.c:899
+#: builtin/grep.c:931
 #, c-format
 msgid "bad object %s"
 msgstr "đối tượng sai %s"
 
-#: builtin/grep.c:940
+#: builtin/grep.c:972
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc"
 
-#: builtin/grep.c:963
+#: builtin/grep.c:995
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached hay --untracked không được sử dụng với --no-index."
 
-#: builtin/grep.c:968
+#: builtin/grep.c:1000
 msgid "--no-index or --untracked cannot be used with revs."
-msgstr "--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên quan đến revs."
+msgstr ""
+"--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên "
+"quan đến revs."
 
-#: builtin/grep.c:971
+#: builtin/grep.c:1003
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết."
 
-#: builtin/grep.c:979
+#: builtin/grep.c:1011
 msgid "both --cached and trees are given."
 msgstr "cả hai --cached và các cây phải được chỉ ra."
 
@@ -3249,10 +3265,7 @@
 msgid "emacsclient version '%d' too old (< 22)."
 msgstr "phiên bản của emacsclient '%d' quá cũ (< 22)."
 
-#: builtin/help.c:132
-#: builtin/help.c:160
-#: builtin/help.c:169
-#: builtin/help.c:177
+#: builtin/help.c:132 builtin/help.c:160 builtin/help.c:169 builtin/help.c:177
 #, c-format
 msgid "failed to exec '%s': %s"
 msgstr "gặp lỗi khi thực thi '%s': %s"
@@ -3292,8 +3305,7 @@
 msgid "no info viewer handled the request"
 msgstr "không có trình xem trợ giúp dạng info tiếp hợp với yêu cầu"
 
-#: builtin/help.c:447
-#: builtin/help.c:454
+#: builtin/help.c:447 builtin/help.c:454
 #, c-format
 msgid "usage: %s%s"
 msgstr "cách sử dụng: %s%s"
@@ -3387,17 +3399,13 @@
 msgid "serious inflate inconsistency"
 msgstr "sự mâu thuẫn xả nén nghiêm trọng"
 
-#: builtin/index-pack.c:649
-#: builtin/index-pack.c:655
-#: builtin/index-pack.c:678
-#: builtin/index-pack.c:712
-#: builtin/index-pack.c:721
+#: builtin/index-pack.c:649 builtin/index-pack.c:655 builtin/index-pack.c:678
+#: builtin/index-pack.c:712 builtin/index-pack.c:721
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SỰ VA CHẠM SHA1 ĐÃ XẢY RA VỚI %s!"
 
-#: builtin/index-pack.c:652
-#: builtin/pack-objects.c:170
+#: builtin/index-pack.c:652 builtin/pack-objects.c:170
 #: builtin/pack-objects.c:262
 #, c-format
 msgid "unable to read %s"
@@ -3427,8 +3435,7 @@
 msgid "Not all child objects of %s are reachable"
 msgstr "Không phải tất cả các đối tượng con của %s là có thể với tới được"
 
-#: builtin/index-pack.c:821
-#: builtin/index-pack.c:847
+#: builtin/index-pack.c:821 builtin/index-pack.c:847
 msgid "failed to apply delta"
 msgstr "gặp lỗi khi áp dụng delta"
 
@@ -3506,7 +3513,7 @@
 #: builtin/index-pack.c:1398
 #, c-format
 msgid "Cannot open existing pack file '%s'"
-msgstr "Không thể mở tập tin pack đã sẵn có '%s' "
+msgstr "Không thể mở tập tin pack đã sẵn có '%s'"
 
 #: builtin/index-pack.c:1400
 #, c-format
@@ -3531,10 +3538,8 @@
 msgid "Cannot come back to cwd"
 msgstr "Không thể quay lại cwd"
 
-#: builtin/index-pack.c:1525
-#: builtin/index-pack.c:1528
-#: builtin/index-pack.c:1540
-#: builtin/index-pack.c:1544
+#: builtin/index-pack.c:1525 builtin/index-pack.c:1528
+#: builtin/index-pack.c:1540 builtin/index-pack.c:1544
 #, c-format
 msgid "bad %s"
 msgstr "%s sai"
@@ -3543,8 +3548,7 @@
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin không thể được dùng mà không có --stdin"
 
-#: builtin/index-pack.c:1562
-#: builtin/index-pack.c:1572
+#: builtin/index-pack.c:1562 builtin/index-pack.c:1572
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "tên tập tin packfile '%s' không được kết thúc bằng đuôi '.pack'"
@@ -3623,16 +3627,15 @@
 msgid "insane git directory %s"
 msgstr "thư mục git điên rồ %s"
 
-#: builtin/init-db.c:323
-#: builtin/init-db.c:326
+#: builtin/init-db.c:323 builtin/init-db.c:326
 #, c-format
 msgid "%s already exists"
-msgstr "%s đã tồn tại rồi"
+msgstr "%s đã có từ trước rồi"
 
 #: builtin/init-db.c:355
 #, c-format
 msgid "unable to handle file type %d"
-msgstr "không thể handle tệp tin kiểu %d"
+msgstr "không thể nắm (handle) tập tin kiểu %d"
 
 #: builtin/init-db.c:358
 #, c-format
@@ -3670,8 +3673,7 @@
 msgid "cannot tell cwd"
 msgstr "không nói chuyện được với lệnh cwd"
 
-#: builtin/init-db.c:522
-#: builtin/init-db.c:529
+#: builtin/init-db.c:522 builtin/init-db.c:529
 #, c-format
 msgid "cannot mkdir %s"
 msgstr "không thể mkdir (tạo thư mục): %s"
@@ -3683,8 +3685,12 @@
 
 #: builtin/init-db.c:555
 #, c-format
-msgid "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-dir=<directory>)"
-msgstr "%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-dir=<thư-mục>)"
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+"%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-"
+"dir=<thư-mục>)"
 
 #: builtin/init-db.c:579
 msgid "Cannot access current working directory"
@@ -3700,8 +3706,7 @@
 msgid "Final output: %d %s\n"
 msgstr "Kết xuất cuối cùng: %d %s\n"
 
-#: builtin/log.c:403
-#: builtin/log.c:494
+#: builtin/log.c:403 builtin/log.c:494
 #, c-format
 msgid "Could not read object %s"
 msgstr "Không thể đọc đối tượng %s"
@@ -3732,65 +3737,66 @@
 msgid "Not a range."
 msgstr "Không phải là một vùng."
 
-#: builtin/log.c:792
+#: builtin/log.c:789
 msgid "Cover letter needs email format"
 msgstr "'Cover letter' cần cho định dạng thư"
 
-#: builtin/log.c:865
+#: builtin/log.c:862
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "in-reply-to điên rồ: %s"
 
-#: builtin/log.c:938
+#: builtin/log.c:935
 msgid "Two output directories?"
 msgstr "Hai thư mục kết xuất?"
 
-#: builtin/log.c:1160
+#: builtin/log.c:1157
 #, c-format
 msgid "bogus committer info %s"
 msgstr "thông tin người chuyển giao không có thực %s"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1202
 msgid "-n and -k are mutually exclusive."
 msgstr "-n và  -k loại từ lẫn nhau."
 
-#: builtin/log.c:1207
+#: builtin/log.c:1204
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix và -k xung khắc nhau."
 
-#: builtin/log.c:1215
+#: builtin/log.c:1212
 msgid "--name-only does not make sense"
 msgstr "--name-only không hợp lý"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1214
 msgid "--name-status does not make sense"
 msgstr "--name-status không hợp lý"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1216
 msgid "--check does not make sense"
 msgstr "--check không hợp lý"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1239
 msgid "standard output, or directory, which one?"
 msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1241
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "Không thể tạo thư mục '%s'"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1394
 msgid "Failed to create output files"
 msgstr "Gặp lỗi khi tạo các tập tin kết xuất"
 
-#: builtin/log.c:1501
+#: builtin/log.c:1498
 #, c-format
-msgid "Could not find a tracked remote branch, please specify <upstream> manually.\n"
-msgstr "Không tìm thấy nhánh mạng bị theo vết, hãy chỉ định <dòng-ngược> một cách thủ công.\n"
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+msgstr ""
+"Không tìm thấy nhánh mạng bị theo vết, hãy chỉ định <dòng-ngược> một cách "
+"thủ công.\n"
 
-#: builtin/log.c:1517
-#: builtin/log.c:1519
-#: builtin/log.c:1531
+#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525
 #, c-format
 msgid "Unknown commit %s"
 msgstr "Không hiểu lần chuyển giao (commit) %s"
@@ -3827,14 +3833,13 @@
 msgid "not a valid object: %s"
 msgstr "không phải là một đối tượng hợp lệ: %s"
 
-#: builtin/merge.c:269
-#: builtin/merge.c:286
+#: builtin/merge.c:269 builtin/merge.c:286
 msgid "read-tree failed"
 msgstr "read-tree gặp lỗi"
 
 #: builtin/merge.c:316
 msgid " (nothing to squash)"
-msgstr " (không có ghì để squash)"
+msgstr " (không có gì để squash)"
 
 #: builtin/merge.c:329
 #, c-format
@@ -3854,49 +3859,51 @@
 msgid "No merge message -- not updating HEAD\n"
 msgstr "Không thông điệp hòa trộn -- không cập nhật HEAD\n"
 
-#: builtin/merge.c:437
+#: builtin/merge.c:436
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' không chỉ đến một lần chuyển giao (commit) nào cả"
 
-#: builtin/merge.c:536
+#: builtin/merge.c:535
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "Chuỗi branch.%s.mergeoptions sai: %s"
 
-#: builtin/merge.c:629
+#: builtin/merge.c:628
 msgid "git write-tree failed to write a tree"
 msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
 
-#: builtin/merge.c:679
+#: builtin/merge.c:678
 msgid "failed to read the cache"
 msgstr "gặp lỗi khi đọc bộ nhớ tạm"
 
-#: builtin/merge.c:710
+#: builtin/merge.c:709
 msgid "Not handling anything other than two heads merge."
 msgstr "Không cầm nắm gì ngoài hai head hòa trộn"
 
-#: builtin/merge.c:724
+#: builtin/merge.c:723
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "Không hiểu tùy chọn cho merge-recursive: -X%s"
 
-#: builtin/merge.c:738
+#: builtin/merge.c:737
 #, c-format
 msgid "unable to write %s"
-msgstr "không ghi được %s"
+msgstr "không thể ghi %s"
 
-#: builtin/merge.c:877
+#: builtin/merge.c:876
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "Không thể đọc từ '%s'"
 
-#: builtin/merge.c:886
+#: builtin/merge.c:885
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
-msgstr "Vẫn chưa hòa trộn các lần chuyển giao (commit); sử dụng lệnh 'git commit' để hoàn tất việc hòa trộn.\n"
+msgstr ""
+"Vẫn chưa hòa trộn các lần chuyển giao (commit); sử dụng lệnh 'git commit' để "
+"hoàn tất việc hòa trộn.\n"
 
-#: builtin/merge.c:892
+#: builtin/merge.c:891
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
 "especially if it merges an updated upstream into a topic branch.\n"
@@ -3904,60 +3911,64 @@
 "Lines starting with '#' will be ignored, and an empty message aborts\n"
 "the commit.\n"
 msgstr ""
-"Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần thiết,\n"
-"đặc biệt là khi nó hòa trộn dòng ngược đã cập nhật vào trong một nhánh topic.\n"
+"Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần "
+"thiết,\n"
+"đặc biệt là khi nó hòa trộn dòng ngược đã cập nhật vào trong một nhánh "
+"topic.\n"
 "\n"
-"Những dòng được bắt đầu bằng '#' sẽ được bỏ qua, và phần chú thích này nếu rỗng\n"
+"Những dòng được bắt đầu bằng '#' sẽ được bỏ qua, và phần chú thích này nếu "
+"rỗng\n"
 "sẽ làm hủy bỏ lần chuyển giao (commit).\n"
 
-#: builtin/merge.c:916
+#: builtin/merge.c:915
 msgid "Empty commit message."
 msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
 
-#: builtin/merge.c:928
+#: builtin/merge.c:927
 #, c-format
 msgid "Wonderful.\n"
 msgstr "Thần kỳ.\n"
 
-#: builtin/merge.c:993
+#: builtin/merge.c:992
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
-msgstr "Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao (commit) kết quả.\n"
+msgstr ""
+"Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao "
+"(commit) kết quả.\n"
 
-#: builtin/merge.c:1009
+#: builtin/merge.c:1008
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "%s không phải là một lần commit (chuyển giao)"
 
-#: builtin/merge.c:1050
+#: builtin/merge.c:1049
 msgid "No current branch."
 msgstr "không phải nhánh hiện hành"
 
-#: builtin/merge.c:1052
+#: builtin/merge.c:1051
 msgid "No remote for the current branch."
 msgstr "Không có máy chủ cho nhánh hiện hành."
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1053
 msgid "No default upstream defined for the current branch."
 msgstr "Không có dòng ngược mặc định được định nghĩa cho nhánh hiện hành."
 
-#: builtin/merge.c:1059
+#: builtin/merge.c:1058
 #, c-format
 msgid "No remote tracking branch for %s from %s"
 msgstr "Không nhánh mạng theo vết cho %s từ %s"
 
-#: builtin/merge.c:1146
-#: builtin/merge.c:1303
+#: builtin/merge.c:1145 builtin/merge.c:1302
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - không phải là một số thứ chúng tôi có thể hòa trộn"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1213
 msgid "There is no merge to abort (MERGE_HEAD missing)."
-msgstr "Ở đây không có lần hòa trộn nào được hủy bỏ giữa chừng cả (không thấy MERGE_HEAD)."
+msgstr ""
+"Ở đây không có lần hòa trộn nào được hủy bỏ giữa chừng cả (thiếu MERGE_HEAD)."
 
-#: builtin/merge.c:1230
-#: git-pull.sh:31
+#: builtin/merge.c:1229 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3965,12 +3976,11 @@
 "Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao (commit) các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1233
-#: git-pull.sh:34
+#: builtin/merge.c:1232 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại)."
 
-#: builtin/merge.c:1237
+#: builtin/merge.c:1236
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3978,83 +3988,90 @@
 "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n"
 "Hãy chuyển giao (commit) các thay đổi trước khi bạn có thể hòa trộn."
 
-#: builtin/merge.c:1240
+#: builtin/merge.c:1239
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)."
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1248
 msgid "You cannot combine --squash with --no-ff."
-msgstr "Bạn không thể tổ hợp --squash với --no-ff."
+msgstr "Bạn không thể kết hợp --squash với --no-ff."
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1253
 msgid "You cannot combine --no-ff with --ff-only."
-msgstr "Bạn không thể tổ hợp --no-ff với --ff-only."
+msgstr "Bạn không thể kết hợp --no-ff với --ff-only."
 
-#: builtin/merge.c:1261
+#: builtin/merge.c:1260
 msgid "No commit specified and merge.defaultToUpstream not set."
-msgstr "Không chỉ ra lần chuyển giao (commit) và merge.defaultToUpstream chưa được đặt."
+msgstr ""
+"Không chỉ ra lần chuyển giao (commit) và merge.defaultToUpstream chưa được "
+"đặt."
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1292
 msgid "Can merge only exactly one commit into empty head"
-msgstr "Không thể hòa trộn một cách đúng đắn một lần chuyển giao (commit) vào một head rỗng"
+msgstr ""
+"Không thể hòa trộn một cách đúng đắn một lần chuyển giao (commit) vào một "
+"head rỗng"
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1295
 msgid "Squash commit into empty head not supported yet"
 msgstr "Squash commit vào một head trống rỗng vẫn chưa được hỗ trợ"
 
-#: builtin/merge.c:1298
+#: builtin/merge.c:1297
 msgid "Non-fast-forward commit does not make sense into an empty head"
-msgstr "Chuyển giao (commit) không-fast-forward không hợp lý ở trong một head trống rỗng"
+msgstr ""
+"Chuyển giao (commit) không-fast-forward không hợp lý ở trong một head trống "
+"rỗng"
 
-#: builtin/merge.c:1413
+#: builtin/merge.c:1412
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Đang cập nhật %s..%s\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Đang thử hòa trộn kiểu 'trivial in-index'...\n"
 
-#: builtin/merge.c:1458
+#: builtin/merge.c:1457
 #, c-format
 msgid "Nope.\n"
 msgstr "Không.\n"
 
-#: builtin/merge.c:1490
+#: builtin/merge.c:1489
 msgid "Not possible to fast-forward, aborting."
 msgstr "Thực hiện lệnh fast-forward là không thể được, đang bỏ qua."
 
-#: builtin/merge.c:1513
-#: builtin/merge.c:1592
+#: builtin/merge.c:1512 builtin/merge.c:1591
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Đang tua lại cây thành thời xa xưa...\n"
 
-#: builtin/merge.c:1517
+#: builtin/merge.c:1516
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "Đang thử chiến lược hòa trộn %s...\n"
 
-#: builtin/merge.c:1583
+#: builtin/merge.c:1582
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "Không có chiến lược hòa trộn nào được nắm giữ (handle) sự hòa trộn.\n"
 
-#: builtin/merge.c:1585
+#: builtin/merge.c:1584
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "Hòa trộn với chiến lược %s gặp lỗi.\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1593
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "Sử dụng %s để chuẩn bị giải quyết bằng tay.\n"
 
-#: builtin/merge.c:1606
+#: builtin/merge.c:1605
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
-msgstr "Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu cầu\n"
+msgstr ""
+"Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu "
+"cầu\n"
 
 #: builtin/mv.c:108
 #, c-format
@@ -4097,7 +4114,7 @@
 
 #: builtin/mv.c:184
 msgid "Cannot overwrite"
-msgstr "Không thể ghi chèn"
+msgstr "Không thể ghi đè"
 
 #: builtin/mv.c:187
 msgid "multiple sources for the same target"
@@ -4111,10 +4128,9 @@
 #: builtin/mv.c:212
 #, c-format
 msgid "Renaming %s to %s\n"
-msgstr "Đang thay đổi tên %s thành %s\n"
+msgstr "Đổi tên %s thành %s\n"
 
-#: builtin/mv.c:215
-#: builtin/remote.c:731
+#: builtin/mv.c:215 builtin/remote.c:731
 #, c-format
 msgid "renaming '%s' failed"
 msgstr "đổi tên %s gặp lỗi"
@@ -4138,18 +4154,17 @@
 msgid "failed to finish 'show' for object '%s'"
 msgstr "gặp lỗi khi hoàn thành 'show' cho đối tượng '%s'"
 
-#: builtin/notes.c:175
-#: builtin/tag.c:347
+#: builtin/notes.c:175 builtin/tag.c:347
 #, c-format
 msgid "could not create file '%s'"
 msgstr "không thể tạo tập tin '%s'"
 
 #: builtin/notes.c:189
 msgid "Please supply the note contents using either -m or -F option"
-msgstr "Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F"
+msgstr ""
+"Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F"
 
-#: builtin/notes.c:210
-#: builtin/notes.c:973
+#: builtin/notes.c:210 builtin/notes.c:973
 #, c-format
 msgid "Removing note for object %s\n"
 msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n"
@@ -4163,30 +4178,20 @@
 msgid "The note contents has been left in %s"
 msgstr "Nội dung ghi chú còn lại %s"
 
-#: builtin/notes.c:251
-#: builtin/tag.c:542
+#: builtin/notes.c:251 builtin/tag.c:542
 #, c-format
 msgid "cannot read '%s'"
 msgstr "không thể đọc '%s'"
 
-#: builtin/notes.c:253
-#: builtin/tag.c:545
+#: builtin/notes.c:253 builtin/tag.c:545
 #, c-format
 msgid "could not open or read '%s'"
 msgstr "không thể mở để đọc hay ghi '%s'"
 
-#: builtin/notes.c:272
-#: builtin/notes.c:445
-#: builtin/notes.c:447
-#: builtin/notes.c:507
-#: builtin/notes.c:561
-#: builtin/notes.c:644
-#: builtin/notes.c:649
-#: builtin/notes.c:724
-#: builtin/notes.c:766
-#: builtin/notes.c:968
-#: builtin/reset.c:293
-#: builtin/tag.c:558
+#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447
+#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644
+#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766
+#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558
 #, c-format
 msgid "Failed to resolve '%s' as a valid ref."
 msgstr "Gặp lỗi khi giải quyết '%s' như là một tham chiếu (ref) hợp lệ."
@@ -4198,7 +4203,9 @@
 
 #: builtin/notes.c:299
 msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr "Không thể chuyển giao (commit) chưa được khởi tạo hoặc không được tham chiếu cây ghi chú"
+msgstr ""
+"Không thể chuyển giao (commit) chưa được khởi tạo hoặc không được tham chiếu "
+"cây ghi chú"
 
 #: builtin/notes.c:340
 #, c-format
@@ -4227,29 +4234,27 @@
 msgid "Failed to copy notes from '%s' to '%s'"
 msgstr "Gặp lỗi khi sao chép ghi chú (note) từ '%s' tới '%s'"
 
-#: builtin/notes.c:500
-#: builtin/notes.c:554
-#: builtin/notes.c:627
-#: builtin/notes.c:639
-#: builtin/notes.c:712
-#: builtin/notes.c:759
+#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627
+#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759
 #: builtin/notes.c:1033
 msgid "too many parameters"
 msgstr "quá nhiều đối số"
 
-#: builtin/notes.c:513
-#: builtin/notes.c:772
+#: builtin/notes.c:513 builtin/notes.c:772
 #, c-format
 msgid "No note found for object %s."
-msgstr "không ghi chú được tìm thấy cho đối tượng %s."
+msgstr "không tìm thấy ghi chú cho đối tượng %s."
 
 #: builtin/notes.c:580
 #, c-format
-msgid "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite existing notes"
-msgstr "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ"
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng "
+"%s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ"
 
-#: builtin/notes.c:585
-#: builtin/notes.c:662
+#: builtin/notes.c:585 builtin/notes.c:662
 #, c-format
 msgid "Overwriting existing notes for object %s\n"
 msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n"
@@ -4260,8 +4265,12 @@
 
 #: builtin/notes.c:656
 #, c-format
-msgid "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite existing notes"
-msgstr "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ"
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr ""
+"Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối "
+"tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ"
 
 #: builtin/notes.c:668
 #, c-format
@@ -4282,14 +4291,12 @@
 msgid "Object %s has no note\n"
 msgstr "Đối tượng %s không có ghi chú (note)\n"
 
-#: builtin/notes.c:1103
-#: builtin/remote.c:1598
+#: builtin/notes.c:1103 builtin/remote.c:1598
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "Không hiểu câu lệnh con: %s"
 
-#: builtin/pack-objects.c:183
-#: builtin/pack-objects.c:186
+#: builtin/pack-objects.c:183 builtin/pack-objects.c:186
 #, c-format
 msgid "deflate error (%d)"
 msgstr "lỗi giải nén (%d)"
@@ -4328,7 +4335,8 @@
 "To choose either option permanently, see push.default in 'git help config'."
 msgstr ""
 "\n"
-"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong 'git help config'."
+"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong 'git help "
+"config'."
 
 #: builtin/push.c:102
 #, c-format
@@ -4379,7 +4387,8 @@
 "    git push --set-upstream %s %s\n"
 msgstr ""
 "Nhánh hiện tại %s không có nhánh dòng ngược (upstream) nào.\n"
-"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ như là dòng ngược (upstream), sử dụng\n"
+"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ như là dòng ngược "
+"(upstream), sử dụng\n"
 "\n"
 "    git push --set-upstream %s %s\n"
 
@@ -4395,15 +4404,51 @@
 "your current branch '%s', without telling me what to push\n"
 "to update which remote branch."
 msgstr ""
-"Bạn đang push (đẩy lên) máy chủ '%s', mà nó không phải là dòng ngược (upstream) của\n"
+"Bạn đang push (đẩy lên) máy chủ '%s', mà nó không phải là dòng ngược "
+"(upstream) của\n"
 "nhánh hiện tại '%s' của bạn, mà không báo cho tôi biết là cái gì được push\n"
 "để cập nhật nhánh máy chủ nào."
 
-#: builtin/push.c:174
-msgid "You didn't specify any refspecs to push, and push.default is \"nothing\"."
-msgstr "Bạn đã không chỉ ra một refspecs nào để push, và push.default là \"không là gì cả\"."
+#: builtin/push.c:151
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"push.default chưa được đặt; giá trị ngầm định của nó đã được thay đổi trong\n"
+"Git 2.0 từ 'matching' thành 'simple'. Để chấm dứt lời nhắc nhở này\n"
+"và duy trì cách xử lý sau những thay đổi mặc định này, hãy chạy lệnh:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"Để chấm dứt lời nhắc nhở này và sử dụng cách xử lý mới, hãy chạy lệnh:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"Xem 'git help config' và tìm đến 'push.default' để có thêm thông tin.\n"
+"(chế độ 'simple' được bắt đầu sử dụng từ Git 1.7.11. Sử dụng chế độ tương "
+"tự\n"
+"'current' thay vì 'simple' nếu bạn thỉnh thoảng phải sử dụng bản Git cũ)"
 
-#: builtin/push.c:181
+#: builtin/push.c:199
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr ""
+"Bạn đã không chỉ ra một refspecs nào để push, và push.default là \"không là "
+"gì cả\"."
+
+#: builtin/push.c:206
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n"
@@ -4411,23 +4456,28 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. 'git pull')\n"
+"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. 'git "
+"pull')\n"
 "trước khi lại push lần nữa.\n"
-"Xem trong phần 'Note about fast-forwards' trong nội dung từ lệnh 'git push --help'."
+"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có "
+"thông tin chi tiết."
 
-#: builtin/push.c:187
+#: builtin/push.c:212
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration\n"
-"variable to 'current' or 'upstream' to push only the current branch."
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
 msgstr ""
 "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ muốn\n"
-"chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình 'push.default'\n"
-"thành 'current' hoặc 'upstream' để push chỉ nhánh hiện hành mà thôi."
+"phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ "
+"muốn\n"
+"chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình 'push."
+"default'\n"
+"thành 'simple', 'current' hoặc 'upstream' để chỉ push nhánh hiện hành mà "
+"thôi."
 
-#: builtin/push.c:193
+#: builtin/push.c:218
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and merge the remote changes\n"
@@ -4435,29 +4485,32 @@
 "See the 'Note about fast-forwards' in 'git push --help' for details."
 msgstr ""
 "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi từ máy chủ\n"
+"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi "
+"từ máy chủ\n"
 "(v.d. 'git pull') trước khi lại push lần nữa.\n"
-"Xem trong phần 'Note about fast-forwards' trong nội dung từ lệnh 'git push --help'."
+"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có "
+"thông tin chi tiết."
 
-#: builtin/push.c:233
+#: builtin/push.c:258
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "Đang push (đẩy) lên %s\n"
 
-#: builtin/push.c:237
+#: builtin/push.c:262
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "gặp lỗi khi push (đẩy lên) một số tham chiếu (ref) đến '%s'"
 
-#: builtin/push.c:269
+#: builtin/push.c:294
 #, c-format
 msgid "bad repository '%s'"
 msgstr "repository (kho) sai '%s'"
 
-#: builtin/push.c:270
+#: builtin/push.c:295
 msgid ""
 "No configured push destination.\n"
-"Either specify the URL from the command-line or configure a remote repository using\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
 "\n"
 "    git remote add <name> <url>\n"
 "\n"
@@ -4474,31 +4527,31 @@
 "\n"
 "    git push <tên>\n"
 
-#: builtin/push.c:285
+#: builtin/push.c:310
 msgid "--all and --tags are incompatible"
 msgstr "--all và --tags xung khắc nhau"
 
-#: builtin/push.c:286
+#: builtin/push.c:311
 msgid "--all can't be combined with refspecs"
 msgstr "--all không thể được tổ hợp cùng với refspecs"
 
-#: builtin/push.c:291
+#: builtin/push.c:316
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror và --tags xung khắc nhau"
 
-#: builtin/push.c:292
+#: builtin/push.c:317
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror không thể được tổ hợp cùng với refspecs"
 
-#: builtin/push.c:297
+#: builtin/push.c:322
 msgid "--all and --mirror are incompatible"
 msgstr "--all và --mirror xung khắc nhau"
 
-#: builtin/push.c:385
+#: builtin/push.c:410
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --tags"
 
-#: builtin/push.c:387
+#: builtin/push.c:412
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu (refs) nào"
 
@@ -4522,20 +4575,18 @@
 
 #: builtin/remote.c:185
 msgid "specifying a master branch makes no sense with --mirror"
-msgstr "đang chỉ định một nhánh master không phân biệt HOA/thường với tùy chọn --mirror"
+msgstr "đang chỉ định một nhánh master không hợp lý với tùy chọn --mirror"
 
 #: builtin/remote.c:187
 msgid "specifying branches to track makes sense only with fetch mirrors"
 msgstr "chỉ định những nhánh để theo vết chỉ hợp lý với các 'fetch mirror'"
 
-#: builtin/remote.c:195
-#: builtin/remote.c:646
+#: builtin/remote.c:195 builtin/remote.c:646
 #, c-format
 msgid "remote %s already exists."
 msgstr "máy chủ %s đã tồn tại rồi."
 
-#: builtin/remote.c:199
-#: builtin/remote.c:650
+#: builtin/remote.c:199 builtin/remote.c:650
 #, c-format
 msgid "'%s' is not a valid remote name"
 msgstr "'%s' không phải tên máy chủ hợp lệ"
@@ -4555,8 +4606,7 @@
 msgid "Could not get fetch map for refspec %s"
 msgstr "Không thể lấy ánh xạ (map) fetch cho refspec %s"
 
-#: builtin/remote.c:440
-#: builtin/remote.c:448
+#: builtin/remote.c:440 builtin/remote.c:448
 msgid "(matching)"
 msgstr "(mẫu)"
 
@@ -4564,16 +4614,12 @@
 msgid "(delete)"
 msgstr "(xoá)"
 
-#: builtin/remote.c:595
-#: builtin/remote.c:601
-#: builtin/remote.c:607
+#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607
 #, c-format
 msgid "Could not append '%s' to '%s'"
 msgstr "Không thể nối thêm '%s' vào '%s'"
 
-#: builtin/remote.c:639
-#: builtin/remote.c:792
-#: builtin/remote.c:890
+#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890
 #, c-format
 msgid "No such remote: %s"
 msgstr "Không có máy chủ nào như thế: %s"
@@ -4583,8 +4629,7 @@
 msgid "Could not rename config section '%s' to '%s'"
 msgstr "Không thể đổi tên chương (section) cấu hình từ '%s' thành '%s'"
 
-#: builtin/remote.c:662
-#: builtin/remote.c:799
+#: builtin/remote.c:662 builtin/remote.c:799
 #, c-format
 msgid "Could not remove config section '%s'"
 msgstr "Không thể gỡ bỏ chương (section) cấu hình '%s'"
@@ -4623,7 +4668,7 @@
 #: builtin/remote.c:764
 #, c-format
 msgid "Could not remove branch %s"
-msgstr "Không thể gỡ nhánh %s"
+msgstr "Không thể gỡ bỏ nhánh %s"
 
 #: builtin/remote.c:834
 msgid ""
@@ -4636,7 +4681,8 @@
 "Chú ý: Một nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ đi;\n"
 "để xóa đi, sử dụng:"
 msgstr[1] ""
-"Chú ý: Một số nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ đi;\n"
+"Chú ý: Một số nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ "
+"đi;\n"
 "để xóa đi, sử dụng:"
 
 #: builtin/remote.c:943
@@ -4650,7 +4696,7 @@
 
 #: builtin/remote.c:948
 msgid " stale (use 'git remote prune' to remove)"
-msgstr " cũ (sử dụng 'git remote prune' để gỡ bỏ)"
+msgstr " cũ (dùng 'git remote prune' để gỡ bỏ)"
 
 #: builtin/remote.c:950
 msgid " ???"
@@ -4678,7 +4724,7 @@
 #: builtin/remote.c:1004
 #, c-format
 msgid "merges with remote %s"
-msgstr "hòa trộn với máy chủ  %s"
+msgstr "hòa trộn với máy chủ %s"
 
 #: builtin/remote.c:1005
 msgid "   and with remote"
@@ -4734,28 +4780,25 @@
 msgid "  Fetch URL: %s"
 msgstr "  URL để lấy về (fetch): %s"
 
-#: builtin/remote.c:1120
-#: builtin/remote.c:1285
+#: builtin/remote.c:1120 builtin/remote.c:1285
 msgid "(no URL)"
-msgstr "(không có URL nào)"
+msgstr "(không có URL)"
 
-#: builtin/remote.c:1129
-#: builtin/remote.c:1131
+#: builtin/remote.c:1129 builtin/remote.c:1131
 #, c-format
 msgid "  Push  URL: %s"
-msgstr "  URL để đẩy lên (push)  : %s"
+msgstr "  URL để đẩy lên (push): %s"
 
-#: builtin/remote.c:1133
-#: builtin/remote.c:1135
-#: builtin/remote.c:1137
+#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Nhánh HEAD: %s"
 
 #: builtin/remote.c:1139
 #, c-format
-msgid "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
-msgstr "  nhánh HEAD (HEAD máy chủ là không rõ ràng, có lẽ là một trong số sau):\n"
+msgid ""
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgstr "  nhánh HEAD (HEAD máy chủ chưa rõ ràng, có lẽ là một trong số sau):\n"
 
 #: builtin/remote.c:1151
 #, c-format
@@ -4764,8 +4807,7 @@
 msgstr[0] "  Nhánh trên máy chủ:%s"
 msgstr[1] "  Những nhánh trên máy chủ:%s"
 
-#: builtin/remote.c:1154
-#: builtin/remote.c:1181
+#: builtin/remote.c:1154 builtin/remote.c:1181
 msgid " (status not queried)"
 msgstr " (trạng thái không được yêu cầu)"
 
@@ -4812,12 +4854,12 @@
 #: builtin/remote.c:1274
 #, c-format
 msgid " %s will become dangling!"
-msgstr " %s sẽ trở thành lủng lẳng (không được quản lý)!"
+msgstr " %s sẽ trở thành không đầu (không được quản lý)!"
 
 #: builtin/remote.c:1275
 #, c-format
 msgid " %s has become dangling!"
-msgstr " %s phải trở thành lủng lẳng (không được quản lý)!"
+msgstr " %s đã trở thành không đầu (không được quản lý)!"
 
 #: builtin/remote.c:1281
 #, c-format
@@ -4839,8 +4881,7 @@
 msgid " * [pruned] %s"
 msgstr " *[đã xén bớ] %s"
 
-#: builtin/remote.c:1387
-#: builtin/remote.c:1461
+#: builtin/remote.c:1387 builtin/remote.c:1461
 #, c-format
 msgid "No such remote '%s'"
 msgstr "Không có máy chủ nào có tên '%s'"
@@ -4933,7 +4974,9 @@
 
 #: builtin/reset.c:317
 msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
-msgstr "--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh 'git reset -- <đường_dẫn>'."
+msgstr ""
+"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh 'git "
+"reset -- <đường_dẫn>'."
 
 #: builtin/reset.c:319
 #, c-format
@@ -4950,8 +4993,7 @@
 msgid "Could not reset index file to revision '%s'."
 msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét lại '%s'."
 
-#: builtin/revert.c:70
-#: builtin/revert.c:92
+#: builtin/revert.c:70 builtin/revert.c:92
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s: %s không thể được sử dụng với %s"
@@ -4975,7 +5017,7 @@
 "(use -f to force removal)"
 msgstr ""
 "'%s' có nội dung được lưu trạng thái khác biệt từ cả tập tin và cả HEAD\n"
-"(sử dụng -f để ép buộc gỡ bỏ)"
+"(dùng tùy chọn -f để ép buộc gỡ bỏ)"
 
 #: builtin/rm.c:115
 #, c-format
@@ -4984,7 +5026,7 @@
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
 "'%s' có các thay đổi được lưu trạng thái trong bảng mục lục\n"
-"(sử dụng --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
+"(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
 
 #: builtin/rm.c:119
 #, c-format
@@ -4993,7 +5035,7 @@
 "(use --cached to keep the file, or -f to force removal)"
 msgstr ""
 "'%s' có các thay đổi nội bộ\n"
-"(sử dụng --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
+"(dùng tùy chọn --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)"
 
 #: builtin/rm.c:194
 #, c-format
@@ -5054,13 +5096,15 @@
 "\n"
 "#\n"
 "# Write a tag message\n"
-"# Lines starting with '#' will be kept; you may remove them yourself if you want to.\n"
+"# Lines starting with '#' will be kept; you may remove them yourself if you "
+"want to.\n"
 "#\n"
 msgstr ""
 "\n"
 "#\n"
 "# Viết các ghi chú cho (thẻ) tag\n"
-"# Những dòng được bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n"
+"# Những dòng được bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi "
+"nếu muốn.\n"
 "#\n"
 
 #: builtin/tag.c:298
@@ -5148,10 +5192,10 @@
 
 #: git.c:16
 msgid "See 'git help <command>' for more information on a specific command."
-msgstr "Chạy lệnh 'git help <tên-lệnh>' để có thêm thông tin về lệnh được chỉ ra."
+msgstr ""
+"Chạy lệnh 'git help <tên-lệnh>' để có thêm thông tin về lệnh được chỉ ra."
 
-#: parse-options.h:133
-#: parse-options.h:235
+#: parse-options.h:133 parse-options.h:235
 msgid "n"
 msgstr "n"
 
@@ -5209,7 +5253,9 @@
 
 #: common-cmds.h:14
 msgid "Show changes between commits, commit and working tree, etc"
-msgstr "Hiển thị các thay đổi giữa những lần chuyển giao (commit), commit và cây làm việc, v.v.."
+msgstr ""
+"Hiển thị các thay đổi giữa những lần chuyển giao (commit), commit và cây làm "
+"việc, v.v.."
 
 #: common-cmds.h:15
 msgid "Download objects and refs from another repository"
@@ -5221,7 +5267,8 @@
 
 #: common-cmds.h:17
 msgid "Create an empty git repository or reinitialize an existing one"
-msgstr "Tạo một kho git trống rỗng hay khởi tạo lại một kho đã tồn tại từ trước"
+msgstr ""
+"Tạo một kho git trống rỗng hay khởi tạo lại một kho đã tồn tại từ trước"
 
 #: common-cmds.h:18
 msgid "Show commit logs"
@@ -5229,7 +5276,9 @@
 
 #: common-cmds.h:19
 msgid "Join two or more development histories together"
-msgstr "Hợp nhất hai hay nhiều hơn lịch sử của các nhà phát triển phần mềm lại với nhau"
+msgstr ""
+"Hợp nhất hai hay nhiều hơn lịch sử của các nhà phát triển phần mềm lại với "
+"nhau"
 
 #: common-cmds.h:20
 msgid "Move or rename a file, a directory, or a symlink"
@@ -5241,11 +5290,13 @@
 
 #: common-cmds.h:22
 msgid "Update remote refs along with associated objects"
-msgstr "Cập nhật tham chiếu (refs) máy chủ cùng với các đối tượng liên quan đến nó"
+msgstr ""
+"Cập nhật tham chiếu (refs) máy chủ cùng với các đối tượng liên quan đến nó"
 
 #: common-cmds.h:23
 msgid "Forward-port local commits to the updated upstream head"
-msgstr "Forward-port những lần chuyển giao nội bộ tới head dòng ngược đã cập nhật"
+msgstr ""
+"Forward-port những lần chuyển giao nội bộ tới head dòng ngược đã cập nhật"
 
 #: common-cmds.h:24
 msgid "Reset current HEAD to the specified state"
@@ -5265,7 +5316,9 @@
 
 #: common-cmds.h:28
 msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ (tag) mà nó được ký sử dụng GPG"
+msgstr ""
+"Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ (tag) mà nó được ký sử dụng "
+"GPG"
 
 #: git-am.sh:50
 msgid "You need to set your committer info first"
@@ -5287,8 +5340,10 @@
 "To restore the original branch and stop patching, run \"$cmdline --abort\"."
 msgstr ""
 "Khi bạn cần giải quyết vấn đề này hãy chạy lệnh \"$cmdline --resolved\".\n"
-"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"$cmdline --skip\".\n"
-"Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"$cmdline --abort\"."
+"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"$cmdline --skip"
+"\".\n"
+"Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy "
+"\"$cmdline --abort\"."
 
 #: git-am.sh:121
 msgid "Cannot fall back to three-way merge."
@@ -5300,7 +5355,8 @@
 
 #: git-am.sh:139
 msgid "Using index info to reconstruct a base tree..."
-msgstr "Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở..."
+msgstr ""
+"Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở..."
 
 #: git-am.sh:154
 msgid ""
@@ -5350,7 +5406,8 @@
 
 #: git-am.sh:509
 msgid "Resolve operation not in progress, we are not resuming."
-msgstr "Thao tác phân giải không đang được tiến hành, chúng ta không phục hồi lại."
+msgstr ""
+"Thao tác phân giải không đang được tiến hành, chúng ta không phục hồi lại."
 
 #: git-am.sh:575
 #, sh-format
@@ -5365,8 +5422,10 @@
 "To restore the original branch and stop patching run \"$cmdline --abort\"."
 msgstr ""
 "Miếng vá trống rỗng.  Nó đã bị chia cắt sai phải không?\n"
-"Nếu bạn thích bỏ qua miếng vá này, hãy chạy lệnh sau để thay thế \"$cmdline --skip\".\n"
-"Để phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --abort\"."
+"Nếu bạn thích bỏ qua miếng vá này, hãy chạy lệnh sau để thay thế \"$cmdline "
+"--skip\".\n"
+"Để phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --"
+"abort\"."
 
 #: git-am.sh:706
 msgid "Patch does not have a valid e-mail address."
@@ -5374,7 +5433,8 @@
 
 #: git-am.sh:753
 msgid "cannot be interactive without stdin connected to a terminal."
-msgstr "không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
+msgstr ""
+"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
 
 #: git-am.sh:757
 msgid "Commit Body is:"
@@ -5385,7 +5445,9 @@
 #. input at this point.
 #: git-am.sh:764
 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-msgstr "Áp dụng? đồng ý [y]/không [n]/chỉnh sửa [e]/hiển thị miếng [v]á/đồng ý tất cả [a]"
+msgstr ""
+"Áp dụng? đồng ý [y]/không [n]/chỉnh sửa [e]/hiển thị miếng [v]á/đồng ý tất "
+"cả [a] "
 
 #: git-am.sh:800
 #, sh-format
@@ -5400,7 +5462,8 @@
 msgstr ""
 "Không có thay đổi nào - bạn đã quên sử dụng lệnh 'git add' à?\n"
 "Nếu ở đây không có gì còn lại stage, tình cờ là có một số thứ khác\n"
-"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng vá này."
+"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng "
+"vá này."
 
 #: git-am.sh:829
 msgid ""
@@ -5450,8 +5513,11 @@
 
 #: git-bisect.sh:130
 #, sh-format
-msgid "Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'."
-msgstr "Việc checkout '$start_head' gặp lỗi. Hãy thử 'git bisect reset <nhánh_hợp_lệ>'."
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'."
+msgstr ""
+"Việc checkout '$start_head' gặp lỗi. Hãy thử 'git bisect reset "
+"<nhánh_hợp_lệ>'."
 
 #: git-bisect.sh:140
 msgid "won't bisect on seeked tree"
@@ -5488,14 +5554,15 @@
 #. this is less optimum.
 #: git-bisect.sh:273
 msgid "Warning: bisecting only with a bad commit."
-msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao (commit) sai."
+msgstr ""
+"Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao (commit) sai."
 
 #. TRANSLATORS: Make sure to include [Y] and [n] in your
 #. translation. The program will only accept English input
 #. at this point.
 #: git-bisect.sh:279
 msgid "Are you sure [Y/n]? "
-msgstr "Bạn có chắc chắn chưa [Y/n]?"
+msgstr "Bạn có chắc chắn chưa [Y/n]? "
 
 #: git-bisect.sh:289
 msgid ""
@@ -5512,11 +5579,11 @@
 "(You can use \"git bisect bad\" and \"git bisect good\" for that.)"
 msgstr ""
 "Bạn cần bắt đầu bằng lệnh \"git bisect start\".\n"
-"Bạn sau đó cần phải chỉ cho tôi ít nhất một điểm xét duyệt đúng và một điểm sai.\n"
+"Bạn sau đó cần phải chỉ cho tôi ít nhất một điểm xét duyệt đúng và một điểm "
+"sai.\n"
 "(Bạn có thể sử dụng \"git bisect bad\" và \"git bisect good\" cho chúng.)"
 
-#: git-bisect.sh:347
-#: git-bisect.sh:474
+#: git-bisect.sh:347 git-bisect.sh:474
 msgid "We are not bisecting."
 msgstr "Chúng tôi không bisect."
 
@@ -5586,15 +5653,19 @@
 msgstr ""
 "Pull là không thể được bởi vì bạn có những tập tin chưa được hòa trộn.\n"
 "Xin hãy sửa chữa chúng trước, và sau đó sử dụng lệnh 'git add/rm <tập-tin>'\n"
-"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng 'git commit -a'."
+"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng 'git "
+"commit -a'."
 
 #: git-pull.sh:25
 msgid "Pull is not possible because you have unmerged files."
-msgstr "Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
+msgstr ""
+"Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
 
 #: git-pull.sh:197
 msgid "updating an unborn branch with changes added to the index"
-msgstr "đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào bảng mục lục"
+msgstr ""
+"đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào "
+"bảng mục lục"
 
 #. The fetch involved updating the current branch.
 #. The working tree and the index file is still based on the
@@ -5623,11 +5694,14 @@
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
-"To check out the original branch and stop rebasing, run \"git rebase --abort\"."
+"To check out the original branch and stop rebasing, run \"git rebase --abort"
+"\"."
 msgstr ""
 "Khi bạn cần giải quyết vấn đề này hãy chạy lệnh \"git rebase --continue\".\n"
-"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"git rebase --skip\".\n"
-"Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git rebase --abort\"."
+"Nếu bạn có ý định bỏ qua miếng vá, thay vào đó bạn chạy \"git rebase --skip"
+"\".\n"
+"Để phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git "
+"rebase --abort\"."
 
 #: git-rebase.sh:159
 msgid "The pre-rebase hook refused to rebase."
@@ -5635,7 +5709,9 @@
 
 #: git-rebase.sh:164
 msgid "It looks like git-am is in progress. Cannot rebase."
-msgstr "Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh rebase."
+msgstr ""
+"Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh "
+"rebase."
 
 #: git-rebase.sh:295
 msgid "The --exec option must be used with the --interactive option"
@@ -5643,7 +5719,7 @@
 
 #: git-rebase.sh:300
 msgid "No rebase in progress?"
-msgstr "Không phải đang rebase?"
+msgstr "Không có tiến trình rebase nào phải không?"
 
 #: git-rebase.sh:313
 msgid "Cannot read HEAD"
@@ -5693,10 +5769,9 @@
 #: git-rebase.sh:419
 #, sh-format
 msgid "$onto_name: there are more than one merge bases"
-msgstr "$onto_name: ở đây có nhiều hơn một "
+msgstr "$onto_name: ở đây có nhiều hơn một"
 
-#: git-rebase.sh:422
-#: git-rebase.sh:426
+#: git-rebase.sh:422 git-rebase.sh:426
 #, sh-format
 msgid "$onto_name: there is no merge base"
 msgstr "$onto_name: ở đây không có gì để hòa trộn"
@@ -5733,7 +5808,8 @@
 #. Detach HEAD and reset the tree
 #: git-rebase.sh:515
 msgid "First, rewinding head to replay your work on top of it..."
-msgstr "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó..."
+msgstr ""
+"Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó..."
 
 #: git-rebase.sh:523
 #, sh-format
@@ -5742,7 +5818,8 @@
 
 #: git-stash.sh:51
 msgid "git stash clear with parameters is unimplemented"
-msgstr "git stash clear với các tham số là chưa được thực hiện (không nhận đối số)"
+msgstr ""
+"git stash clear với các tham số là chưa được thực hiện (không nhận đối số)"
 
 #: git-stash.sh:74
 msgid "You do not have the initial commit yet"
@@ -5752,8 +5829,7 @@
 msgid "Cannot save the current index state"
 msgstr "Không thể ghi lại trạng thái bảng mục lục hiện hành"
 
-#: git-stash.sh:123
-#: git-stash.sh:136
+#: git-stash.sh:123 git-stash.sh:136
 msgid "Cannot save the current worktree state"
 msgstr "Không thể ghi lại trạng thái cây-làm-việc hiện hành"
 
@@ -5806,7 +5882,7 @@
 
 #: git-stash.sh:352
 msgid "No stash found."
-msgstr "Không tìm thấy stast nào."
+msgstr "Không tìm thấy stash nào."
 
 #: git-stash.sh:359
 #, sh-format
@@ -5875,98 +5951,105 @@
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "không thể tháo bỏ một thành phần ra khỏi url '$remoteurl'"
 
-#: git-submodule.sh:145
+#: git-submodule.sh:167
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
-msgstr "Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn '$sm_path'"
+msgstr ""
+"Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn "
+"'$sm_path'"
 
-#: git-submodule.sh:189
+#: git-submodule.sh:211
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "Nhân bản '$url' vào đường dẫn mô-đun-con '$sm_path' gặp lỗi"
 
-#: git-submodule.sh:201
+#: git-submodule.sh:223
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
-msgstr "Gitdir '$a' là bộ phận của đường dẫn mô-đun-con '$b' hoặc \"vice versa\""
+msgstr ""
+"Gitdir '$a' là bộ phận của đường dẫn mô-đun-con '$b' hoặc \"vice versa\""
 
-#: git-submodule.sh:290
+#: git-submodule.sh:312
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
-msgstr "repo URL: '$repo' phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
+msgstr ""
+"repo URL: '$repo' phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
 
-#: git-submodule.sh:307
+#: git-submodule.sh:329
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' thực sự đã tồn tại ở bảng mục lục rồi"
 
-#: git-submodule.sh:311
+#: git-submodule.sh:333
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
 "$sm_path\n"
 "Use -f if you really want to add it."
 msgstr ""
-"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore của bạn:\n"
+"Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore "
+"của bạn:\n"
 "$sm_path\n"
 "Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
 
-#: git-submodule.sh:322
+#: git-submodule.sh:344
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "Đang thêm repo có sẵn tại '$sm_path' vào bảng mục lục"
 
-#: git-submodule.sh:324
+#: git-submodule.sh:346
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' đã tồn tại từ trước và không phải là một kho git hợp lệ"
 
-#: git-submodule.sh:338
+#: git-submodule.sh:360
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Không thể checkout mô-đun con '$sm_path'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:365
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "Gặp lỗi khi thêm mô-đun con '$sm_path'"
 
-#: git-submodule.sh:348
+#: git-submodule.sh:370
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "Gặp lỗi khi đăng ký với hệ thống mô-đun con '$sm_path'"
 
-#: git-submodule.sh:390
+#: git-submodule.sh:413
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
 msgstr "Đang nhập '$prefix$sm_path'"
 
-#: git-submodule.sh:404
+#: git-submodule.sh:427
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
 msgstr "Dừng lại tại '$sm_path'; script trả về trạng thái khác không."
 
-#: git-submodule.sh:447
+#: git-submodule.sh:471
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
-msgstr "Không tìm thấy url cho đường dẫn mô-đun-con '$sm_path' trong .gitmodules"
+msgstr ""
+"Không tìm thấy url cho đường dẫn mô-đun-con '$sm_path' trong .gitmodules"
 
-#: git-submodule.sh:456
+#: git-submodule.sh:480
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
 msgstr "Gặp lỗi khi đăng ký url cho đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:458
+#: git-submodule.sh:482
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
 msgstr "Mô-đun-con '$name' ($url) được đăng ký cho đường dẫn '$sm_path'"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:490
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
-msgstr "Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con '$sm_path'"
+msgstr ""
+"Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:590
 #, sh-format
 msgid ""
 "Submodule path '$sm_path' not initialized\n"
@@ -5975,94 +6058,106 @@
 "Đường dẫn mô-đun-con '$sm_path' chưa được khởi tạo\n"
 "Có lẽ bạn muốn sử dụng lệnh 'update --init'?"
 
-#: git-submodule.sh:578
+#: git-submodule.sh:603
 #, sh-format
 msgid "Unable to find current revision in submodule path '$sm_path'"
-msgstr "Không tìm thấy điểm xét lại hiện hành trong đường dẫn mô-đun-con '$sm_path'"
+msgstr ""
+"Không tìm thấy điểm xét lại hiện hành trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:597
+#: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Không thể lấy về (fetch) trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:611
+#: git-submodule.sh:636
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$sm_path'"
 msgstr "Không thể rebase '$sha1' trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Submodule path '$sm_path': rebased into '$sha1'"
 msgstr "Đường dẫn mô-đun-con '$sm_path': được rebase vào trong '$sha1'"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:642
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$sm_path'"
-msgstr "Không thể hòa trộn (merge) '$sha1' trong đường dẫn mô-đun-con '$sm_path'"
+msgstr ""
+"Không thể hòa trộn (merge) '$sha1' trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:618
+#: git-submodule.sh:643
 #, sh-format
 msgid "Submodule path '$sm_path': merged in '$sha1'"
 msgstr "Đường dẫn mô-đun-con '$sm_path': được hòa trộn vào '$sha1'"
 
-#: git-submodule.sh:623
+#: git-submodule.sh:648
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$sm_path'"
 msgstr "Không thể checkout '$sha1' trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:624
+#: git-submodule.sh:649
 #, sh-format
 msgid "Submodule path '$sm_path': checked out '$sha1'"
 msgstr "Đường dẫn mô-đun-con '$sm_path': được checkout '$sha1'"
 
-#: git-submodule.sh:646
-#: git-submodule.sh:969
+#: git-submodule.sh:671 git-submodule.sh:995
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con '$sm_path'"
 
-#: git-submodule.sh:754
+#: git-submodule.sh:779
 msgid "The --cached option cannot be used with the --files option"
 msgstr "Tùy chọn --cached không thể dùng cùng với tùy chọn --files"
 
 #. unexpected type
-#: git-submodule.sh:794
+#: git-submodule.sh:819
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "chế độ không như mong chờ $mod_dst"
 
-#: git-submodule.sh:812
+#: git-submodule.sh:837
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
 msgstr "  Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_src"
 
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
 msgstr "  Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_dst"
 
-#: git-submodule.sh:818
+#: git-submodule.sh:843
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
-msgstr "  Cảnh báo: $name không chứa những lần chuyển giao (commit) $sha1_src và $sha1_dst"
+msgstr ""
+"  Cảnh báo: $name không chứa những lần chuyển giao (commit) $sha1_src và "
+"$sha1_dst"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:868
 msgid "blob"
 msgstr "blob"
 
-#: git-submodule.sh:881
+#: git-submodule.sh:906
 msgid "# Submodules changed but not updated:"
 msgstr "# Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
 
-#: git-submodule.sh:883
+#: git-submodule.sh:908
 msgid "# Submodule changes to be committed:"
 msgstr "# Những thay đổi mô-đun-con được chuyển giao (commit):"
 
-#: git-submodule.sh:1027
+#: git-submodule.sh:1054
 #, sh-format
 msgid "Synchronizing submodule url for '$name'"
 msgstr "Đang đồng bộ hóa url mô-đun-con cho '$name'"
 
+#~ msgid "diff setup failed"
+#~ msgstr "cài đặt diff gặp lỗi"
+
+#~ msgid "merge-recursive: disk full?"
+#~ msgstr "merge-recursive: đĩa bị đầy?"
+
+#~ msgid "diff_setup_done failed"
+#~ msgstr "diff_setup_done gặp lỗi"
+
 #~ msgid "-d option is no longer supported.  Do not use."
 #~ msgstr "Tùy chọn -d không còn được hỗ trợ nữa. Xin đừng sử dụng."
 
diff --git a/po/zh_CN.po b/po/zh_CN.po
index bc04236..46d158f 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -12,8 +12,8 @@
 msgstr ""
 "Project-Id-Version: Git\n"
 "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2012-08-06 23:47+0800\n"
-"PO-Revision-Date: 2012-08-07 01:07+0800\n"
+"POT-Creation-Date: 2012-09-15 10:21+0800\n"
+"PO-Revision-Date: 2012-09-07 17:56+0800\n"
 "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
 "Language-Team: GitHub <https://github.com/gotgit/git/>\n"
 "Language: zh_CN\n"
@@ -42,6 +42,95 @@
 "'git add/rm <file>' 标记解决方案,\n"
 "或使用 'git commit -a'。"
 
+#: archive.c:10
+#, fuzzy
+msgid "git archive [options] <tree-ish> [<path>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: archive.c:11
+#, fuzzy
+msgid "git archive --list"
+msgstr "git archive:NACK %s"
+
+#: archive.c:12
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"
+msgstr ""
+
+#: archive.c:13
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr ""
+
+#: archive.c:322
+msgid "fmt"
+msgstr ""
+
+#: archive.c:322
+msgid "archive format"
+msgstr ""
+
+#: archive.c:323 builtin/log.c:1079
+msgid "prefix"
+msgstr ""
+
+#: archive.c:324
+msgid "prepend prefix to each pathname in the archive"
+msgstr ""
+
+#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332
+#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642
+#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77
+#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537
+#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149
+msgid "file"
+msgstr "文件"
+
+#: archive.c:326 builtin/archive.c:92
+msgid "write the archive to this file"
+msgstr ""
+
+#: archive.c:328
+#, fuzzy
+msgid "read .gitattributes in working directory"
+msgstr "%s:已经存在于工作区中"
+
+#: archive.c:329
+msgid "report archived files on stderr"
+msgstr ""
+
+#: archive.c:330
+msgid "store only"
+msgstr ""
+
+#: archive.c:331
+msgid "compress faster"
+msgstr ""
+
+#: archive.c:339
+msgid "compress better"
+msgstr ""
+
+#: archive.c:342
+msgid "list supported archive formats"
+msgstr ""
+
+#: archive.c:344 builtin/archive.c:93 builtin/clone.c:85
+msgid "repo"
+msgstr ""
+
+#: archive.c:345 builtin/archive.c:94
+msgid "retrieve the archive from remote repository <repo>"
+msgstr ""
+
+#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616
+#, fuzzy
+msgid "command"
+msgstr "运行 $command"
+
+#: archive.c:347 builtin/archive.c:96
+msgid "path to the remote git-upload-archive command"
+msgstr ""
+
 #: bundle.c:36
 #, c-format
 msgid "'%s' does not look like a v2 bundle file"
@@ -52,7 +141,7 @@
 msgid "unrecognized header: %s%s (%d)"
 msgstr "未能识别的包头:%s%s (%d)"
 
-#: bundle.c:89 builtin/commit.c:699
+#: bundle.c:89 builtin/commit.c:714
 #, c-format
 msgid "could not open '%s'"
 msgstr "不能打开 '%s'"
@@ -61,8 +150,8 @@
 msgid "Repository lacks these prerequisite commits:"
 msgstr "版本库缺少这些必备的提交:"
 
-#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:290
-#: builtin/log.c:726 builtin/log.c:1316 builtin/log.c:1535 builtin/merge.c:347
+#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290
+#: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347
 #: builtin/shortlog.c:181
 msgid "revision walk setup failed"
 msgstr "版本遍历设置失败"
@@ -89,7 +178,7 @@
 msgid "rev-list died"
 msgstr "rev-list 终止"
 
-#: bundle.c:300 builtin/log.c:1212 builtin/shortlog.c:284
+#: bundle.c:300 builtin/log.c:1209 builtin/shortlog.c:284
 #, c-format
 msgid "unrecognized argument: %s"
 msgstr "未能识别的参数:%s"
@@ -236,32 +325,32 @@
 "发现配置变量 'diff.dirstat' 中的错误:\n"
 "%s"
 
-#: diff.c:1400
+#: diff.c:1401
 msgid " 0 files changed"
 msgstr " 0 个文件被修改"
 
-#: diff.c:1404
+#: diff.c:1405
 #, c-format
 msgid " %d file changed"
 msgid_plural " %d files changed"
 msgstr[0] " %d 个文件被修改"
 msgstr[1] " %d 个文件被修改"
 
-#: diff.c:1421
+#: diff.c:1422
 #, c-format
 msgid ", %d insertion(+)"
 msgid_plural ", %d insertions(+)"
 msgstr[0] ",插入 %d 行(+)"
 msgstr[1] ",插入 %d 行(+)"
 
-#: diff.c:1432
+#: diff.c:1433
 #, c-format
 msgid ", %d deletion(-)"
 msgid_plural ", %d deletions(-)"
 msgstr[0] ",删除 %d 行(-)"
 msgstr[1] ",删除 %d 行(-)"
 
-#: diff.c:3461
+#: diff.c:3460
 #, c-format
 msgid ""
 "Failed to parse --dirstat/-X option parameter:\n"
@@ -350,7 +439,7 @@
 "您指的是这个么?"
 msgstr[1] ""
 "\n"
-"您指的是这些其中一个么?"
+"您指的是这其中的某一个么?"
 
 #: merge-recursive.c:190
 #, c-format
@@ -366,74 +455,66 @@
 msgid "error building trees"
 msgstr "无法创建树"
 
-#: merge-recursive.c:497
-msgid "diff setup failed"
-msgstr "diff 设置失败"
-
-#: merge-recursive.c:627
-msgid "merge-recursive: disk full?"
-msgstr "merge-recursive:磁盘已满?"
-
-#: merge-recursive.c:690
+#: merge-recursive.c:672
 #, c-format
 msgid "failed to create path '%s'%s"
 msgstr "无法创建路径 '%s'%s"
 
-#: merge-recursive.c:701
+#: merge-recursive.c:683
 #, c-format
 msgid "Removing %s to make room for subdirectory\n"
 msgstr "删除 %s 以便为子目录留出空间\n"
 
 #. something else exists
 #. .. but not some other error (who really cares what?)
-#: merge-recursive.c:715 merge-recursive.c:736
+#: merge-recursive.c:697 merge-recursive.c:718
 msgid ": perhaps a D/F conflict?"
 msgstr ":可能是一个目录/文件冲突?"
 
-#: merge-recursive.c:726
+#: merge-recursive.c:708
 #, c-format
 msgid "refusing to lose untracked file at '%s'"
 msgstr "拒绝丢弃 '%s' 中的未跟踪文件"
 
-#: merge-recursive.c:766
+#: merge-recursive.c:748
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "不能读取对象 %s '%s'"
 
-#: merge-recursive.c:768
+#: merge-recursive.c:750
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "%s '%s' 应为二进制对象(blob)"
 
-#: merge-recursive.c:791 builtin/clone.c:302
+#: merge-recursive.c:773 builtin/clone.c:302
 #, c-format
 msgid "failed to open '%s'"
 msgstr "无法打开 '%s'"
 
-#: merge-recursive.c:799
+#: merge-recursive.c:781
 #, c-format
 msgid "failed to symlink '%s'"
 msgstr "无法创建符号链接 '%s'"
 
-#: merge-recursive.c:802
+#: merge-recursive.c:784
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "不知道如何处理 %06o %s '%s'"
 
-#: merge-recursive.c:939
+#: merge-recursive.c:922
 msgid "Failed to execute internal merge"
 msgstr "无法执行内部合并"
 
-#: merge-recursive.c:943
+#: merge-recursive.c:926
 #, c-format
 msgid "Unable to add %s to database"
 msgstr "不能添加 %s 至对象库"
 
-#: merge-recursive.c:959
+#: merge-recursive.c:942
 msgid "unsupported object type in the tree"
 msgstr "在树中有不支持的对象类型"
 
-#: merge-recursive.c:1038 merge-recursive.c:1052
+#: merge-recursive.c:1021 merge-recursive.c:1035
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -442,7 +523,7 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本被保留。"
 
-#: merge-recursive.c:1044 merge-recursive.c:1057
+#: merge-recursive.c:1027 merge-recursive.c:1040
 #, c-format
 msgid ""
 "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -451,20 +532,20 @@
 "冲突(%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
 "的版本保留于 %8$s 中。"
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "rename"
 msgstr "重命名"
 
-#: merge-recursive.c:1098
+#: merge-recursive.c:1081
 msgid "renamed"
 msgstr "重命名"
 
-#: merge-recursive.c:1154
+#: merge-recursive.c:1137
 #, c-format
 msgid "%s is a directory in %s adding as %s instead"
 msgstr "%s 是 %s 中的一个目录而以 %s 为名被添加"
 
-#: merge-recursive.c:1176
+#: merge-recursive.c:1159
 #, c-format
 msgid ""
 "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -473,144 +554,144 @@
 "冲突(重命名/重命名):在分支 \"%3$s\" 中重命名 \"%1$s\"->\"%2$s\",在分支 "
 "\"%6$s\" 中重命名 \"%4$s\"->\"%5$s\"%7$s"
 
-#: merge-recursive.c:1181
+#: merge-recursive.c:1164
 msgid " (left unresolved)"
 msgstr "(留下未解决)"
 
-#: merge-recursive.c:1235
+#: merge-recursive.c:1218
 #, c-format
 msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
 msgstr ""
 "冲突(重命名/重命名):在 %3$s 中重命名 %1$s->%2$s,在 %6$s 中重命名 %4$s->"
 "%5$s"
 
-#: merge-recursive.c:1265
+#: merge-recursive.c:1248
 #, c-format
 msgid "Renaming %s to %s and %s to %s instead"
 msgstr "而是重命名 %s 至 %s 以及 %s 至 %s"
 
-#: merge-recursive.c:1464
+#: merge-recursive.c:1447
 #, c-format
 msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
 msgstr "冲突(重命名/添加):在 %3$s 中重命名 %1$s->%2$s。在 %5$s 中添加 %4$s"
 
-#: merge-recursive.c:1474
+#: merge-recursive.c:1457
 #, c-format
 msgid "Adding merged %s"
 msgstr "添加合并后的 %s"
 
-#: merge-recursive.c:1479 merge-recursive.c:1677
+#: merge-recursive.c:1462 merge-recursive.c:1660
 #, c-format
 msgid "Adding as %s instead"
 msgstr "而是以 %s 为名添加"
 
-#: merge-recursive.c:1530
+#: merge-recursive.c:1513
 #, c-format
 msgid "cannot read object %s"
 msgstr "不能读取对象 %s"
 
-#: merge-recursive.c:1533
+#: merge-recursive.c:1516
 #, c-format
 msgid "object %s is not a blob"
 msgstr "对象 %s 不是一个二进制对象(blob)"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modify"
 msgstr "修改"
 
-#: merge-recursive.c:1581
+#: merge-recursive.c:1564
 msgid "modified"
 msgstr "修改"
 
-#: merge-recursive.c:1591
+#: merge-recursive.c:1574
 msgid "content"
 msgstr "内容"
 
-#: merge-recursive.c:1598
+#: merge-recursive.c:1581
 msgid "add/add"
 msgstr "添加/添加"
 
-#: merge-recursive.c:1632
+#: merge-recursive.c:1615
 #, c-format
 msgid "Skipped %s (merged same as existing)"
 msgstr "略过 %s(已经做过相同合并)"
 
-#: merge-recursive.c:1646
+#: merge-recursive.c:1629
 #, c-format
 msgid "Auto-merging %s"
 msgstr "自动合并 %s"
 
-#: merge-recursive.c:1650 git-submodule.sh:844
+#: merge-recursive.c:1633 git-submodule.sh:869
 msgid "submodule"
 msgstr "子模组"
 
-#: merge-recursive.c:1651
+#: merge-recursive.c:1634
 #, c-format
 msgid "CONFLICT (%s): Merge conflict in %s"
 msgstr "冲突(%s):合并冲突于 %s"
 
-#: merge-recursive.c:1741
+#: merge-recursive.c:1724
 #, c-format
 msgid "Removing %s"
 msgstr "删除 %s"
 
-#: merge-recursive.c:1766
+#: merge-recursive.c:1749
 msgid "file/directory"
 msgstr "文件/目录"
 
-#: merge-recursive.c:1772
+#: merge-recursive.c:1755
 msgid "directory/file"
 msgstr "目录/文件"
 
-#: merge-recursive.c:1777
+#: merge-recursive.c:1760
 #, c-format
 msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
 msgstr "冲突(%1$s):在 %3$s 中有一个名为 %2$s 的目录。以 %5$s 为名添加 %4$s"
 
-#: merge-recursive.c:1787
+#: merge-recursive.c:1770
 #, c-format
 msgid "Adding %s"
 msgstr "添加 %s"
 
-#: merge-recursive.c:1804
+#: merge-recursive.c:1787
 msgid "Fatal merge failure, shouldn't happen."
 msgstr "严重的合并错误,不应发生。"
 
-#: merge-recursive.c:1823
+#: merge-recursive.c:1806
 msgid "Already up-to-date!"
 msgstr "已经是最新的!"
 
-#: merge-recursive.c:1832
+#: merge-recursive.c:1815
 #, c-format
 msgid "merging of trees %s and %s failed"
 msgstr "无法合并树 %s 和 %s"
 
-#: merge-recursive.c:1862
+#: merge-recursive.c:1845
 #, c-format
 msgid "Unprocessed path??? %s"
 msgstr "未处理的路径??? %s"
 
-#: merge-recursive.c:1907
+#: merge-recursive.c:1890
 msgid "Merging:"
 msgstr "合并:"
 
-#: merge-recursive.c:1920
+#: merge-recursive.c:1903
 #, c-format
 msgid "found %u common ancestor:"
 msgid_plural "found %u common ancestors:"
 msgstr[0] "发现 %u 个共同祖先:"
 msgstr[1] "发现 %u 个共同祖先:"
 
-#: merge-recursive.c:1957
+#: merge-recursive.c:1940
 msgid "merge returned no commit"
 msgstr "合并未返回提交"
 
-#: merge-recursive.c:2014
+#: merge-recursive.c:1997
 #, c-format
 msgid "Could not parse object '%s'"
 msgstr "不能解析对象 '%s'"
 
-#: merge-recursive.c:2026 builtin/merge.c:697
+#: merge-recursive.c:2009 builtin/merge.c:696
 msgid "Unable to write index."
 msgstr "不能写入索引。"
 
@@ -661,19 +742,19 @@
 "and have %d and %d different commits each, respectively.\n"
 msgstr[0] ""
 "您的分支和 '%s' 出现了偏离,\n"
-"并且各自分别有 %d 和 %d 处不同的提交。\n"
+"并且分别有 %d 和 %d 处不同的提交。\n"
 msgstr[1] ""
 "您的分支和 '%s' 出现了偏离,\n"
-"并且各自分别有 %d 和 %d 处不同的提交。\n"
+"并且分别有 %d 和 %d 处不同的提交。\n"
 
-#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978
-#: builtin/merge.c:1088 builtin/merge.c:1098
+#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977
+#: builtin/merge.c:1087 builtin/merge.c:1097
 #, c-format
 msgid "Could not open '%s' for writing"
 msgstr "不能为写入打开 '%s'"
 
-#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868
-#: builtin/merge.c:1090 builtin/merge.c:1103
+#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867
+#: builtin/merge.c:1089 builtin/merge.c:1102
 #, c-format
 msgid "Could not write to '%s'"
 msgstr "不能写入 '%s'"
@@ -695,7 +776,7 @@
 "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n"
 "对修正后的文件做标记,然后用 'git commit' 提交"
 
-#: sequencer.c:160 sequencer.c:758 sequencer.c:841
+#: sequencer.c:160 sequencer.c:765 sequencer.c:848
 #, c-format
 msgid "Could not write to %s"
 msgstr "不能写入 %s"
@@ -731,178 +812,178 @@
 msgid "Unable to update cache tree\n"
 msgstr "不能更新缓存\n"
 
-#: sequencer.c:324
+#: sequencer.c:327
 #, c-format
 msgid "Could not parse commit %s\n"
 msgstr "不能解析提交 %s\n"
 
-#: sequencer.c:329
+#: sequencer.c:332
 #, c-format
 msgid "Could not parse parent commit %s\n"
 msgstr "不能解析父提交 %s\n"
 
-#: sequencer.c:395
+#: sequencer.c:398
 msgid "Your index file is unmerged."
 msgstr "您的索引文件未完成合并。"
 
-#: sequencer.c:398
+#: sequencer.c:401
 msgid "You do not have a valid HEAD"
 msgstr "您没有一个有效的 HEAD"
 
-#: sequencer.c:413
+#: sequencer.c:416
 #, c-format
 msgid "Commit %s is a merge but no -m option was given."
 msgstr "提交 %s 是一个合并提交但未提供 -m 选项。"
 
-#: sequencer.c:421
+#: sequencer.c:424
 #, c-format
 msgid "Commit %s does not have parent %d"
 msgstr "提交 %s 没有父提交 %d"
 
-#: sequencer.c:425
+#: sequencer.c:428
 #, c-format
 msgid "Mainline was specified but commit %s is not a merge."
 msgstr "指定了主线但提交 %s 不是一个合并。"
 
 #. TRANSLATORS: The first %s will be "revert" or
 #. "cherry-pick", the second %s a SHA1
-#: sequencer.c:436
+#: sequencer.c:439
 #, c-format
 msgid "%s: cannot parse parent commit %s"
 msgstr "%s:不能解析父提交 %s"
 
-#: sequencer.c:440
+#: sequencer.c:443
 #, c-format
 msgid "Cannot get commit message for %s"
 msgstr "不能得到 %s 的提交说明"
 
-#: sequencer.c:524
+#: sequencer.c:527
 #, c-format
 msgid "could not revert %s... %s"
 msgstr "不能还原 %s... %s"
 
-#: sequencer.c:525
+#: sequencer.c:528
 #, c-format
 msgid "could not apply %s... %s"
 msgstr "不能应用 %s... %s"
 
-#: sequencer.c:553
+#: sequencer.c:560
 msgid "empty commit set passed"
 msgstr "提供了空的提交集"
 
-#: sequencer.c:561
+#: sequencer.c:568
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s:无法读取索引"
 
-#: sequencer.c:566
+#: sequencer.c:573
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s:无法刷新索引"
 
-#: sequencer.c:624
+#: sequencer.c:631
 #, c-format
 msgid "Cannot %s during a %s"
 msgstr "无法 %s 在一个 %s 过程中"
 
-#: sequencer.c:646
+#: sequencer.c:653
 #, c-format
 msgid "Could not parse line %d."
 msgstr "不能解析第 %d 行。"
 
-#: sequencer.c:651
+#: sequencer.c:658
 msgid "No commits parsed."
 msgstr "没有提交被解析。"
 
-#: sequencer.c:664
+#: sequencer.c:671
 #, c-format
 msgid "Could not open %s"
 msgstr "不能打开 %s"
 
-#: sequencer.c:668
+#: sequencer.c:675
 #, c-format
 msgid "Could not read %s."
 msgstr "不能读取 %s。"
 
-#: sequencer.c:675
+#: sequencer.c:682
 #, c-format
 msgid "Unusable instruction sheet: %s"
 msgstr "无用的指令表单:%s"
 
-#: sequencer.c:703
+#: sequencer.c:710
 #, c-format
 msgid "Invalid key: %s"
 msgstr "无效键名:%s"
 
-#: sequencer.c:706
+#: sequencer.c:713
 #, c-format
 msgid "Invalid value for %s: %s"
 msgstr "%s 的值无效:%s"
 
-#: sequencer.c:718
+#: sequencer.c:725
 #, c-format
 msgid "Malformed options sheet: %s"
 msgstr "非法的选项表单:%s"
 
-#: sequencer.c:739
+#: sequencer.c:746
 msgid "a cherry-pick or revert is already in progress"
 msgstr "一个拣选或还原操作已在进行"
 
-#: sequencer.c:740
+#: sequencer.c:747
 msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
 msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\""
 
-#: sequencer.c:744
+#: sequencer.c:751
 #, c-format
 msgid "Could not create sequencer directory %s"
 msgstr "不能创建序列目录 %s"
 
-#: sequencer.c:760 sequencer.c:845
+#: sequencer.c:767 sequencer.c:852
 #, c-format
 msgid "Error wrapping up %s."
 msgstr "错误收尾 %s。"
 
-#: sequencer.c:779 sequencer.c:913
+#: sequencer.c:786 sequencer.c:920
 msgid "no cherry-pick or revert in progress"
-msgstr "没有拣选或还原操作在进行"
+msgstr "拣选或还原操作并未进行"
 
-#: sequencer.c:781
+#: sequencer.c:788
 msgid "cannot resolve HEAD"
 msgstr "不能解析 HEAD"
 
-#: sequencer.c:783
+#: sequencer.c:790
 msgid "cannot abort from a branch yet to be born"
 msgstr "不能从尚未建立的分支终止"
 
-#: sequencer.c:805 builtin/apply.c:3988
+#: sequencer.c:812 builtin/apply.c:4005
 #, c-format
 msgid "cannot open %s: %s"
 msgstr "不能打开 %s:%s"
 
-#: sequencer.c:808
+#: sequencer.c:815
 #, c-format
 msgid "cannot read %s: %s"
 msgstr "不能读取 %s:%s"
 
-#: sequencer.c:809
+#: sequencer.c:816
 msgid "unexpected end of file"
-msgstr "未预期的文件结束"
+msgstr "意外的文件结束"
 
-#: sequencer.c:815
+#: sequencer.c:822
 #, c-format
 msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
 msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏"
 
-#: sequencer.c:838
+#: sequencer.c:845
 #, c-format
 msgid "Could not format %s."
 msgstr "不能格式化 %s。"
 
-#: sequencer.c:1000
+#: sequencer.c:1007
 msgid "Can't revert as initial commit"
 msgstr "不能作为初始提交还原"
 
-#: sequencer.c:1001
+#: sequencer.c:1008
 msgid "Can't cherry-pick into empty head"
 msgstr "不能拣选到空分支"
 
@@ -925,12 +1006,17 @@
 msgid "Upstream branch '%s' not stored as a remote-tracking branch"
 msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
 
-#: wrapper.c:413
+#: wrapper.c:408
+#, fuzzy, c-format
+msgid "unable to access '%s': %s"
+msgstr "不能创建 '%s'"
+
+#: wrapper.c:426
 #, c-format
 msgid "unable to look up current user in the passwd file: %s"
-msgstr "无法在 passwd 文件中查询到当前用户:%s"
+msgstr "无法在 passwd 文件中查询到该用户:%s"
 
-#: wrapper.c:414
+#: wrapper.c:427
 msgid "no such user"
 msgstr "无此用户"
 
@@ -993,11 +1079,6 @@
 msgid "  (commit or discard the untracked or modified content in submodules)"
 msgstr "  (提交或丢弃子模组中未跟踪或修改的内容)"
 
-#: wt-status.c:224
-#, c-format
-msgid "%s files:"
-msgstr "%s文件:"
-
 #  译者:注意保持前导空格
 #: wt-status.c:227
 #, c-format
@@ -1106,7 +1187,7 @@
 
 #: wt-status.c:785
 msgid "You have unmerged paths."
-msgstr "您有路径尚未合并。"
+msgstr "您有尚未合并的路径。"
 
 #  译者:注意保持前导空格
 #: wt-status.c:788 wt-status.c:912
@@ -1191,7 +1272,7 @@
 #: wt-status.c:898
 msgid ""
 "  (use \"git rebase --continue\" once you are satisfied with your changes)"
-msgstr "  (执行 \"git rebase --continue\" 一旦您满意您的修改)"
+msgstr "  (当您对您的修改满意后执行 \"git rebase --continue\")"
 
 #: wt-status.c:908
 msgid "You are currently cherry-picking."
@@ -1224,11 +1305,13 @@
 msgstr "初始提交"
 
 #: wt-status.c:1011
-msgid "Untracked"
+#, fuzzy
+msgid "Untracked files"
 msgstr "未跟踪的"
 
 #: wt-status.c:1013
-msgid "Ignored"
+#, fuzzy
+msgid "Ignored files"
 msgstr "忽略的"
 
 #: wt-status.c:1015
@@ -1245,70 +1328,86 @@
 msgid "No changes"
 msgstr "没有修改"
 
-#: wt-status.c:1027
-#, c-format
-msgid "no changes added to commit%s\n"
-msgstr "修改尚未加入提交%s\n"
-
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1029
-msgid " (use \"git add\" and/or \"git commit -a\")"
+#: wt-status.c:1028
+#, fuzzy, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
 msgstr "(使用 \"git add\" 和/或 \"git commit -a\")"
 
 #: wt-status.c:1031
-#, c-format
-msgid "nothing added to commit but untracked files present%s\n"
+#, fuzzy, c-format
+msgid "no changes added to commit\n"
+msgstr "修改尚未加入提交%s\n"
+
+#: wt-status.c:1034
+#, fuzzy, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr "空提交但存在未跟踪文件%s\n"
+
+#: wt-status.c:1037
+#, fuzzy, c-format
+msgid "nothing added to commit but untracked files present\n"
 msgstr "空提交但存在未跟踪文件%s\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1033
-msgid " (use \"git add\" to track)"
-msgstr "(使用 \"git add\" 建立跟踪)"
+#: wt-status.c:1040
+#, fuzzy, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr "(新建/拷贝的文件使用 \"git add\" 建立跟踪)"
 
-#: wt-status.c:1035 wt-status.c:1038 wt-status.c:1041
-#, c-format
-msgid "nothing to commit%s\n"
+#: wt-status.c:1043 wt-status.c:1048
+#, fuzzy, c-format
+msgid "nothing to commit\n"
 msgstr "无须提交%s\n"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1036
-msgid " (create/copy files and use \"git add\" to track)"
-msgstr "(新建/拷贝的文件使用 \"git add\" 建立跟踪)"
-
-#  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1039
-msgid " (use -u to show untracked files)"
+#: wt-status.c:1046
+#, fuzzy, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr "(使用 -u 显示未跟踪文件)"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: wt-status.c:1042
-msgid " (working directory clean)"
+#: wt-status.c:1050
+#, fuzzy, c-format
+msgid "nothing to commit, working directory clean\n"
 msgstr "(干净的工作区)"
 
-#: wt-status.c:1150
+#: wt-status.c:1158
 msgid "HEAD (no branch)"
 msgstr "HEAD(非分支)"
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1156
+#: wt-status.c:1164
 msgid "Initial commit on "
 msgstr "初始提交于 "
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1171
+#: wt-status.c:1179
 msgid "behind "
 msgstr "落后 "
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1174 wt-status.c:1177
+#: wt-status.c:1182 wt-status.c:1185
 msgid "ahead "
 msgstr "领先 "
 
 #  译者:注意保持句尾空格
-#: wt-status.c:1179
+#: wt-status.c:1187
 msgid ", behind "
 msgstr ",落后 "
 
+#: compat/precompose_utf8.c:58 builtin/clone.c:341
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "无法删除 '%s'"
+
+#: builtin/add.c:19
+#, fuzzy
+msgid "git add [options] [--] <filepattern>..."
+msgstr "git apply [选项] [<补丁>...]"
+
 #: builtin/add.c:62
 #, c-format
 msgid "unexpected diff status %c"
@@ -1332,7 +1431,7 @@
 msgid "Unstaged changes after refreshing the index:"
 msgstr "刷新索引之后尚未被暂存的变更:"
 
-#: builtin/add.c:195 builtin/add.c:459 builtin/rm.c:186
+#: builtin/add.c:195 builtin/add.c:460 builtin/rm.c:186
 #, c-format
 msgid "pathspec '%s' did not match any files"
 msgstr "路径 '%s' 未匹配任何文件"
@@ -1349,11 +1448,11 @@
 #: builtin/add.c:286
 #, c-format
 msgid "Could not open '%s' for writing."
-msgstr "不能为写入打开 '%s'。"
+msgstr "不能打开 '%s' 以写入。"
 
 #: builtin/add.c:290
 msgid "Could not write patch"
-msgstr "不能写补丁"
+msgstr "不能生成补丁"
 
 #: builtin/add.c:295
 #, c-format
@@ -1369,47 +1468,102 @@
 msgid "Could not apply '%s'"
 msgstr "不能应用 '%s'"
 
-#: builtin/add.c:312
+#: builtin/add.c:313
 msgid "The following paths are ignored by one of your .gitignore files:\n"
-msgstr "下列路径被您的一个 .gitignore 文件所忽略:\n"
+msgstr "下列路径根据您的一个 .gitignore 文件而被忽略:\n"
 
-#: builtin/add.c:352
+#: builtin/add.c:319 builtin/clean.c:52 builtin/fetch.c:78 builtin/mv.c:63
+#: builtin/prune-packed.c:76 builtin/push.c:388 builtin/remote.c:1253
+#: builtin/rm.c:133
+msgid "dry run"
+msgstr ""
+
+#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187
+#: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477
+#: builtin/mv.c:62 builtin/read-tree.c:112
+msgid "be verbose"
+msgstr "冗长输出"
+
+#: builtin/add.c:322
+#, fuzzy
+msgid "interactive picking"
+msgstr "交互式添加失败"
+
+#: builtin/add.c:323 builtin/checkout.c:1028 builtin/reset.c:248
+msgid "select hunks interactively"
+msgstr ""
+
+#: builtin/add.c:324
+msgid "edit current diff and apply"
+msgstr ""
+
+#: builtin/add.c:325
+msgid "allow adding otherwise ignored files"
+msgstr ""
+
+#: builtin/add.c:326
+#, fuzzy
+msgid "update tracked files"
+msgstr "无法存储包文件"
+
+#: builtin/add.c:327
+msgid "record only the fact that the path will be added later"
+msgstr ""
+
+#: builtin/add.c:328
+msgid "add changes from all tracked and untracked files"
+msgstr ""
+
+#: builtin/add.c:329
+#, fuzzy
+msgid "don't add, only refresh the index"
+msgstr "git %s:无法刷新索引"
+
+#: builtin/add.c:330
+msgid "just skip files which cannot be added because of errors"
+msgstr ""
+
+#: builtin/add.c:331
+msgid "check if - even missing - files are ignored in dry run"
+msgstr ""
+
+#: builtin/add.c:353
 #, c-format
 msgid "Use -f if you really want to add them.\n"
 msgstr "使用 -f 参数如果您确实要添加它们。\n"
 
-#: builtin/add.c:353
+#: builtin/add.c:354
 msgid "no files added"
 msgstr "没有文件被添加"
 
-#: builtin/add.c:359
+#: builtin/add.c:360
 msgid "adding files failed"
 msgstr "添加文件失败"
 
-#: builtin/add.c:391
+#: builtin/add.c:392
 msgid "-A and -u are mutually incompatible"
 msgstr "-A 和 -u 选项互斥"
 
-#: builtin/add.c:393
+#: builtin/add.c:394
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr "选项 --ignore-missing 只能和 --dry-run 同时使用"
 
-#: builtin/add.c:413
+#: builtin/add.c:414
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "没有指定文件,也没有文件被添加。\n"
 
-#: builtin/add.c:414
+#: builtin/add.c:415
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "也许您想要执行 'git add .'?\n"
 
-#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
+#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82
 #: builtin/rm.c:162
 msgid "index file corrupt"
 msgstr "索引文件损坏"
 
-#: builtin/add.c:480 builtin/apply.c:4433 builtin/mv.c:229 builtin/rm.c:260
+#: builtin/add.c:481 builtin/apply.c:4450 builtin/mv.c:229 builtin/rm.c:260
 msgid "Unable to write new index file"
 msgstr "无法写入新索引文件"
 
@@ -1427,52 +1581,52 @@
 msgid "unrecognized whitespace ignore option '%s'"
 msgstr "未能识别的空白字符忽略选项 '%s'"
 
-#: builtin/apply.c:824
+#: builtin/apply.c:823
 #, c-format
 msgid "Cannot prepare timestamp regexp %s"
 msgstr "无法准备时间戳正则表达式 %s"
 
-#: builtin/apply.c:833
+#: builtin/apply.c:832
 #, c-format
 msgid "regexec returned %d for input: %s"
 msgstr "regexec 返回 %d,输入为:%s"
 
-#: builtin/apply.c:914
+#: builtin/apply.c:913
 #, c-format
 msgid "unable to find filename in patch at line %d"
 msgstr "不能在补丁的第 %d 行找到文件名"
 
-#: builtin/apply.c:946
+#: builtin/apply.c:945
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr "git apply:错误的 git-diff - 期望 /dev/null,但在第 %2$d 行得到 %1$s"
+msgstr "git apply:错误的 git-diff - 应为 /dev/null,但在第 %2$d 行得到 %1$s"
 
-#: builtin/apply.c:950
+#: builtin/apply.c:949
 #, c-format
 msgid "git apply: bad git-diff - inconsistent new filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致"
 
-#: builtin/apply.c:951
+#: builtin/apply.c:950
 #, c-format
 msgid "git apply: bad git-diff - inconsistent old filename on line %d"
 msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致"
 
-#: builtin/apply.c:958
+#: builtin/apply.c:957
 #, c-format
 msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr "git apply:错误的 git-diff - 期望 /dev/null 于第 %d 行"
+msgstr "git apply:错误的 git-diff - 第 %d 行处应为 /dev/null"
 
-#: builtin/apply.c:1403
+#: builtin/apply.c:1420
 #, c-format
 msgid "recount: unexpected line: %.*s"
 msgstr "recount:意外的行:%.*s"
 
-#: builtin/apply.c:1460
+#: builtin/apply.c:1477
 #, c-format
 msgid "patch fragment without header at line %d: %.*s"
 msgstr "第 %d 行的补丁片段没有头信息:%.*s"
 
-#: builtin/apply.c:1477
+#: builtin/apply.c:1494
 #, c-format
 msgid ""
 "git diff header lacks filename information when removing %d leading pathname "
@@ -1483,82 +1637,82 @@
 msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)"
 
-#: builtin/apply.c:1637
+#: builtin/apply.c:1654
 msgid "new file depends on old contents"
 msgstr "新文件依赖旧内容"
 
-#: builtin/apply.c:1639
+#: builtin/apply.c:1656
 msgid "deleted file still has contents"
 msgstr "删除的文件仍有内容"
 
-#: builtin/apply.c:1665
+#: builtin/apply.c:1682
 #, c-format
 msgid "corrupt patch at line %d"
-msgstr "补丁损坏位于第 %d 行"
+msgstr "补丁在第 %d 行损坏"
 
-#: builtin/apply.c:1701
+#: builtin/apply.c:1718
 #, c-format
 msgid "new file %s depends on old contents"
 msgstr "新文件 %s 依赖旧内容"
 
-#: builtin/apply.c:1703
+#: builtin/apply.c:1720
 #, c-format
 msgid "deleted file %s still has contents"
 msgstr "删除的文件 %s 仍有内容"
 
-#: builtin/apply.c:1706
+#: builtin/apply.c:1723
 #, c-format
 msgid "** warning: file %s becomes empty but is not deleted"
 msgstr "** 警告:文件 %s 成为空文件但并未删除"
 
-#: builtin/apply.c:1852
+#: builtin/apply.c:1869
 #, c-format
 msgid "corrupt binary patch at line %d: %.*s"
 msgstr "二进制补丁在第 %d 行损坏:%.*s"
 
 #. there has to be one hunk (forward hunk)
-#: builtin/apply.c:1881
+#: builtin/apply.c:1898
 #, c-format
 msgid "unrecognized binary patch at line %d"
 msgstr "未能识别的二进制补丁位于第 %d 行"
 
-#: builtin/apply.c:1967
+#: builtin/apply.c:1984
 #, c-format
 msgid "patch with only garbage at line %d"
 msgstr "补丁文件的第 %d 行只有垃圾数据"
 
-#: builtin/apply.c:2057
+#: builtin/apply.c:2074
 #, c-format
 msgid "unable to read symlink %s"
 msgstr "无法读取符号链接 %s"
 
-#: builtin/apply.c:2061
+#: builtin/apply.c:2078
 #, c-format
 msgid "unable to open or read %s"
 msgstr "不能打开或读取 %s"
 
-#: builtin/apply.c:2132
+#: builtin/apply.c:2149
 msgid "oops"
 msgstr "哎哟"
 
-#: builtin/apply.c:2654
+#: builtin/apply.c:2671
 #, c-format
 msgid "invalid start of line: '%c'"
 msgstr "无效的行首字符:'%c'"
 
-#: builtin/apply.c:2772
+#: builtin/apply.c:2789
 #, c-format
 msgid "Hunk #%d succeeded at %d (offset %d line)."
 msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
 msgstr[0] "块 #%d 成功应用于 %d (偏移 %d 行)"
 msgstr[1] "块 #%d 成功应用于 %d (偏移 %d 行)"
 
-#: builtin/apply.c:2784
+#: builtin/apply.c:2801
 #, c-format
 msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
 msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段"
 
-#: builtin/apply.c:2790
+#: builtin/apply.c:2807
 #, c-format
 msgid ""
 "while searching for:\n"
@@ -1567,321 +1721,319 @@
 "当查询:\n"
 "%.*s"
 
-#: builtin/apply.c:2809
+#: builtin/apply.c:2826
 #, c-format
 msgid "missing binary patch data for '%s'"
 msgstr "缺失 '%s' 的二进制补丁数据"
 
-#: builtin/apply.c:2912
+#: builtin/apply.c:2929
 #, c-format
 msgid "binary patch does not apply to '%s'"
 msgstr "二进制补丁未应用到 '%s'"
 
-#: builtin/apply.c:2918
+#: builtin/apply.c:2935
 #, c-format
 msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr "到 '%s' 的二进制补丁产生了不正确的结果(预期 %s,得到 %s)"
+msgstr "到 '%s' 的二进制补丁产生了不正确的结果(应为 %s,却为 %s)"
 
-#: builtin/apply.c:2939
+#: builtin/apply.c:2956
 #, c-format
 msgid "patch failed: %s:%ld"
 msgstr "打补丁失败:%s:%ld"
 
-#: builtin/apply.c:3061
+#: builtin/apply.c:3078
 #, c-format
 msgid "cannot checkout %s"
 msgstr "不能检出 %s"
 
-#: builtin/apply.c:3106 builtin/apply.c:3115 builtin/apply.c:3159
+#: builtin/apply.c:3123 builtin/apply.c:3132 builtin/apply.c:3176
 #, c-format
 msgid "read of %s failed"
 msgstr "读取 %s 失败"
 
-#: builtin/apply.c:3139 builtin/apply.c:3361
+#: builtin/apply.c:3156 builtin/apply.c:3378
 #, c-format
 msgid "path %s has been renamed/deleted"
 msgstr "路径 %s 已经被重命名/删除"
 
-#: builtin/apply.c:3220 builtin/apply.c:3375
+#: builtin/apply.c:3237 builtin/apply.c:3392
 #, c-format
 msgid "%s: does not exist in index"
 msgstr "%s:不存在于索引中"
 
-#: builtin/apply.c:3224 builtin/apply.c:3367 builtin/apply.c:3389
+#: builtin/apply.c:3241 builtin/apply.c:3384 builtin/apply.c:3406
 #, c-format
 msgid "%s: %s"
 msgstr "%s:%s"
 
-#: builtin/apply.c:3229 builtin/apply.c:3383
+#: builtin/apply.c:3246 builtin/apply.c:3400
 #, c-format
 msgid "%s: does not match index"
 msgstr "%s:和索引不匹配"
 
-#: builtin/apply.c:3331
+#: builtin/apply.c:3348
 msgid "removal patch leaves file contents"
 msgstr "移除补丁仍留下了文件内容"
 
-#: builtin/apply.c:3400
+#: builtin/apply.c:3417
 #, c-format
 msgid "%s: wrong type"
 msgstr "%s:错误类型"
 
-#: builtin/apply.c:3402
+#: builtin/apply.c:3419
 #, c-format
 msgid "%s has type %o, expected %o"
-msgstr "%s 的类型是 %o,预期是 %o"
+msgstr "%s 的类型是 %o,应为 %o"
 
-#: builtin/apply.c:3503
+#: builtin/apply.c:3520
 #, c-format
 msgid "%s: already exists in index"
 msgstr "%s:已经存在于索引中"
 
-#: builtin/apply.c:3506
+#: builtin/apply.c:3523
 #, c-format
 msgid "%s: already exists in working directory"
 msgstr "%s:已经存在于工作区中"
 
-#: builtin/apply.c:3526
+#: builtin/apply.c:3543
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o)"
 msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配"
 
-#: builtin/apply.c:3531
+#: builtin/apply.c:3548
 #, c-format
 msgid "new mode (%o) of %s does not match old mode (%o) of %s"
 msgstr "%2$s 的新模式(%1$o)和 %4$s 的旧模式(%3$o)不匹配"
 
-#: builtin/apply.c:3539
+#: builtin/apply.c:3556
 #, c-format
 msgid "%s: patch does not apply"
 msgstr "%s:补丁未应用"
 
-#: builtin/apply.c:3552
+#: builtin/apply.c:3569
 #, c-format
 msgid "Checking patch %s..."
 msgstr "检查补丁 %s..."
 
-#: builtin/apply.c:3607 builtin/checkout.c:213 builtin/reset.c:158
+#: builtin/apply.c:3624 builtin/checkout.c:215 builtin/reset.c:158
 #, c-format
 msgid "make_cache_entry failed for path '%s'"
 msgstr "对路径 '%s' 的 make_cache_entry 操作失败"
 
-#: builtin/apply.c:3750
+#: builtin/apply.c:3767
 #, c-format
 msgid "unable to remove %s from index"
 msgstr "不能从索引中移除 %s"
 
-#: builtin/apply.c:3778
+#: builtin/apply.c:3795
 #, c-format
 msgid "corrupt patch for subproject %s"
 msgstr "子项目 %s 损坏的补丁"
 
-#: builtin/apply.c:3782
+#: builtin/apply.c:3799
 #, c-format
 msgid "unable to stat newly created file '%s'"
 msgstr "不能枚举新建文件 '%s' 的状态"
 
-#: builtin/apply.c:3787
+#: builtin/apply.c:3804
 #, c-format
 msgid "unable to create backing store for newly created file %s"
 msgstr "不能为新建文件 %s 创建后端存储"
 
-#: builtin/apply.c:3790 builtin/apply.c:3898
+#: builtin/apply.c:3807 builtin/apply.c:3915
 #, c-format
 msgid "unable to add cache entry for %s"
 msgstr "无法为 %s 添加缓存条目"
 
-#: builtin/apply.c:3823
+#: builtin/apply.c:3840
 #, c-format
 msgid "closing file '%s'"
 msgstr "关闭文件 '%s'"
 
-#: builtin/apply.c:3872
+#: builtin/apply.c:3889
 #, c-format
 msgid "unable to write file '%s' mode %o"
 msgstr "不能写文件 '%s' 权限 %o"
 
-#: builtin/apply.c:3959
+#: builtin/apply.c:3976
 #, c-format
 msgid "Applied patch %s cleanly."
 msgstr "成功应用补丁 %s。"
 
-#: builtin/apply.c:3967
+#: builtin/apply.c:3984
 msgid "internal error"
 msgstr "内部错误"
 
 #. Say this even without --verbose
-#: builtin/apply.c:3970
+#: builtin/apply.c:3987
 #, c-format
 msgid "Applying patch %%s with %d reject..."
 msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] "应用补丁 %%s 时 %d 个被拒绝..."
-msgstr[1] "应用补丁 %%s 时 %d 个被拒绝..."
+msgstr[0] "应用 %%s 个补丁,其中 %d 个被拒绝..."
+msgstr[1] "应用 %%s 个补丁,其中 %d 个被拒绝..."
 
-#: builtin/apply.c:3980
+#: builtin/apply.c:3997
 #, c-format
 msgid "truncating .rej filename to %.*s.rej"
 msgstr "截短 .rej 文件名为 %.*s.rej"
 
-#: builtin/apply.c:4001
+#: builtin/apply.c:4018
 #, c-format
 msgid "Hunk #%d applied cleanly."
 msgstr "第 #%d 个片段成功应用。"
 
-#: builtin/apply.c:4004
+#: builtin/apply.c:4021
 #, c-format
 msgid "Rejected hunk #%d."
 msgstr "拒绝第 #%d 个片段。"
 
-#: builtin/apply.c:4154
+#: builtin/apply.c:4171
 msgid "unrecognized input"
 msgstr "未能识别的输入"
 
-#: builtin/apply.c:4165
+#: builtin/apply.c:4182
 msgid "unable to read index file"
 msgstr "无法读取索引文件"
 
-#: builtin/apply.c:4284 builtin/apply.c:4287
+#: builtin/apply.c:4301 builtin/apply.c:4304 builtin/clone.c:91
+#: builtin/fetch.c:63
 msgid "path"
 msgstr "路径"
 
-#: builtin/apply.c:4285
+#: builtin/apply.c:4302
 msgid "don't apply changes matching the given path"
 msgstr "不要应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4288
+#: builtin/apply.c:4305
 msgid "apply changes matching the given path"
 msgstr "应用与给出路径向匹配的变更"
 
-#: builtin/apply.c:4290
+#: builtin/apply.c:4307
 msgid "num"
 msgstr "数字"
 
-#: builtin/apply.c:4291
+#: builtin/apply.c:4308
 msgid "remove <num> leading slashes from traditional diff paths"
 msgstr "从传统的 diff 路径中移除 <数字> 个前导路径"
 
-#: builtin/apply.c:4294
+#: builtin/apply.c:4311
 msgid "ignore additions made by the patch"
 msgstr "忽略补丁中的添加的文件"
 
-#: builtin/apply.c:4296
+#: builtin/apply.c:4313
 msgid "instead of applying the patch, output diffstat for the input"
 msgstr "不应用补丁,而是显示输入的差异统计(diffstat)"
 
-#: builtin/apply.c:4300
-msgid "shows number of added and deleted lines in decimal notation"
+#: builtin/apply.c:4317
+#, fuzzy
+msgid "show number of added and deleted lines in decimal notation"
 msgstr "以数字方式显示添加或删除行的数量"
 
-#: builtin/apply.c:4302
+#: builtin/apply.c:4319
 msgid "instead of applying the patch, output a summary for the input"
 msgstr "不应用补丁,而是显示输入的概要"
 
-#: builtin/apply.c:4304
+#: builtin/apply.c:4321
 msgid "instead of applying the patch, see if the patch is applicable"
 msgstr "不应用补丁,而是查看补丁是否可应用"
 
-#: builtin/apply.c:4306
+#: builtin/apply.c:4323
 msgid "make sure the patch is applicable to the current index"
 msgstr "确认补丁可以应用到当前索引"
 
-#: builtin/apply.c:4308
+#: builtin/apply.c:4325
 msgid "apply a patch without touching the working tree"
 msgstr "应用补丁而不修改工作区"
 
-#: builtin/apply.c:4310
+#: builtin/apply.c:4327
 msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr "还应用此补丁(使用 --stat/--summary/--check 参数)"
+msgstr "还应用此补丁(与 --stat/--summary/--check 选项同时使用)"
 
-#: builtin/apply.c:4312
+#: builtin/apply.c:4329
 msgid "attempt three-way merge if a patch does not apply"
 msgstr "如果一个补丁不能应用则尝试三路合并"
 
-#: builtin/apply.c:4314
+#: builtin/apply.c:4331
 msgid "build a temporary index based on embedded index information"
 msgstr "创建一个临时索引基于嵌入的索引信息"
 
-#: builtin/apply.c:4316
+#: builtin/apply.c:4333 builtin/checkout-index.c:197 builtin/ls-files.c:460
 msgid "paths are separated with NUL character"
 msgstr "路径以 NUL 字符分隔"
 
-#: builtin/apply.c:4319
+#: builtin/apply.c:4336
 msgid "ensure at least <n> lines of context match"
 msgstr "确保至少匹配 <n> 行上下文"
 
-#: builtin/apply.c:4320
+#: builtin/apply.c:4337
 msgid "action"
 msgstr "动作"
 
-#: builtin/apply.c:4321
+#: builtin/apply.c:4338
 msgid "detect new or modified lines that have whitespace errors"
 msgstr "检查新增和修改的行中间的空白字符滥用"
 
-#: builtin/apply.c:4324 builtin/apply.c:4327
+#: builtin/apply.c:4341 builtin/apply.c:4344
 msgid "ignore changes in whitespace when finding context"
 msgstr "查找上下文时忽略空白字符的变更"
 
-#: builtin/apply.c:4330
+#: builtin/apply.c:4347
 msgid "apply the patch in reverse"
 msgstr "反向应用补丁"
 
-#: builtin/apply.c:4332
+#: builtin/apply.c:4349
 msgid "don't expect at least one line of context"
 msgstr "无需至少一行上下文"
 
-#: builtin/apply.c:4334
+#: builtin/apply.c:4351
 msgid "leave the rejected hunks in corresponding *.rej files"
 msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中"
 
-#: builtin/apply.c:4336
+#: builtin/apply.c:4353
 msgid "allow overlapping hunks"
 msgstr "允许重叠的补丁片段"
 
-#: builtin/apply.c:4337
-msgid "be verbose"
-msgstr "冗长输出"
-
-#: builtin/apply.c:4339
+#: builtin/apply.c:4356
 msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr "宽容不正确的文件末尾换行符"
+msgstr "允许不正确的文件末尾换行符"
 
-#: builtin/apply.c:4342
+#: builtin/apply.c:4359
 msgid "do not trust the line counts in the hunk headers"
 msgstr "不信任补丁片段的头信息中的行号"
 
-#: builtin/apply.c:4344
+#: builtin/apply.c:4361
 msgid "root"
 msgstr "根目录"
 
-#: builtin/apply.c:4345
+#: builtin/apply.c:4362
 msgid "prepend <root> to all filenames"
 msgstr "为所有文件名前添加 <根目录>"
 
-#: builtin/apply.c:4367
+#: builtin/apply.c:4384
 msgid "--3way outside a repository"
 msgstr "--3way 在一个版本库之外"
 
-#: builtin/apply.c:4375
+#: builtin/apply.c:4392
 msgid "--index outside a repository"
 msgstr "--index 在一个版本库之外"
 
-#: builtin/apply.c:4378
+#: builtin/apply.c:4395
 msgid "--cached outside a repository"
 msgstr "--cached 在一个版本库之外"
 
-#: builtin/apply.c:4394
+#: builtin/apply.c:4411
 #, c-format
 msgid "can't open patch '%s'"
 msgstr "不能打开补丁 '%s'"
 
-#: builtin/apply.c:4408
+#: builtin/apply.c:4425
 #, c-format
 msgid "squelched %d whitespace error"
 msgid_plural "squelched %d whitespace errors"
 msgstr[0] "抑制下仍有 %d 个空白字符误用"
 msgstr[1] "抑制下仍有 %d 个空白字符误用"
 
-#: builtin/apply.c:4414 builtin/apply.c:4424
+#: builtin/apply.c:4431 builtin/apply.c:4441
 #, c-format
 msgid "%d line adds whitespace errors."
 msgid_plural "%d lines add whitespace errors."
@@ -1895,7 +2047,7 @@
 
 #: builtin/archive.c:20
 msgid "could not redirect output"
-msgstr "不能输出重定向"
+msgstr "不能重定向输出"
 
 #: builtin/archive.c:37
 msgid "git archive: Remote with no URL"
@@ -1903,7 +2055,7 @@
 
 #: builtin/archive.c:58
 msgid "git archive: expected ACK/NAK, got EOF"
-msgstr "git archive:期待ACK/NACK,却得到EOF"
+msgstr "git archive:应为ACK/NACK,却得到EOF"
 
 #: builtin/archive.c:63
 #, c-format
@@ -1921,10 +2073,142 @@
 
 #: builtin/archive.c:71
 msgid "git archive: expected a flush"
-msgstr "git archive:预期一个刷新"
+msgstr "git archive:应为刷新"
+
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr ""
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr ""
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr ""
+
+#: builtin/blame.c:25
+msgid "git blame [options] [rev-opts] [rev] [--] file"
+msgstr ""
+
+#: builtin/blame.c:30 builtin/shortlog.c:15
+msgid "[rev-opts] are documented in git-rev-list(1)"
+msgstr ""
+
+#: builtin/blame.c:2316
+msgid "Show blame entries as we find them, incrementally"
+msgstr ""
+
+#: builtin/blame.c:2317
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2318
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2319
+#, fuzzy
+msgid "Show work cost statistics"
+msgstr "显示工作区状态"
+
+#: builtin/blame.c:2320
+msgid "Show output score for blame entries"
+msgstr ""
+
+#: builtin/blame.c:2321
+msgid "Show original filename (Default: auto)"
+msgstr ""
+
+#: builtin/blame.c:2322
+msgid "Show original linenumber (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2323
+msgid "Show in a format designed for machine consumption"
+msgstr ""
+
+#: builtin/blame.c:2324
+msgid "Show porcelain format with per-line commit information"
+msgstr ""
+
+#: builtin/blame.c:2325
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2326
+msgid "Show raw timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2327
+msgid "Show long commit SHA1 (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2328
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2329
+msgid "Show author email instead of name (Default: off)"
+msgstr ""
+
+#: builtin/blame.c:2330
+msgid "Ignore whitespace differences"
+msgstr ""
+
+#: builtin/blame.c:2331
+msgid "Spend extra cycles to find better match"
+msgstr ""
+
+#: builtin/blame.c:2332
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr ""
+
+#: builtin/blame.c:2333
+#, fuzzy
+msgid "Use <file>'s contents as the final image"
+msgstr "添加文件内容至索引"
+
+#: builtin/blame.c:2334 builtin/blame.c:2335
+msgid "score"
+msgstr ""
+
+#: builtin/blame.c:2334
+msgid "Find line copies within and across files"
+msgstr ""
+
+#: builtin/blame.c:2335
+msgid "Find line movements within and across files"
+msgstr ""
+
+#: builtin/blame.c:2336
+#, fuzzy
+msgid "n,m"
+msgstr "数字"
+
+#: builtin/blame.c:2336
+msgid "Process only line range n,m, counting from 1"
+msgstr ""
+
+#: builtin/branch.c:23
+msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
+msgstr ""
+
+#: builtin/branch.c:24
+msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
+msgstr ""
+
+#: builtin/branch.c:25
+#, fuzzy
+msgid "git branch [options] [-r] (-d | -D) <branchname>..."
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/branch.c:26
+msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
+msgstr ""
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:144
+#: builtin/branch.c:145
 #, c-format
 msgid ""
 "deleting branch '%s' that has been merged to\n"
@@ -1934,7 +2218,7 @@
 "         '%s',但未合并到 HEAD。"
 
 #  译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长
-#: builtin/branch.c:148
+#: builtin/branch.c:149
 #, c-format
 msgid ""
 "not deleting branch '%s' that is not yet merged to\n"
@@ -1943,35 +2227,35 @@
 "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n"
 "         然而却尚未被合并到分支 '%s' 。"
 
-#: builtin/branch.c:180
+#: builtin/branch.c:181
 msgid "cannot use -a with -d"
 msgstr "不能将 -a 和 -d 同时使用"
 
-#: builtin/branch.c:186
+#: builtin/branch.c:187
 msgid "Couldn't look up commit object for HEAD"
 msgstr "无法查询 HEAD 指向的提交对象"
 
-#: builtin/branch.c:191
+#: builtin/branch.c:192
 #, c-format
 msgid "Cannot delete the branch '%s' which you are currently on."
 msgstr "无法删除您当前所在的分支 '%s'。"
 
-#: builtin/branch.c:202
+#: builtin/branch.c:203
 #, c-format
 msgid "remote branch '%s' not found."
 msgstr "远程分支 '%s' 未发现。"
 
-#: builtin/branch.c:203
+#: builtin/branch.c:204
 #, c-format
 msgid "branch '%s' not found."
 msgstr "分支 '%s' 未发现。"
 
-#: builtin/branch.c:210
+#: builtin/branch.c:211
 #, c-format
 msgid "Couldn't look up commit object for '%s'"
 msgstr "无法查询 '%s' 指向的提交对象"
 
-#: builtin/branch.c:216
+#: builtin/branch.c:217
 #, c-format
 msgid ""
 "The branch '%s' is not fully merged.\n"
@@ -1980,126 +2264,258 @@
 "分支 '%s' 没有完全合并。\n"
 "如果您确认要删除它,执行 'git branch -D %s'。"
 
-#: builtin/branch.c:225
+#: builtin/branch.c:226
 #, c-format
 msgid "Error deleting remote branch '%s'"
 msgstr "删除远程分支 '%s' 时出错"
 
-#: builtin/branch.c:226
+#: builtin/branch.c:227
 #, c-format
 msgid "Error deleting branch '%s'"
 msgstr "删除分支 '%s' 时出错"
 
-#: builtin/branch.c:233
+#: builtin/branch.c:234
 #, c-format
 msgid "Deleted remote branch %s (was %s).\n"
 msgstr "已删除远程分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:234
+#: builtin/branch.c:235
 #, c-format
 msgid "Deleted branch %s (was %s).\n"
 msgstr "已删除分支 %s(曾为 %s)。\n"
 
-#: builtin/branch.c:239
+#: builtin/branch.c:240
 msgid "Update of config-file failed"
 msgstr "无法更新 config 文件"
 
-#: builtin/branch.c:337
+#: builtin/branch.c:338
 #, c-format
 msgid "branch '%s' does not point at a commit"
 msgstr "分支 '%s' 未指向一个提交"
 
-#: builtin/branch.c:409
+#: builtin/branch.c:410
 #, c-format
 msgid "[%s: behind %d]"
 msgstr "[%s:落后 %d]"
 
-#: builtin/branch.c:411
+#: builtin/branch.c:412
 #, c-format
 msgid "[behind %d]"
 msgstr "[落后 %d]"
 
-#: builtin/branch.c:415
+#: builtin/branch.c:416
 #, c-format
 msgid "[%s: ahead %d]"
 msgstr "[%s:领先 %d]"
 
-#: builtin/branch.c:417
+#: builtin/branch.c:418
 #, c-format
 msgid "[ahead %d]"
 msgstr "[领先 %d]"
 
-#: builtin/branch.c:420
+#: builtin/branch.c:421
 #, c-format
 msgid "[%s: ahead %d, behind %d]"
 msgstr "[%s:领先 %d,落后 %d]"
 
-#: builtin/branch.c:423
+#: builtin/branch.c:424
 #, c-format
 msgid "[ahead %d, behind %d]"
 msgstr "[领先 %d,落后 %d]"
 
-#: builtin/branch.c:535
+#: builtin/branch.c:537
 msgid "(no branch)"
 msgstr "(非分支)"
 
-#: builtin/branch.c:600
+#: builtin/branch.c:602
 msgid "some refs could not be read"
 msgstr "一些引用不能读取"
 
-#: builtin/branch.c:613
+#: builtin/branch.c:615
 msgid "cannot rename the current branch while not on any."
 msgstr "无法重命名当前分支因为不处于任何分支上。"
 
-#: builtin/branch.c:623
+#: builtin/branch.c:625
 #, c-format
 msgid "Invalid branch name: '%s'"
 msgstr "无效的分支名:'%s'"
 
-#: builtin/branch.c:638
+#: builtin/branch.c:640
 msgid "Branch rename failed"
 msgstr "分支重命名失败"
 
-#: builtin/branch.c:642
+#: builtin/branch.c:644
 #, c-format
 msgid "Renamed a misnamed branch '%s' away"
 msgstr "重命名掉一个错误命名的旧分支 '%s'"
 
-#: builtin/branch.c:646
+#: builtin/branch.c:648
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "分支重命名为 %s,但 HEAD 没有更新!"
 
-#: builtin/branch.c:653
+#: builtin/branch.c:655
 msgid "Branch is renamed, but update of config-file failed"
 msgstr "分支被重命名,但更新 config 文件失败"
 
-#: builtin/branch.c:668
+#: builtin/branch.c:670
 #, c-format
 msgid "malformed object name %s"
 msgstr "非法的对象名 %s"
 
-#: builtin/branch.c:692
+#: builtin/branch.c:694
 #, c-format
 msgid "could not write branch description template: %s"
 msgstr "不能写分支描述模版:%s"
 
-#: builtin/branch.c:783
+#: builtin/branch.c:724
+#, fuzzy
+msgid "Generic options"
+msgstr "无效选项:%s"
+
+#: builtin/branch.c:726
+msgid "show hash and subject, give twice for upstream branch"
+msgstr ""
+
+#: builtin/branch.c:727
+msgid "suppress informational messages"
+msgstr ""
+
+#: builtin/branch.c:728
+msgid "set up tracking mode (see git-pull(1))"
+msgstr ""
+
+#: builtin/branch.c:730
+msgid "change upstream info"
+msgstr ""
+
+#: builtin/branch.c:734
+#, fuzzy
+msgid "use colored output"
+msgstr "不能输出重定向"
+
+#: builtin/branch.c:735
+#, fuzzy
+msgid "act on remote-tracking branches"
+msgstr "%s 没有来自 %s 的远程跟踪分支"
+
+#: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765
+#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396
+#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470
+#, fuzzy
+msgid "commit"
+msgstr "(坏提交)\n"
+
+#: builtin/branch.c:739 builtin/branch.c:745
+msgid "print only branches that contain the commit"
+msgstr ""
+
+#: builtin/branch.c:751
+msgid "Specific git-branch actions:"
+msgstr ""
+
+#: builtin/branch.c:752
+msgid "list both remote-tracking and local branches"
+msgstr ""
+
+#: builtin/branch.c:754
+msgid "delete fully merged branch"
+msgstr ""
+
+#: builtin/branch.c:755
+msgid "delete branch (even if not merged)"
+msgstr ""
+
+#: builtin/branch.c:756
+msgid "move/rename a branch and its reflog"
+msgstr ""
+
+#: builtin/branch.c:757
+msgid "move/rename a branch, even if target exists"
+msgstr ""
+
+#: builtin/branch.c:758
+#, fuzzy
+msgid "list branch names"
+msgstr "无效的分支名:'%s'"
+
+#: builtin/branch.c:759
+msgid "create the branch's reflog"
+msgstr ""
+
+#: builtin/branch.c:761
+msgid "edit the description for the branch"
+msgstr ""
+
+#: builtin/branch.c:762
+#, fuzzy
+msgid "force creation (when already exists)"
+msgstr "远程 %s 已经存在。"
+
+#: builtin/branch.c:765
+#, fuzzy
+msgid "print only not merged branches"
+msgstr "无法移除分支 %s"
+
+#: builtin/branch.c:771
+msgid "print only merged branches"
+msgstr ""
+
+#: builtin/branch.c:775
+msgid "list branches in columns"
+msgstr ""
+
+#: builtin/branch.c:788
 msgid "Failed to resolve HEAD as a valid ref."
 msgstr "无法将 HEAD 解析为有效引用。"
 
-#: builtin/branch.c:788 builtin/clone.c:561
+#: builtin/branch.c:793 builtin/clone.c:561
 msgid "HEAD not found below refs/heads!"
 msgstr "HEAD 没有位于 /refs/heads 之下!"
 
-#: builtin/branch.c:808
+#: builtin/branch.c:813
 msgid "--column and --verbose are incompatible"
 msgstr "--column 和 --verbose 不兼容"
 
-#: builtin/branch.c:857
+#: builtin/branch.c:864
+#, fuzzy, c-format
+msgid "branch '%s' does not exist"
+msgstr "版本库 '%s' 不存在"
+
+#: builtin/branch.c:876
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr ""
+
+#: builtin/branch.c:891
 msgid "-a and -r options to 'git branch' do not make sense with a branch name"
 msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义"
 
+#: builtin/branch.c:894
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr ""
+
+#: builtin/branch.c:911
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr ""
+
+#: builtin/branch.c:912
+#, fuzzy, c-format
+msgid "    git branch -d %s\n"
+msgstr "  HEAD分支:%s"
+
+#: builtin/branch.c:913
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr ""
+
 #: builtin/bundle.c:47
 #, c-format
 msgid "%s is okay\n"
@@ -2113,100 +2529,238 @@
 msgid "Need a repository to unbundle."
 msgstr "需要一个版本库来解包。"
 
-#: builtin/checkout.c:114 builtin/checkout.c:147
+#: builtin/cat-file.c:247
+msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
+msgstr ""
+
+#: builtin/cat-file.c:248
+msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
+msgstr ""
+
+#: builtin/cat-file.c:266
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr ""
+
+#: builtin/cat-file.c:267
+#, fuzzy
+msgid "show object type"
+msgstr "坏的对象类型。"
+
+#: builtin/cat-file.c:268
+#, fuzzy
+msgid "show object size"
+msgstr "坏对象 %s"
+
+#: builtin/cat-file.c:270
+msgid "exit with zero when there's no error"
+msgstr ""
+
+#: builtin/cat-file.c:271
+msgid "pretty-print object's content"
+msgstr ""
+
+#: builtin/cat-file.c:273
+msgid "for blob objects, run textconv on object's content"
+msgstr ""
+
+#: builtin/cat-file.c:275
+msgid "show info and content of objects fed from the standard input"
+msgstr ""
+
+#: builtin/cat-file.c:278
+#, fuzzy
+msgid "show info about objects fed from the standard input"
+msgstr "不能从标准输入中读取日志信息"
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | attr...] [--] pathname..."
+msgstr ""
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-a | --all | attr...] < <list-of-paths>"
+msgstr ""
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr ""
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr ""
+
+#: builtin/check-attr.c:21 builtin/hash-object.c:75
+#, fuzzy
+msgid "read file names from stdin"
+msgstr "(正从标准输入中读取日志信息)\n"
+
+#: builtin/check-attr.c:23
+#, fuzzy
+msgid "input paths are terminated by a null character"
+msgstr "路径以 NUL 字符分隔"
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [options] [--] [<file>...]"
+msgstr ""
+
+#: builtin/checkout-index.c:187
+msgid "check out all files in the index"
+msgstr ""
+
+#: builtin/checkout-index.c:188
+msgid "force overwrite of existing files"
+msgstr ""
+
+#: builtin/checkout-index.c:190
+msgid "no warning for existing files and files not in index"
+msgstr ""
+
+#: builtin/checkout-index.c:192
+#, fuzzy
+msgid "don't checkout new files"
+msgstr "不能检出 %s"
+
+#: builtin/checkout-index.c:194
+#, fuzzy
+msgid "update stat information in the index file"
+msgstr "无法写新的索引文件"
+
+#: builtin/checkout-index.c:200
+#, fuzzy
+msgid "read list of paths from the standard input"
+msgstr "(正从标准输入中读取日志信息)\n"
+
+#: builtin/checkout-index.c:202
+msgid "write the content to temporary files"
+msgstr ""
+
+#: builtin/checkout-index.c:203 builtin/column.c:30
+msgid "string"
+msgstr ""
+
+#: builtin/checkout-index.c:204
+msgid "when creating files, prepend <string>"
+msgstr ""
+
+#: builtin/checkout-index.c:207
+msgid "copy out the files from named stage"
+msgstr ""
+
+#: builtin/checkout.c:25
+#, fuzzy
+msgid "git checkout [options] <branch>"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/checkout.c:26
+#, fuzzy
+msgid "git checkout [options] [<branch>] -- <file>..."
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/checkout.c:116 builtin/checkout.c:149
 #, c-format
 msgid "path '%s' does not have our version"
 msgstr "路径 '%s' 没有我们的版本"
 
-#: builtin/checkout.c:116 builtin/checkout.c:149
+#: builtin/checkout.c:118 builtin/checkout.c:151
 #, c-format
 msgid "path '%s' does not have their version"
 msgstr "路径 '%s' 没有他们的版本"
 
-#: builtin/checkout.c:132
+#: builtin/checkout.c:134
 #, c-format
 msgid "path '%s' does not have all necessary versions"
 msgstr "路径 '%s' 没有全部必须的版本"
 
-#: builtin/checkout.c:176
+#: builtin/checkout.c:178
 #, c-format
 msgid "path '%s' does not have necessary versions"
 msgstr "路径 '%s' 没有必须的版本"
 
-#: builtin/checkout.c:193
+#: builtin/checkout.c:195
 #, c-format
 msgid "path '%s': cannot merge"
 msgstr "path '%s':无法合并"
 
-#: builtin/checkout.c:210
+#: builtin/checkout.c:212
 #, c-format
 msgid "Unable to add merge result for '%s'"
 msgstr "无法为 '%s' 添加合并结果"
 
-#: builtin/checkout.c:235 builtin/checkout.c:393
+#: builtin/checkout.c:236 builtin/checkout.c:239 builtin/checkout.c:242
+#: builtin/checkout.c:245
+#, fuzzy, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "%s:%s 不能和 %s 同时使用"
+
+#: builtin/checkout.c:248 builtin/checkout.c:251
+#, fuzzy, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "%s:%s 不能和 %s 同时使用"
+
+#: builtin/checkout.c:254
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr ""
+
+#: builtin/checkout.c:265 builtin/checkout.c:426
 msgid "corrupt index file"
 msgstr "损坏的索引文件"
 
-#: builtin/checkout.c:265 builtin/checkout.c:272
+#: builtin/checkout.c:295 builtin/checkout.c:302
 #, c-format
 msgid "path '%s' is unmerged"
 msgstr "路径 '%s' 未合并"
 
-#: builtin/checkout.c:303 builtin/checkout.c:499 builtin/clone.c:586
-#: builtin/merge.c:812
+#: builtin/checkout.c:333 builtin/checkout.c:534 builtin/clone.c:586
+#: builtin/merge.c:811
 msgid "unable to write new index file"
 msgstr "无法写新的索引文件"
 
-#: builtin/checkout.c:320 builtin/diff.c:302 builtin/merge.c:408
-msgid "diff_setup_done failed"
-msgstr "diff_setup_done 失败"
-
-#: builtin/checkout.c:415
+#: builtin/checkout.c:448
 msgid "you need to resolve your current index first"
 msgstr "您需要先解决当前索引的冲突"
 
-#: builtin/checkout.c:534
+#: builtin/checkout.c:569
 #, c-format
 msgid "Can not do reflog for '%s'\n"
 msgstr "不能对 '%s' 执行 reflog 操作\n"
 
-#: builtin/checkout.c:567
+#: builtin/checkout.c:602
 msgid "HEAD is now at"
 msgstr "HEAD 目前位于"
 
-#: builtin/checkout.c:574
+#: builtin/checkout.c:609
 #, c-format
 msgid "Reset branch '%s'\n"
 msgstr "重置分支 '%s'\n"
 
-#: builtin/checkout.c:577
+#: builtin/checkout.c:612
 #, c-format
 msgid "Already on '%s'\n"
 msgstr "已经位于 '%s'\n"
 
-#: builtin/checkout.c:581
+#: builtin/checkout.c:616
 #, c-format
 msgid "Switched to and reset branch '%s'\n"
 msgstr "切换并重置分支 '%s'\n"
 
-#: builtin/checkout.c:583
+#: builtin/checkout.c:618
 #, c-format
 msgid "Switched to a new branch '%s'\n"
 msgstr "切换到一个新分支 '%s'\n"
 
-#: builtin/checkout.c:585
+#: builtin/checkout.c:620
 #, c-format
 msgid "Switched to branch '%s'\n"
 msgstr "切换到分支 '%s'\n"
 
 #  译者:注意保持前导空格
-#: builtin/checkout.c:641
+#: builtin/checkout.c:676
 #, c-format
 msgid " ... and %d more.\n"
 msgstr " ... 及其它 %d 个。\n"
 
 #. The singular version
-#: builtin/checkout.c:647
+#: builtin/checkout.c:682
 #, c-format
 msgid ""
 "Warning: you are leaving %d commit behind, not connected to\n"
@@ -2227,7 +2781,7 @@
 "\n"
 "%s\n"
 
-#: builtin/checkout.c:665
+#: builtin/checkout.c:700
 #, c-format
 msgid ""
 "If you want to keep them by creating a new branch, this may be a good time\n"
@@ -2242,101 +2796,197 @@
 " git branch new_branch_name %s\n"
 "\n"
 
-#: builtin/checkout.c:695
+#: builtin/checkout.c:730
 msgid "internal error in revision walk"
 msgstr "在版本遍历时遇到内部错误"
 
-#: builtin/checkout.c:699
+#: builtin/checkout.c:734
 msgid "Previous HEAD position was"
 msgstr "之前的 HEAD 位置是"
 
-#: builtin/checkout.c:725 builtin/checkout.c:920
+#: builtin/checkout.c:761 builtin/checkout.c:950
 msgid "You are on a branch yet to be born"
 msgstr "您位于一个尚未初始化的分支"
 
 #. case (1)
-#: builtin/checkout.c:856
+#: builtin/checkout.c:886
 #, c-format
 msgid "invalid reference: %s"
 msgstr "无效引用:%s"
 
 #. case (1): want a tree
-#: builtin/checkout.c:895
+#: builtin/checkout.c:925
 #, c-format
 msgid "reference is not a tree: %s"
 msgstr "引用不是一个树:%s"
 
-#: builtin/checkout.c:977
-msgid "-B cannot be used with -b"
-msgstr "-B 不能和 -b 同时使用"
+#: builtin/checkout.c:961
+#, fuzzy
+msgid "paths cannot be used with switching branches"
+msgstr "--ours/--theirs 和切换分支不兼容。"
 
-#: builtin/checkout.c:986
-msgid "--patch is incompatible with all other options"
-msgstr "--patch 选项和其他选项不兼容"
+#: builtin/checkout.c:964 builtin/checkout.c:968
+#, fuzzy, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "%s:%s 不能和 %s 同时使用"
 
-#: builtin/checkout.c:989
-msgid "--detach cannot be used with -b/-B/--orphan"
-msgstr "--detach 不能和 -b/-B/--orphan 同时使用"
+#: builtin/checkout.c:972 builtin/checkout.c:975 builtin/checkout.c:980
+#: builtin/checkout.c:983
+#, fuzzy, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "%s:%s 不能和 %s 同时使用"
 
-#: builtin/checkout.c:991
-msgid "--detach cannot be used with -t"
-msgstr "--detach 不能和 -t 同时使用"
+#: builtin/checkout.c:988
+#, fuzzy, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "无法切换分支到一个非提交。"
 
-#: builtin/checkout.c:997
+#: builtin/checkout.c:1009 builtin/gc.c:177
+msgid "suppress progress reporting"
+msgstr ""
+
+#: builtin/checkout.c:1010 builtin/checkout.c:1012 builtin/clone.c:89
+#: builtin/remote.c:169 builtin/remote.c:171
+#, fuzzy
+msgid "branch"
+msgstr "位于分支 "
+
+#: builtin/checkout.c:1011
+msgid "create and checkout a new branch"
+msgstr ""
+
+#: builtin/checkout.c:1013
+msgid "create/reset and checkout a branch"
+msgstr ""
+
+#: builtin/checkout.c:1014
+#, fuzzy
+msgid "create reflog for new branch"
+msgstr "列出、创建或删除分支"
+
+#: builtin/checkout.c:1015
+msgid "detach the HEAD at named commit"
+msgstr ""
+
+#: builtin/checkout.c:1016
+#, fuzzy
+msgid "set upstream info for new branch"
+msgstr "尚未给分支 '%s' 设置上游"
+
+#: builtin/checkout.c:1018
+#, fuzzy
+msgid "new branch"
+msgstr "[新分支]"
+
+#: builtin/checkout.c:1018
+#, fuzzy
+msgid "new unparented branch"
+msgstr "没有当前分支。"
+
+#: builtin/checkout.c:1019
+msgid "checkout our version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1021
+msgid "checkout their version for unmerged files"
+msgstr ""
+
+#: builtin/checkout.c:1023
+msgid "force checkout (throw away local modifications)"
+msgstr ""
+
+#: builtin/checkout.c:1024
+msgid "perform a 3-way merge with the new branch"
+msgstr ""
+
+#: builtin/checkout.c:1025 builtin/merge.c:215
+#, fuzzy
+msgid "update ignored files (default)"
+msgstr "更新文件失败"
+
+#: builtin/checkout.c:1026 builtin/log.c:1111 parse-options.h:241
+msgid "style"
+msgstr ""
+
+#: builtin/checkout.c:1027
+msgid "conflict style (merge or diff3)"
+msgstr ""
+
+#: builtin/checkout.c:1030
+msgid "second guess 'git checkout no-such-branch'"
+msgstr ""
+
+#: builtin/checkout.c:1054
+#, fuzzy
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-n 和 -k 互斥。"
+
+#: builtin/checkout.c:1071
 msgid "--track needs a branch name"
 msgstr "--track 需要一个分支名"
 
-#: builtin/checkout.c:1004
+#: builtin/checkout.c:1078
 msgid "Missing branch name; try -b"
 msgstr "缺少分支名;尝试 -b"
 
-#: builtin/checkout.c:1010
-msgid "--orphan and -b|-B are mutually exclusive"
-msgstr "--orphan 和 -b|-B 互斥"
-
-#: builtin/checkout.c:1012
-msgid "--orphan cannot be used with -t"
-msgstr "--orphan 不能和 -t 同时使用"
-
-#: builtin/checkout.c:1022
-msgid "git checkout: -f and -m are incompatible"
-msgstr "git checkout:-f 和 -m 不兼容"
-
-#: builtin/checkout.c:1056
+#: builtin/checkout.c:1113
 msgid "invalid path specification"
 msgstr "无效的路径规格"
 
-#: builtin/checkout.c:1064
-#, c-format
+#: builtin/checkout.c:1120
+#, fuzzy, c-format
 msgid ""
-"git checkout: updating paths is incompatible with switching branches.\n"
+"Cannot update paths and switch to branch '%s' at the same time.\n"
 "Did you intend to checkout '%s' which can not be resolved as commit?"
 msgstr ""
 "git checkout:更新路径和切换分支不兼容。\n"
 "您是想要检出 '%s' 但未能将其解析为提交么?"
 
-#: builtin/checkout.c:1066
-msgid "git checkout: updating paths is incompatible with switching branches."
-msgstr "git checkout:更新路径和切换分支不兼容。"
-
-#: builtin/checkout.c:1071
-msgid "git checkout: --detach does not take a path argument"
+#: builtin/checkout.c:1125
+#, fuzzy, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
 msgstr "git checkout:--detach 不跟路径参数"
 
-#: builtin/checkout.c:1074
+#: builtin/checkout.c:1129
 msgid ""
 "git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
 "checking out of the index."
 msgstr ""
 "git checkout:在从索引检出时,--ours/--theirs、--force 和 --merge 不兼容。"
 
-#: builtin/checkout.c:1093
-msgid "Cannot switch branch to a non-commit."
-msgstr "无法切换分支到一个非提交。"
+#: builtin/clean.c:19
+msgid "git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
 
-#: builtin/checkout.c:1096
-msgid "--ours/--theirs is incompatible with switching branches."
-msgstr "--ours/--theirs 和切换分支不兼容。"
+#: builtin/clean.c:51
+msgid "do not print names of files removed"
+msgstr ""
+
+#: builtin/clean.c:53
+msgid "force"
+msgstr ""
+
+#: builtin/clean.c:55
+#, fuzzy
+msgid "remove whole directories"
+msgstr "两个输出目录?"
+
+#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802
+#: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199
+msgid "pattern"
+msgstr ""
+
+#: builtin/clean.c:57
+msgid "add <pattern> to ignore rules"
+msgstr ""
+
+#: builtin/clean.c:58
+msgid "remove ignored files, too"
+msgstr ""
+
+#: builtin/clean.c:60
+msgid "remove only ignored files"
+msgstr ""
 
 #: builtin/clean.c:78
 msgid "-x and -X cannot be used together"
@@ -2380,6 +3030,104 @@
 msgid "Not removing %s\n"
 msgstr "未删除 %s\n"
 
+#: builtin/clone.c:36
+msgid "git clone [options] [--] <repo> [<dir>]"
+msgstr ""
+
+#: builtin/clone.c:64 builtin/fetch.c:82 builtin/merge.c:212
+#: builtin/push.c:399
+msgid "force progress reporting"
+msgstr ""
+
+#: builtin/clone.c:66
+msgid "don't create a checkout"
+msgstr ""
+
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#, fuzzy
+msgid "create a bare repository"
+msgstr "不是一个 git 版本库"
+
+#: builtin/clone.c:72
+msgid "create a mirror repository (implies bare)"
+msgstr ""
+
+#: builtin/clone.c:74
+msgid "to clone from a local repository"
+msgstr ""
+
+#: builtin/clone.c:76
+msgid "don't use local hardlinks, always copy"
+msgstr ""
+
+#: builtin/clone.c:78
+#, fuzzy
+msgid "setup as shared repository"
+msgstr "不是一个 git 版本库"
+
+#: builtin/clone.c:80 builtin/clone.c:82
+msgid "initialize submodules in the clone"
+msgstr ""
+
+#: builtin/clone.c:83 builtin/init-db.c:485
+#, fuzzy
+msgid "template-directory"
+msgstr "文件/目录"
+
+#: builtin/clone.c:84 builtin/init-db.c:486
+msgid "directory from which templates will be used"
+msgstr ""
+
+#: builtin/clone.c:86
+msgid "reference repository"
+msgstr ""
+
+#: builtin/clone.c:87 builtin/column.c:26 builtin/merge-file.c:44
+#, fuzzy
+msgid "name"
+msgstr "重命名"
+
+#: builtin/clone.c:88
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr ""
+
+#: builtin/clone.c:90
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr ""
+
+#: builtin/clone.c:92
+msgid "path to git-upload-pack on the remote"
+msgstr ""
+
+#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747
+msgid "depth"
+msgstr ""
+
+#: builtin/clone.c:94
+msgid "create a shallow clone of that depth"
+msgstr ""
+
+#: builtin/clone.c:96
+msgid "clone only one branch, HEAD or --branch"
+msgstr ""
+
+#: builtin/clone.c:97 builtin/init-db.c:494
+msgid "gitdir"
+msgstr ""
+
+#: builtin/clone.c:98 builtin/init-db.c:495
+msgid "separate git dir from working tree"
+msgstr ""
+
+#: builtin/clone.c:99
+msgid "key=value"
+msgstr ""
+
+#: builtin/clone.c:100
+#, fuzzy
+msgid "set config inside the new repository"
+msgstr "记录变更到版本库"
+
 #: builtin/clone.c:243
 #, c-format
 msgid "reference repository '%s' is not a local directory."
@@ -2390,7 +3138,7 @@
 msgid "failed to create directory '%s'"
 msgstr "无法创建目录 '%s'"
 
-#: builtin/clone.c:308 builtin/diff.c:75
+#: builtin/clone.c:308 builtin/diff.c:77
 #, c-format
 msgid "failed to stat '%s'"
 msgstr "无法枚举 '%s' 状态"
@@ -2405,11 +3153,6 @@
 msgid "failed to stat %s\n"
 msgstr "无法枚举 %s 状态\n"
 
-#: builtin/clone.c:341
-#, c-format
-msgid "failed to unlink '%s'"
-msgstr "无法删除 '%s'"
-
 #: builtin/clone.c:346
 #, c-format
 msgid "failed to create link '%s'"
@@ -2500,10 +3243,49 @@
 msgid "You appear to have cloned an empty repository."
 msgstr "您似乎克隆了一个空版本库。"
 
+#: builtin/column.c:9
+msgid "git column [options]"
+msgstr ""
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr ""
+
+#: builtin/column.c:27 builtin/column.c:28
+#, fuzzy
+msgid "layout to use"
+msgstr "本地已过时"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr ""
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr ""
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr ""
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr ""
+
 #: builtin/column.c:51
 msgid "--command must be the first argument"
 msgstr "--command 必须是第一个参数"
 
+#: builtin/commit.c:33
+#, fuzzy
+msgid "git commit [options] [--] <filepattern>..."
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/commit.c:38
+#, fuzzy
+msgid "git status [options] [--] <filepattern>..."
+msgstr "git apply [选项] [<补丁>...]"
+
 #: builtin/commit.c:43
 msgid ""
 "Your name and email address were configured automatically based\n"
@@ -2584,61 +3366,61 @@
 msgid "unable to write temporary index file"
 msgstr "无法写临时索引文件"
 
-#: builtin/commit.c:496 builtin/commit.c:502
+#: builtin/commit.c:510 builtin/commit.c:516
 #, c-format
 msgid "invalid commit: %s"
 msgstr "无效的提交:%s"
 
-#: builtin/commit.c:525
+#: builtin/commit.c:539
 msgid "malformed --author parameter"
 msgstr "非法的 --author 参数"
 
-#: builtin/commit.c:585
+#: builtin/commit.c:600
 #, c-format
 msgid "Malformed ident string: '%s'"
 msgstr "非法的身份字符串:'%s'"
 
-#: builtin/commit.c:623 builtin/commit.c:656 builtin/commit.c:970
+#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985
 #, c-format
 msgid "could not lookup commit %s"
 msgstr "不能查询提交 %s"
 
-#: builtin/commit.c:635 builtin/shortlog.c:296
+#: builtin/commit.c:650 builtin/shortlog.c:296
 #, c-format
 msgid "(reading log message from standard input)\n"
 msgstr "(正从标准输入中读取日志信息)\n"
 
-#: builtin/commit.c:637
+#: builtin/commit.c:652
 msgid "could not read log from standard input"
 msgstr "不能从标准输入中读取日志信息"
 
-#: builtin/commit.c:641
+#: builtin/commit.c:656
 #, c-format
 msgid "could not read log file '%s'"
 msgstr "不能读取日志文件 '%s'"
 
-#: builtin/commit.c:647
+#: builtin/commit.c:662
 msgid "commit has empty message"
 msgstr "提交说明为空"
 
-#: builtin/commit.c:663
+#: builtin/commit.c:678
 msgid "could not read MERGE_MSG"
 msgstr "不能读取 MERGE_MSG"
 
-#: builtin/commit.c:667
+#: builtin/commit.c:682
 msgid "could not read SQUASH_MSG"
 msgstr "不能读取 SQUASH_MSG"
 
-#: builtin/commit.c:671
+#: builtin/commit.c:686
 #, c-format
 msgid "could not read '%s'"
 msgstr "不能读取 '%s'"
 
-#: builtin/commit.c:723
+#: builtin/commit.c:738
 msgid "could not write commit template"
 msgstr "不能写提交模版"
 
-#: builtin/commit.c:734
+#: builtin/commit.c:749
 #, c-format
 msgid ""
 "\n"
@@ -2652,7 +3434,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:739
+#: builtin/commit.c:754
 #, c-format
 msgid ""
 "\n"
@@ -2666,7 +3448,7 @@
 "\t%s\n"
 "然后重试。\n"
 
-#: builtin/commit.c:751
+#: builtin/commit.c:766
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be ignored, and an empty message aborts the commit.\n"
@@ -2674,7 +3456,7 @@
 "请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交\n"
 "说明将会终止提交。\n"
 
-#: builtin/commit.c:756
+#: builtin/commit.c:771
 msgid ""
 "Please enter the commit message for your changes. Lines starting\n"
 "with '#' will be kept; you may remove them yourself if you want to.\n"
@@ -2684,160 +3466,357 @@
 "如果您想这样做的话。而一个空的提交说明将会终止提交。\n"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:769
+#: builtin/commit.c:784
 #, c-format
 msgid "%sAuthor:    %s"
 msgstr "%s作者:     %s"
 
 #  译者:为保证在输出中对齐,注意调整句中空格!
-#: builtin/commit.c:776
+#: builtin/commit.c:791
 #, c-format
 msgid "%sCommitter: %s"
 msgstr "%s提交者:   %s"
 
-#: builtin/commit.c:796
+#: builtin/commit.c:811
 msgid "Cannot read index"
 msgstr "无法读取索引"
 
-#: builtin/commit.c:833
+#: builtin/commit.c:848
 msgid "Error building trees"
 msgstr "无法创建树对象"
 
-#: builtin/commit.c:848 builtin/tag.c:361
+#: builtin/commit.c:863 builtin/tag.c:361
 #, c-format
 msgid "Please supply the message using either -m or -F option.\n"
 msgstr "请使用 -m 或者 -F 选项提供提交说明。\n"
 
-#: builtin/commit.c:945
+#: builtin/commit.c:960
 #, c-format
 msgid "No existing author found with '%s'"
 msgstr "没有找到匹配 '%s' 的作者"
 
-#: builtin/commit.c:960 builtin/commit.c:1160
+#: builtin/commit.c:975 builtin/commit.c:1175
 #, c-format
 msgid "Invalid untracked files mode '%s'"
 msgstr "无效的未追踪文件参数 '%s'"
 
-#: builtin/commit.c:1000
+#: builtin/commit.c:1015
 msgid "Using both --reset-author and --author does not make sense"
 msgstr "同时使用 --reset-author 和 --author 没有意义"
 
-#: builtin/commit.c:1011
+#: builtin/commit.c:1026
 msgid "You have nothing to amend."
 msgstr "您没有可修补的提交。"
 
-#: builtin/commit.c:1014
+#: builtin/commit.c:1029
 msgid "You are in the middle of a merge -- cannot amend."
 msgstr "您正处于一个合并过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1016
+#: builtin/commit.c:1031
 msgid "You are in the middle of a cherry-pick -- cannot amend."
 msgstr "您正处于一个拣选过程中 -- 无法修补提交。"
 
-#: builtin/commit.c:1019
+#: builtin/commit.c:1034
 msgid "Options --squash and --fixup cannot be used together"
 msgstr "选项 --squash 和 --fixup 不能同时使用"
 
-#: builtin/commit.c:1029
+#: builtin/commit.c:1044
 msgid "Only one of -c/-C/-F/--fixup can be used."
 msgstr "只能用一个 -c/-C/-F/--fixup 选项。"
 
-#: builtin/commit.c:1031
+#: builtin/commit.c:1046
 msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
 msgstr "选项 -m 不能和 -c/-C/-F/--fixup 同时使用。"
 
-#: builtin/commit.c:1039
+#: builtin/commit.c:1054
 msgid "--reset-author can be used only with -C, -c or --amend."
 msgstr "--reset-author 只能和 -C、-c 或 --amend 同时使用。"
 
-#: builtin/commit.c:1056
+#: builtin/commit.c:1071
 msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
 msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。"
 
-#: builtin/commit.c:1058
+#: builtin/commit.c:1073
 msgid "No paths with --include/--only does not make sense."
 msgstr "参数 --include/--only 不跟路径没有意义。"
 
-#: builtin/commit.c:1060
+#: builtin/commit.c:1075
 msgid "Clever... amending the last one with dirty index."
 msgstr "聪明... 在索引不干净下修补最后的提交。"
 
-#: builtin/commit.c:1062
+#: builtin/commit.c:1077
 msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
 msgstr "指定了明确的路径而没有使用 -i 或 -o 选项;认为是 --only paths..."
 
-#: builtin/commit.c:1072 builtin/tag.c:577
+#: builtin/commit.c:1087 builtin/tag.c:577
 #, c-format
 msgid "Invalid cleanup mode %s"
 msgstr "无效的清理模式 %s"
 
-#: builtin/commit.c:1077
+#: builtin/commit.c:1092
 msgid "Paths with -a does not make sense."
 msgstr "路径和 -a 选项同时使用没有意义。"
 
-#: builtin/commit.c:1260
+#: builtin/commit.c:1189 builtin/commit.c:1417
+msgid "show status concisely"
+msgstr ""
+
+#: builtin/commit.c:1191 builtin/commit.c:1419
+msgid "show branch information"
+msgstr ""
+
+#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389
+msgid "machine-readable output"
+msgstr ""
+
+#: builtin/commit.c:1196 builtin/commit.c:1423
+msgid "terminate entries with NUL"
+msgstr ""
+
+#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636
+#: builtin/fast-export.c:639 builtin/tag.c:461
+msgid "mode"
+msgstr ""
+
+#: builtin/commit.c:1199 builtin/commit.c:1426
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1202
+msgid "show ignored files"
+msgstr ""
+
+#: builtin/commit.c:1203 parse-options.h:151
+msgid "when"
+msgstr "何时"
+
+#: builtin/commit.c:1204
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr ""
+
+#: builtin/commit.c:1206
+#, fuzzy
+msgid "list untracked files in columns"
+msgstr "无效的未追踪文件参数 '%s'"
+
+#: builtin/commit.c:1275
 msgid "couldn't look up newly created commit"
 msgstr "无法找到新创建的提交"
 
-#: builtin/commit.c:1262
+#: builtin/commit.c:1277
 msgid "could not parse newly created commit"
 msgstr "不能解析新创建的提交"
 
-#: builtin/commit.c:1303
+#: builtin/commit.c:1318
 msgid "detached HEAD"
 msgstr "分离头指针"
 
 #  译者:中文字符串拼接,可删除前导空格
-#: builtin/commit.c:1305
+#: builtin/commit.c:1320
 msgid " (root-commit)"
 msgstr "(根提交)"
 
-#: builtin/commit.c:1449
+#: builtin/commit.c:1387
+msgid "suppress summary after successful commit"
+msgstr ""
+
+#: builtin/commit.c:1388
+msgid "show diff in commit message template"
+msgstr ""
+
+#: builtin/commit.c:1390
+#, fuzzy
+msgid "Commit message options"
+msgstr "不能得到 %s 的提交说明"
+
+#: builtin/commit.c:1391 builtin/tag.c:459
+msgid "read message from file"
+msgstr ""
+
+#: builtin/commit.c:1392
+msgid "author"
+msgstr ""
+
+#: builtin/commit.c:1392
+#, fuzzy
+msgid "override author for commit"
+msgstr "合并未返回提交"
+
+#: builtin/commit.c:1393 builtin/gc.c:178
+msgid "date"
+msgstr ""
+
+#: builtin/commit.c:1393
+#, fuzzy
+msgid "override date for commit"
+msgstr "合并未返回提交"
+
+#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534
+#: builtin/notes.c:691 builtin/tag.c:457
+#, fuzzy
+msgid "message"
+msgstr "无 tag 说明?"
+
+#: builtin/commit.c:1394
+#, fuzzy
+msgid "commit message"
+msgstr "空提交信息。"
+
+#: builtin/commit.c:1395
+msgid "reuse and edit message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1396
+msgid "reuse message from specified commit"
+msgstr ""
+
+#: builtin/commit.c:1397
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr ""
+
+#: builtin/commit.c:1398
+msgid "use autosquash formatted message to squash specified commit"
+msgstr ""
+
+#: builtin/commit.c:1399
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr ""
+
+#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109
+msgid "add Signed-off-by:"
+msgstr ""
+
+#: builtin/commit.c:1401
+msgid "use specified template file"
+msgstr ""
+
+#: builtin/commit.c:1402
+#, fuzzy
+msgid "force edit of commit"
+msgstr "合并未返回提交"
+
+#: builtin/commit.c:1403
+msgid "default"
+msgstr ""
+
+#: builtin/commit.c:1403 builtin/tag.c:462
+msgid "how to strip spaces and #comments from message"
+msgstr ""
+
+#: builtin/commit.c:1404
+#, fuzzy
+msgid "include status in commit message template"
+msgstr "不能写提交模版"
+
+#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463
+msgid "key id"
+msgstr ""
+
+#: builtin/commit.c:1406 builtin/merge.c:214
+msgid "GPG sign commit"
+msgstr ""
+
+#. end commit message options
+#: builtin/commit.c:1409
+msgid "Commit contents options"
+msgstr ""
+
+#: builtin/commit.c:1410
+msgid "commit all changed files"
+msgstr ""
+
+#: builtin/commit.c:1411
+msgid "add specified files to index for commit"
+msgstr ""
+
+#: builtin/commit.c:1412
+#, fuzzy
+msgid "interactively add files"
+msgstr "交互式添加失败"
+
+#: builtin/commit.c:1413
+#, fuzzy
+msgid "interactively add changes"
+msgstr "交互式添加失败"
+
+#: builtin/commit.c:1414
+#, fuzzy
+msgid "commit only specified files"
+msgstr "无法还原修改的文件"
+
+#: builtin/commit.c:1415
+msgid "bypass pre-commit hook"
+msgstr ""
+
+#: builtin/commit.c:1416
+#, fuzzy
+msgid "show what would be committed"
+msgstr "要提交的变更:"
+
+#: builtin/commit.c:1424
+msgid "amend previous commit"
+msgstr ""
+
+#: builtin/commit.c:1425
+msgid "bypass post-rewrite hook"
+msgstr ""
+
+#: builtin/commit.c:1430
+msgid "ok to record an empty change"
+msgstr ""
+
+#: builtin/commit.c:1433
+msgid "ok to record a change with an empty message"
+msgstr ""
+
+#: builtin/commit.c:1464
 msgid "could not parse HEAD commit"
 msgstr "不能解析 HEAD 提交"
 
-#: builtin/commit.c:1487 builtin/merge.c:509
+#: builtin/commit.c:1502 builtin/merge.c:508
 #, c-format
 msgid "could not open '%s' for reading"
 msgstr "不能为读入打开 '%s'"
 
-#: builtin/commit.c:1494
+#: builtin/commit.c:1509
 #, c-format
 msgid "Corrupt MERGE_HEAD file (%s)"
 msgstr "损坏的 MERGE_HEAD 文件(%s)"
 
-#: builtin/commit.c:1501
+#: builtin/commit.c:1516
 msgid "could not read MERGE_MODE"
 msgstr "不能读取 MERGE_MODE"
 
-#: builtin/commit.c:1520
+#: builtin/commit.c:1535
 #, c-format
 msgid "could not read commit message: %s"
 msgstr "不能读取提交说明:%s"
 
-#: builtin/commit.c:1534
+#: builtin/commit.c:1549
 #, c-format
 msgid "Aborting commit; you did not edit the message.\n"
 msgstr "终止提交;您未更改来自模版的提交说明。\n"
 
-#: builtin/commit.c:1539
+#: builtin/commit.c:1554
 #, c-format
 msgid "Aborting commit due to empty commit message.\n"
 msgstr "终止提交因为提交说明为空。\n"
 
-#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961
+#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960
 msgid "failed to write commit object"
 msgstr "无法写提交对象"
 
-#: builtin/commit.c:1575
+#: builtin/commit.c:1590
 msgid "cannot lock HEAD ref"
 msgstr "无法锁定 HEAD 引用"
 
-#: builtin/commit.c:1579
+#: builtin/commit.c:1594
 msgid "cannot update HEAD ref"
 msgstr "无法更新 HEAD 引用"
 
-#: builtin/commit.c:1590
+#: builtin/commit.c:1605
 msgid ""
 "Repository has been updated, but unable to write\n"
 "new_index file. Check that disk is not full or quota is\n"
@@ -2846,6 +3825,138 @@
 "版本库已更新,但无法写 new_index 文件。检查是否磁盘已满\n"
 "或磁盘配额已耗尽,然后执行 \"git reset HEAD\" 恢复。"
 
+#: builtin/config.c:7
+msgid "git config [options]"
+msgstr ""
+
+#: builtin/config.c:52
+msgid "Config file location"
+msgstr ""
+
+#: builtin/config.c:53
+#, fuzzy
+msgid "use global config file"
+msgstr "无法更新 config 文件"
+
+#: builtin/config.c:54
+msgid "use system config file"
+msgstr ""
+
+#: builtin/config.c:55
+#, fuzzy
+msgid "use repository config file"
+msgstr "需要一个版本库来解包。"
+
+#: builtin/config.c:56
+#, fuzzy
+msgid "use given config file"
+msgstr "未预期的文件结束"
+
+#: builtin/config.c:57
+#, fuzzy
+msgid "Action"
+msgstr "动作"
+
+#: builtin/config.c:58
+msgid "get value: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:59
+msgid "get all values: key [value-regex]"
+msgstr ""
+
+#: builtin/config.c:60
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr ""
+
+#: builtin/config.c:61
+msgid "replace all matching variables: name value [value_regex]"
+msgstr ""
+
+#: builtin/config.c:62
+msgid "add a new variable: name value"
+msgstr ""
+
+#: builtin/config.c:63
+msgid "remove a variable: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:64
+msgid "remove all matches: name [value-regex]"
+msgstr ""
+
+#: builtin/config.c:65
+msgid "rename section: old-name new-name"
+msgstr ""
+
+#: builtin/config.c:66
+msgid "remove a section: name"
+msgstr ""
+
+#: builtin/config.c:67
+msgid "list all"
+msgstr ""
+
+#: builtin/config.c:68
+msgid "open an editor"
+msgstr ""
+
+#: builtin/config.c:69 builtin/config.c:70
+msgid "slot"
+msgstr ""
+
+#: builtin/config.c:69
+msgid "find the color configured: [default]"
+msgstr ""
+
+#: builtin/config.c:70
+msgid "find the color setting: [stdout-is-tty]"
+msgstr ""
+
+#: builtin/config.c:71
+msgid "Type"
+msgstr ""
+
+#: builtin/config.c:72
+msgid "value is \"true\" or \"false\""
+msgstr ""
+
+#: builtin/config.c:73
+msgid "value is decimal number"
+msgstr ""
+
+#: builtin/config.c:74
+msgid "value is --bool or --int"
+msgstr ""
+
+#: builtin/config.c:75
+msgid "value is a path (file or directory name)"
+msgstr ""
+
+#: builtin/config.c:76
+msgid "Other"
+msgstr ""
+
+#: builtin/config.c:77
+msgid "terminate values with NUL byte"
+msgstr ""
+
+#: builtin/config.c:78
+msgid "respect include directives on lookup"
+msgstr ""
+
+#: builtin/count-objects.c:69
+msgid "git count-objects [-v]"
+msgstr ""
+
+#: builtin/describe.c:15
+msgid "git describe [options] <committish>*"
+msgstr ""
+
+#: builtin/describe.c:16
+msgid "git describe [options] --dirty"
+msgstr ""
+
 #: builtin/describe.c:234
 #, c-format
 msgid "annotated tag %s not available"
@@ -2918,6 +4029,52 @@
 "发现多于 %i 个 tag,列出最近的 %i 个\n"
 "在 %s 放弃搜索\n"
 
+#: builtin/describe.c:403
+msgid "find the tag that comes after the commit"
+msgstr ""
+
+#: builtin/describe.c:404
+msgid "debug search strategy on stderr"
+msgstr ""
+
+#: builtin/describe.c:405
+msgid "use any ref in .git/refs"
+msgstr ""
+
+#: builtin/describe.c:406
+msgid "use any tag in .git/refs/tags"
+msgstr ""
+
+#: builtin/describe.c:407
+msgid "always use long format"
+msgstr ""
+
+#: builtin/describe.c:410
+#, fuzzy
+msgid "only output exact matches"
+msgstr "没有 tag 准确匹配 '%s'"
+
+#: builtin/describe.c:412
+msgid "consider <n> most recent tags (default: 10)"
+msgstr ""
+
+#: builtin/describe.c:414
+#, fuzzy
+msgid "only consider tags matching <pattern>"
+msgstr "输出和模式匹配的行"
+
+#: builtin/describe.c:416 builtin/name-rev.c:238
+msgid "show abbreviated commit object as fallback"
+msgstr ""
+
+#: builtin/describe.c:417
+msgid "mark"
+msgstr ""
+
+#: builtin/describe.c:418
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr ""
+
 #: builtin/describe.c:436
 msgid "--long is incompatible with --abbrev=0"
 msgstr "--long 与 --abbrev=0 不兼容"
@@ -2930,111 +4087,237 @@
 msgid "--dirty is incompatible with committishes"
 msgstr "--dirty 不能与提交同时使用"
 
-#: builtin/diff.c:77
+#: builtin/diff.c:79
 #, c-format
 msgid "'%s': not a regular file or symlink"
 msgstr "'%s':不是一个正规文件或符号链接"
 
-#: builtin/diff.c:220
+#: builtin/diff.c:224
 #, c-format
 msgid "invalid option: %s"
 msgstr "无效选项:%s"
 
-#: builtin/diff.c:297
+#: builtin/diff.c:301
 msgid "Not a git repository"
 msgstr "不是一个 git 版本库"
 
-#: builtin/diff.c:341
+#: builtin/diff.c:344
 #, c-format
 msgid "invalid object '%s' given."
 msgstr "提供了无效对象 '%s'。"
 
-#: builtin/diff.c:346
+#: builtin/diff.c:349
 #, c-format
 msgid "more than %d trees given: '%s'"
 msgstr "提供了超过 %d 个树对象:'%s'"
 
-#: builtin/diff.c:356
+#: builtin/diff.c:359
 #, c-format
 msgid "more than two blobs given: '%s'"
 msgstr "提供了超过两个二进制对象(blob):'%s'"
 
-#: builtin/diff.c:364
+#: builtin/diff.c:367
 #, c-format
 msgid "unhandled object '%s' given."
 msgstr "提供了无法处理的对象 '%s'。"
 
-#: builtin/fetch.c:200
+#: builtin/fast-export.c:22
+msgid "git fast-export [rev-list-opts]"
+msgstr ""
+
+#: builtin/fast-export.c:635
+#, fuzzy
+msgid "show progress after <n> objects"
+msgstr "显示各种类型的对象"
+
+#: builtin/fast-export.c:637
+msgid "select handling of signed tags"
+msgstr ""
+
+#: builtin/fast-export.c:640
+msgid "select handling of tags that tag filtered objects"
+msgstr ""
+
+#: builtin/fast-export.c:643
+msgid "Dump marks to this file"
+msgstr ""
+
+#: builtin/fast-export.c:645
+msgid "Import marks from this file"
+msgstr ""
+
+#: builtin/fast-export.c:647
+msgid "Fake a tagger when tags lack one"
+msgstr ""
+
+#: builtin/fast-export.c:649
+msgid "Output full tree for each commit"
+msgstr ""
+
+#: builtin/fast-export.c:651
+msgid "Use the done feature to terminate the stream"
+msgstr ""
+
+#: builtin/fast-export.c:652
+msgid "Skip output of blob data"
+msgstr ""
+
+#: builtin/fetch.c:20
+#, fuzzy
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr ""
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr ""
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr ""
+
+#: builtin/fetch.c:60
+msgid "fetch from all remotes"
+msgstr ""
+
+#: builtin/fetch.c:62
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr ""
+
+#: builtin/fetch.c:64
+msgid "path to upload pack on remote end"
+msgstr ""
+
+#: builtin/fetch.c:65
+msgid "force overwrite of local branch"
+msgstr ""
+
+#: builtin/fetch.c:67
+msgid "fetch from multiple remotes"
+msgstr ""
+
+#: builtin/fetch.c:69
+#, fuzzy
+msgid "fetch all tags and associated objects"
+msgstr "更新远程引用和相关的对象"
+
+#: builtin/fetch.c:71
+msgid "do not fetch all tags (--no-tags)"
+msgstr ""
+
+#: builtin/fetch.c:73
+#, fuzzy
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "%s 没有来自 %s 的远程跟踪分支"
+
+#: builtin/fetch.c:74
+msgid "on-demand"
+msgstr ""
+
+#: builtin/fetch.c:75
+msgid "control recursive fetching of submodules"
+msgstr ""
+
+#: builtin/fetch.c:79
+msgid "keep downloaded pack"
+msgstr ""
+
+#: builtin/fetch.c:81
+#, fuzzy
+msgid "allow updating of HEAD ref"
+msgstr "无法更新 HEAD 引用"
+
+#: builtin/fetch.c:84
+msgid "deepen history of shallow clone"
+msgstr ""
+
+#: builtin/fetch.c:85 builtin/log.c:1083
+msgid "dir"
+msgstr ""
+
+#: builtin/fetch.c:86
+#, fuzzy
+msgid "prepend this to submodule path output"
+msgstr "无法递归进子模组路径 '$sm_path'"
+
+#: builtin/fetch.c:89
+msgid "default mode for recursion"
+msgstr ""
+
+#: builtin/fetch.c:201
 msgid "Couldn't find remote ref HEAD"
 msgstr "无法发现远程 HEAD 引用"
 
-#: builtin/fetch.c:253
+#: builtin/fetch.c:254
 #, c-format
 msgid "object %s not found"
 msgstr "对象 %s 未发现"
 
-#: builtin/fetch.c:259
+#: builtin/fetch.c:260
 msgid "[up to date]"
 msgstr "[最新]"
 
-#: builtin/fetch.c:273
+#: builtin/fetch.c:274
 #, c-format
 msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
 msgstr "! %-*s %-*s -> %s  (在当前分支下不能获取)"
 
-#: builtin/fetch.c:274 builtin/fetch.c:360
+#: builtin/fetch.c:275 builtin/fetch.c:361
 msgid "[rejected]"
 msgstr "[已拒绝]"
 
-#: builtin/fetch.c:285
+#: builtin/fetch.c:286
 msgid "[tag update]"
 msgstr "[tag更新]"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340
+#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341
 msgid "  (unable to update local ref)"
 msgstr "  (不能更新本地引用)"
 
-#: builtin/fetch.c:305
+#: builtin/fetch.c:306
 msgid "[new tag]"
 msgstr "[新tag]"
 
-#: builtin/fetch.c:308
+#: builtin/fetch.c:309
 msgid "[new branch]"
 msgstr "[新分支]"
 
-#: builtin/fetch.c:311
+#: builtin/fetch.c:312
 msgid "[new ref]"
 msgstr "[新引用]"
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "unable to update local ref"
 msgstr "不能更新本地引用"
 
-#: builtin/fetch.c:356
+#: builtin/fetch.c:357
 msgid "forced update"
 msgstr "强制更新"
 
-#: builtin/fetch.c:362
+#: builtin/fetch.c:363
 msgid "(non-fast-forward)"
 msgstr "(非快进式)"
 
-#: builtin/fetch.c:393 builtin/fetch.c:685
+#: builtin/fetch.c:394 builtin/fetch.c:686
 #, c-format
 msgid "cannot open %s: %s\n"
 msgstr "无法打开 %s:%s\n"
 
-#: builtin/fetch.c:402
+#: builtin/fetch.c:403
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s 未发送所有必须的对象\n"
 
-#: builtin/fetch.c:488
+#: builtin/fetch.c:489
 #, c-format
 msgid "From %.*s\n"
 msgstr "来自 %.*s\n"
 
-#: builtin/fetch.c:499
+#: builtin/fetch.c:500
 #, c-format
 msgid ""
 "some local refs could not be updated; try running\n"
@@ -3044,82 +4327,204 @@
 " 'git remote prune %s' 来删除旧的、有冲突的分支"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:549
+#: builtin/fetch.c:550
 #, c-format
 msgid "   (%s will become dangling)"
 msgstr "   (%s 将成为悬空状态)"
 
 #  译者:注意保持前导空格
-#: builtin/fetch.c:550
+#: builtin/fetch.c:551
 #, c-format
 msgid "   (%s has become dangling)"
 msgstr "   (%s 已成为悬空状态)"
 
-#: builtin/fetch.c:557
+#: builtin/fetch.c:558
 msgid "[deleted]"
 msgstr "[已删除]"
 
-#: builtin/fetch.c:558 builtin/remote.c:1055
+#: builtin/fetch.c:559 builtin/remote.c:1055
 msgid "(none)"
 msgstr "(无)"
 
-#: builtin/fetch.c:675
+#: builtin/fetch.c:676
 #, c-format
 msgid "Refusing to fetch into current branch %s of non-bare repository"
 msgstr "拒绝获取到非裸版本库的当前分支 %s"
 
-#: builtin/fetch.c:709
+#: builtin/fetch.c:710
 #, c-format
 msgid "Don't know how to fetch from %s"
 msgstr "不知道如何从 %s 获取"
 
-#: builtin/fetch.c:786
+#: builtin/fetch.c:787
 #, c-format
 msgid "Option \"%s\" value \"%s\" is not valid for %s"
 msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s 是无效的"
 
-#: builtin/fetch.c:789
+#: builtin/fetch.c:790
 #, c-format
 msgid "Option \"%s\" is ignored for %s\n"
 msgstr "选项 \"%s\" 为 %s 所忽略\n"
 
-#: builtin/fetch.c:888
+#: builtin/fetch.c:892
 #, c-format
 msgid "Fetching %s\n"
 msgstr "正在获取 %s\n"
 
-#: builtin/fetch.c:890 builtin/remote.c:100
+#: builtin/fetch.c:894 builtin/remote.c:100
 #, c-format
 msgid "Could not fetch %s"
 msgstr "不能获取 %s"
 
-#: builtin/fetch.c:907
+#: builtin/fetch.c:913
 msgid ""
 "No remote repository specified.  Please, specify either a URL or a\n"
 "remote name from which new revisions should be fetched."
 msgstr "未指定远程版本库。请通过一个URL或远程版本库名指定,用以获取新提交。"
 
-#: builtin/fetch.c:927
+#: builtin/fetch.c:933
 msgid "You need to specify a tag name."
 msgstr "您需要指定一个 tag 名称。"
 
-#: builtin/fetch.c:979
+#: builtin/fetch.c:985
 msgid "fetch --all does not take a repository argument"
 msgstr "fetch --all 不能带一个版本库参数"
 
-#: builtin/fetch.c:981
+#: builtin/fetch.c:987
 msgid "fetch --all does not make sense with refspecs"
 msgstr "fetch --all 带引用表达式没有任何意义"
 
-#: builtin/fetch.c:992
+#: builtin/fetch.c:998
 #, c-format
 msgid "No such remote or remote group: %s"
 msgstr "没有这样的远程或远程组:%s"
 
-#: builtin/fetch.c:1000
+#: builtin/fetch.c:1006
 msgid "Fetching a group and specifying refspecs does not make sense"
 msgstr "获取组并指定引用表达式没有意义"
 
+#: builtin/fmt-merge-msg.c:13
+msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786
+#: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192
+#: builtin/tag.c:448 parse-options.h:133 parse-options.h:235
+msgid "n"
+msgstr "数字"
+
+#: builtin/fmt-merge-msg.c:654
+msgid "populate log with at most <n> entries from shortlog"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:657
+msgid "alias for --log (deprecated)"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:660
+msgid "text"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:661
+msgid "use <text> as start of message"
+msgstr ""
+
+#: builtin/fmt-merge-msg.c:662
+#, fuzzy
+msgid "file to read from"
+msgstr "不能读 %s"
+
+#: builtin/for-each-ref.c:979
+#, fuzzy
+msgid "git for-each-ref [options] [<pattern>]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/for-each-ref.c:994
+msgid "quote placeholders suitably for shells"
+msgstr ""
+
+#: builtin/for-each-ref.c:996
+msgid "quote placeholders suitably for perl"
+msgstr ""
+
+#: builtin/for-each-ref.c:998
+msgid "quote placeholders suitably for python"
+msgstr ""
+
+#: builtin/for-each-ref.c:1000
+msgid "quote placeholders suitably for tcl"
+msgstr ""
+
+#: builtin/for-each-ref.c:1003
+msgid "show only <n> matched refs"
+msgstr ""
+
+#: builtin/for-each-ref.c:1004
+msgid "format"
+msgstr ""
+
+#: builtin/for-each-ref.c:1004
+msgid "format to use for the output"
+msgstr ""
+
+#: builtin/for-each-ref.c:1005
+msgid "key"
+msgstr ""
+
+#: builtin/for-each-ref.c:1006
+msgid "field name to sort on"
+msgstr ""
+
+#: builtin/fsck.c:608
+#, fuzzy
+msgid "git fsck [options] [<object>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/fsck.c:614
+msgid "show unreachable objects"
+msgstr ""
+
+#: builtin/fsck.c:615
+#, fuzzy
+msgid "show dangling objects"
+msgstr "索引对象中"
+
+#: builtin/fsck.c:616
+msgid "report tags"
+msgstr ""
+
+#: builtin/fsck.c:617
+msgid "report root nodes"
+msgstr ""
+
+#: builtin/fsck.c:618
+msgid "make index objects head nodes"
+msgstr ""
+
+#: builtin/fsck.c:619
+msgid "make reflogs head nodes (default)"
+msgstr ""
+
+#: builtin/fsck.c:620
+msgid "also consider packs and alternate objects"
+msgstr ""
+
+#: builtin/fsck.c:621
+msgid "enable more strict checking"
+msgstr ""
+
+#: builtin/fsck.c:623
+msgid "write dangling objects in .git/lost-found"
+msgstr ""
+
+#: builtin/fsck.c:624 builtin/prune.c:134
+msgid "show progress"
+msgstr ""
+
+#: builtin/gc.c:22
+msgid "git gc [options]"
+msgstr ""
+
 #: builtin/gc.c:63
 #, c-format
 msgid "Invalid %s: '%s'"
@@ -3130,6 +4535,18 @@
 msgid "insanely long object directory %.*s"
 msgstr "不正常的长对象目录 %.*s"
 
+#: builtin/gc.c:179
+msgid "prune unreferenced objects"
+msgstr ""
+
+#: builtin/gc.c:181
+msgid "be more thorough (increased runtime)"
+msgstr ""
+
+#: builtin/gc.c:182
+msgid "enable auto-gc mode"
+msgstr ""
+
 #: builtin/gc.c:221
 #, c-format
 msgid "Auto packing the repository for optimum performance.\n"
@@ -3149,65 +4566,293 @@
 "There are too many unreachable loose objects; run 'git prune' to remove them."
 msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。"
 
+#: builtin/grep.c:22
+msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr ""
+
 #: builtin/grep.c:216
 #, c-format
 msgid "grep: failed to create thread: %s"
 msgstr "grep:无法创建线程:%s"
 
-#: builtin/grep.c:402
+#: builtin/grep.c:454
 #, c-format
 msgid "Failed to chdir: %s"
 msgstr "无法切换目录:%s"
 
-#: builtin/grep.c:478 builtin/grep.c:512
+#: builtin/grep.c:530 builtin/grep.c:564
 #, c-format
 msgid "unable to read tree (%s)"
 msgstr "无法读取树(%s)"
 
-#: builtin/grep.c:526
+#: builtin/grep.c:578
 #, c-format
 msgid "unable to grep from object of type %s"
 msgstr "无法抓取来自于 %s 类型的对象"
 
-#: builtin/grep.c:584
+#: builtin/grep.c:636
 #, c-format
 msgid "switch `%c' expects a numerical value"
 msgstr "开关 `%c' 期望一个数字值"
 
-#: builtin/grep.c:601
+#: builtin/grep.c:653
 #, c-format
 msgid "cannot open '%s'"
 msgstr "不能打开 '%s'"
 
-#: builtin/grep.c:885
+#: builtin/grep.c:728
+msgid "search in index instead of in the work tree"
+msgstr ""
+
+#: builtin/grep.c:730
+msgid "find in contents not managed by git"
+msgstr ""
+
+#  译者:中文字符串拼接,可删除前导空格
+#: builtin/grep.c:732
+#, fuzzy
+msgid "search in both tracked and untracked files"
+msgstr "(使用 -u 参数显示未跟踪的文件)"
+
+#: builtin/grep.c:734
+msgid "search also in ignored files"
+msgstr ""
+
+#: builtin/grep.c:737
+msgid "show non-matching lines"
+msgstr ""
+
+#: builtin/grep.c:739
+msgid "case insensitive matching"
+msgstr ""
+
+#: builtin/grep.c:741
+msgid "match patterns only at word boundaries"
+msgstr ""
+
+#: builtin/grep.c:743
+msgid "process binary files as text"
+msgstr ""
+
+#: builtin/grep.c:745
+msgid "don't match patterns in binary files"
+msgstr ""
+
+#: builtin/grep.c:748
+msgid "descend at most <depth> levels"
+msgstr ""
+
+#: builtin/grep.c:752
+msgid "use extended POSIX regular expressions"
+msgstr ""
+
+#: builtin/grep.c:755
+msgid "use basic POSIX regular expressions (default)"
+msgstr ""
+
+#: builtin/grep.c:758
+msgid "interpret patterns as fixed strings"
+msgstr ""
+
+#: builtin/grep.c:761
+msgid "use Perl-compatible regular expressions"
+msgstr ""
+
+#: builtin/grep.c:764
+msgid "show line numbers"
+msgstr ""
+
+#: builtin/grep.c:765
+msgid "don't show filenames"
+msgstr ""
+
+#: builtin/grep.c:766
+#, fuzzy
+msgid "show filenames"
+msgstr "%s文件:"
+
+#: builtin/grep.c:768
+msgid "show filenames relative to top directory"
+msgstr ""
+
+#: builtin/grep.c:770
+msgid "show only filenames instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:772
+msgid "synonym for --files-with-matches"
+msgstr ""
+
+#: builtin/grep.c:775
+msgid "show only the names of files without match"
+msgstr ""
+
+#: builtin/grep.c:777
+#, fuzzy
+msgid "print NUL after filenames"
+msgstr "为所有文件名前添加 <根目录>"
+
+#: builtin/grep.c:779
+msgid "show the number of matches instead of matching lines"
+msgstr ""
+
+#: builtin/grep.c:780
+msgid "highlight matches"
+msgstr ""
+
+#: builtin/grep.c:782
+msgid "print empty line between matches from different files"
+msgstr ""
+
+#: builtin/grep.c:784
+msgid "show filename only once above matches from same file"
+msgstr ""
+
+#: builtin/grep.c:787
+msgid "show <n> context lines before and after matches"
+msgstr ""
+
+#: builtin/grep.c:790
+msgid "show <n> context lines before matches"
+msgstr ""
+
+#: builtin/grep.c:792
+msgid "show <n> context lines after matches"
+msgstr ""
+
+#: builtin/grep.c:793
+msgid "shortcut for -C NUM"
+msgstr ""
+
+#: builtin/grep.c:796
+msgid "show a line with the function name before matches"
+msgstr ""
+
+#: builtin/grep.c:798
+msgid "show the surrounding function"
+msgstr ""
+
+#: builtin/grep.c:801
+msgid "read patterns from file"
+msgstr ""
+
+#: builtin/grep.c:803
+msgid "match <pattern>"
+msgstr ""
+
+#: builtin/grep.c:805
+msgid "combine patterns specified with -e"
+msgstr ""
+
+#: builtin/grep.c:817
+msgid "indicate hit with exit status without output"
+msgstr ""
+
+#: builtin/grep.c:819
+msgid "show only matches from files that match all patterns"
+msgstr ""
+
+#: builtin/grep.c:822
+msgid "pager"
+msgstr ""
+
+#: builtin/grep.c:822
+msgid "show matching files in the pager"
+msgstr ""
+
+#: builtin/grep.c:825
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr ""
+
+#: builtin/grep.c:826 builtin/show-ref.c:201
+msgid "show usage"
+msgstr ""
+
+#: builtin/grep.c:917
 msgid "no pattern given."
 msgstr "未提供模式匹配。"
 
-#: builtin/grep.c:899
+#: builtin/grep.c:931
 #, c-format
 msgid "bad object %s"
 msgstr "坏对象 %s"
 
-#: builtin/grep.c:940
+#: builtin/grep.c:972
 msgid "--open-files-in-pager only works on the worktree"
 msgstr "--open-files-in-pager 仅用于工作区"
 
-#: builtin/grep.c:963
+#: builtin/grep.c:995
 msgid "--cached or --untracked cannot be used with --no-index."
 msgstr "--cached 或 --untracked 不能与 --no-index 同时使用。"
 
-#: builtin/grep.c:968
+#: builtin/grep.c:1000
 msgid "--no-index or --untracked cannot be used with revs."
 msgstr "--no-index 或 --untracked 不能和版本同时使用。"
 
-#: builtin/grep.c:971
+#: builtin/grep.c:1003
 msgid "--[no-]exclude-standard cannot be used for tracked contents."
 msgstr "--[no-]exclude-standard 不能用于已跟踪内容。"
 
-#: builtin/grep.c:979
+#: builtin/grep.c:1011
 msgid "both --cached and trees are given."
 msgstr "同时给出了 --cached 和树对象。"
 
+#: builtin/hash-object.c:60
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] "
+"<file>..."
+msgstr ""
+
+#: builtin/hash-object.c:61
+msgid "git hash-object  --stdin-paths < <list-of-paths>"
+msgstr ""
+
+#: builtin/hash-object.c:72
+msgid "type"
+msgstr ""
+
+#: builtin/hash-object.c:72
+#, fuzzy
+msgid "object type"
+msgstr "坏的对象类型。"
+
+#: builtin/hash-object.c:73
+msgid "write the object into the object database"
+msgstr ""
+
+#: builtin/hash-object.c:74
+msgid "read the object from stdin"
+msgstr ""
+
+#: builtin/hash-object.c:76
+msgid "store file as is without filters"
+msgstr ""
+
+#: builtin/hash-object.c:77
+msgid "process file as it were from this path"
+msgstr ""
+
+#: builtin/help.c:43
+#, fuzzy
+msgid "print all available commands"
+msgstr "在 '%s' 下可用的 git 命令"
+
+#: builtin/help.c:44
+msgid "show man page"
+msgstr ""
+
+#: builtin/help.c:45
+msgid "show manual in web browser"
+msgstr ""
+
+#: builtin/help.c:47
+msgid "show info page"
+msgstr ""
+
+#: builtin/help.c:53
+msgid "git help [--all] [--man|--web|--info] [command]"
+msgstr ""
+
 #: builtin/help.c:65
 #, c-format
 msgid "unrecognized help format '%s'"
@@ -3322,6 +4967,11 @@
 msgid "pack signature mismatch"
 msgstr "包签名不匹配"
 
+#: builtin/index-pack.c:294
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr ""
+
 #: builtin/index-pack.c:312
 #, c-format
 msgid "pack has bad object at offset %lu: %s"
@@ -3428,93 +5078,123 @@
 msgid "Resolving deltas"
 msgstr "处理 delta 中"
 
-#: builtin/index-pack.c:1105
+#: builtin/index-pack.c:1064
+#, fuzzy, c-format
+msgid "unable to create thread: %s"
+msgstr "grep:无法创建线程:%s"
+
+#: builtin/index-pack.c:1106
 msgid "confusion beyond insanity"
 msgstr "不可理喻"
 
-#: builtin/index-pack.c:1124
+#: builtin/index-pack.c:1112
+#, c-format
+msgid "completed with %d local objects"
+msgstr ""
+
+#: builtin/index-pack.c:1121
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr ""
+
+#: builtin/index-pack.c:1125
 #, c-format
 msgid "pack has %d unresolved delta"
 msgid_plural "pack has %d unresolved deltas"
 msgstr[0] "包有 %d 个未解决的 delta"
 msgstr[1] "包有 %d 个未解决的 delta"
 
-#: builtin/index-pack.c:1149
+#: builtin/index-pack.c:1150
 #, c-format
 msgid "unable to deflate appended object (%d)"
 msgstr "不能缩小附加对象(%d)"
 
-#: builtin/index-pack.c:1228
+#: builtin/index-pack.c:1229
 #, c-format
 msgid "local object %s is corrupt"
 msgstr "本地对象 %s 已损坏"
 
-#: builtin/index-pack.c:1252
+#: builtin/index-pack.c:1253
 msgid "error while closing pack file"
 msgstr "关闭包文件时出错"
 
-#: builtin/index-pack.c:1265
+#: builtin/index-pack.c:1266
 #, c-format
 msgid "cannot write keep file '%s'"
 msgstr "无法写保留文件 '%s'"
 
-#: builtin/index-pack.c:1273
+#: builtin/index-pack.c:1274
 #, c-format
 msgid "cannot close written keep file '%s'"
 msgstr "无法关闭保留文件 '%s'"
 
-#: builtin/index-pack.c:1286
+#: builtin/index-pack.c:1287
 msgid "cannot store pack file"
 msgstr "无法存储包文件"
 
-#: builtin/index-pack.c:1297
+#: builtin/index-pack.c:1298
 msgid "cannot store index file"
 msgstr "无法存储索引文件"
 
-#: builtin/index-pack.c:1398
+#: builtin/index-pack.c:1331
+#, fuzzy, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "坏的索引版本 '%s'"
+
+#: builtin/index-pack.c:1337
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr ""
+
+#: builtin/index-pack.c:1341 builtin/index-pack.c:1514
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr ""
+
+#: builtin/index-pack.c:1399
 #, c-format
 msgid "Cannot open existing pack file '%s'"
 msgstr "无法打开现存包文件 '%s'"
 
-#: builtin/index-pack.c:1400
+#: builtin/index-pack.c:1401
 #, c-format
 msgid "Cannot open existing pack idx file for '%s'"
 msgstr "无法为 %s 打开包索引文件"
 
-#: builtin/index-pack.c:1447
+#: builtin/index-pack.c:1448
 #, c-format
 msgid "non delta: %d object"
 msgid_plural "non delta: %d objects"
 msgstr[0] "非 delta:%d 个对象"
 msgstr[1] "非 delta:%d 个对象"
 
-#: builtin/index-pack.c:1454
+#: builtin/index-pack.c:1455
 #, c-format
 msgid "chain length = %d: %lu object"
 msgid_plural "chain length = %d: %lu objects"
 msgstr[0] "链长 = %d: %lu 对象"
 msgstr[1] "链长 = %d: %lu 对象"
 
-#: builtin/index-pack.c:1481
+#: builtin/index-pack.c:1482
 msgid "Cannot come back to cwd"
 msgstr "无法返回当前工作目录"
 
-#: builtin/index-pack.c:1525 builtin/index-pack.c:1528
-#: builtin/index-pack.c:1540 builtin/index-pack.c:1544
+#: builtin/index-pack.c:1526 builtin/index-pack.c:1529
+#: builtin/index-pack.c:1541 builtin/index-pack.c:1545
 #, c-format
 msgid "bad %s"
 msgstr "错误选项 %s"
 
-#: builtin/index-pack.c:1558
+#: builtin/index-pack.c:1559
 msgid "--fix-thin cannot be used without --stdin"
 msgstr "--fix-thin 不能和 --stdin 同时使用"
 
-#: builtin/index-pack.c:1562 builtin/index-pack.c:1572
+#: builtin/index-pack.c:1563 builtin/index-pack.c:1573
 #, c-format
 msgid "packfile name '%s' does not end with '.pack'"
 msgstr "包名 '%s' 没有以 '.pack' 结尾"
 
-#: builtin/index-pack.c:1581
+#: builtin/index-pack.c:1582
 msgid "--verify with no packfile name given"
 msgstr "--verify 没有提供包名参数"
 
@@ -3635,6 +5315,25 @@
 msgid "cannot tell cwd"
 msgstr "无法获知当前路径"
 
+#: builtin/init-db.c:467
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
+"[=<permissions>]] [directory]"
+msgstr ""
+
+#: builtin/init-db.c:490
+msgid "permissions"
+msgstr ""
+
+#: builtin/init-db.c:491
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr ""
+
+#: builtin/init-db.c:493 builtin/prune-packed.c:77
+#, fuzzy
+msgid "be quiet"
+msgstr "更加安静"
+
 #: builtin/init-db.c:522 builtin/init-db.c:529
 #, c-format
 msgid "cannot mkdir %s"
@@ -3663,6 +5362,29 @@
 msgid "Cannot access work tree '%s'"
 msgstr "不能访问工作区 '%s'"
 
+#: builtin/log.c:37
+#, fuzzy
+msgid "git log [<options>] [<since>..<until>] [[--] <path>...]\n"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/log.c:38
+#, fuzzy
+msgid "   or: git show [options] <object>..."
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/log.c:100
+msgid "suppress diff output"
+msgstr ""
+
+#: builtin/log.c:101
+#, fuzzy
+msgid "show source"
+msgstr "坏的源"
+
+#: builtin/log.c:102
+msgid "decorate options"
+msgstr ""
+
 #: builtin/log.c:189
 #, c-format
 msgid "Final output: %d %s\n"
@@ -3699,68 +5421,345 @@
 msgid "Not a range."
 msgstr "不是一个范围。"
 
-#: builtin/log.c:792
+#: builtin/log.c:789
 msgid "Cover letter needs email format"
 msgstr "信封需要邮件地址格式"
 
-#: builtin/log.c:865
+#: builtin/log.c:862
 #, c-format
 msgid "insane in-reply-to: %s"
 msgstr "不正常的 in-reply-to:%s"
 
-#: builtin/log.c:938
+#: builtin/log.c:890
+msgid "git format-patch [options] [<since> | <revision range>]"
+msgstr ""
+
+#: builtin/log.c:935
 msgid "Two output directories?"
 msgstr "两个输出目录?"
 
-#: builtin/log.c:1160
+#: builtin/log.c:1063
+msgid "use [PATCH n/m] even with a single patch"
+msgstr ""
+
+#: builtin/log.c:1066
+msgid "use [PATCH] even with multiple patches"
+msgstr ""
+
+#: builtin/log.c:1070
+msgid "print patches to standard out"
+msgstr ""
+
+#: builtin/log.c:1072
+msgid "generate a cover letter"
+msgstr ""
+
+#: builtin/log.c:1074
+msgid "use simple number sequence for output file names"
+msgstr ""
+
+#: builtin/log.c:1075
+msgid "sfx"
+msgstr ""
+
+#: builtin/log.c:1076
+msgid "use <sfx> instead of '.patch'"
+msgstr ""
+
+#: builtin/log.c:1078
+msgid "start numbering patches at <n> instead of 1"
+msgstr ""
+
+#: builtin/log.c:1080
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1083
+msgid "store resulting files in <dir>"
+msgstr ""
+
+#: builtin/log.c:1086
+msgid "don't strip/add [PATCH]"
+msgstr ""
+
+#: builtin/log.c:1089
+msgid "don't output binary diffs"
+msgstr ""
+
+#: builtin/log.c:1091
+msgid "don't include a patch matching a commit upstream"
+msgstr ""
+
+#: builtin/log.c:1093
+msgid "show patch format instead of default (patch + stat)"
+msgstr ""
+
+#: builtin/log.c:1095
+#, fuzzy
+msgid "Messaging"
+msgstr "合并:"
+
+#  译者:注意保持句尾空格
+#: builtin/log.c:1096
+#, fuzzy
+msgid "header"
+msgstr "领先 "
+
+#: builtin/log.c:1097
+msgid "add email header"
+msgstr ""
+
+#: builtin/log.c:1098 builtin/log.c:1100
+msgid "email"
+msgstr ""
+
+#: builtin/log.c:1098
+msgid "add To: header"
+msgstr ""
+
+#: builtin/log.c:1100
+msgid "add Cc: header"
+msgstr ""
+
+#: builtin/log.c:1102
+msgid "message-id"
+msgstr ""
+
+#: builtin/log.c:1103
+msgid "make first mail a reply to <message-id>"
+msgstr ""
+
+#: builtin/log.c:1104 builtin/log.c:1107
+msgid "boundary"
+msgstr ""
+
+#: builtin/log.c:1105
+msgid "attach the patch"
+msgstr ""
+
+#: builtin/log.c:1108
+#, fuzzy
+msgid "inline the patch"
+msgstr "忽略补丁中的添加的文件"
+
+#: builtin/log.c:1112
+msgid "enable message threading, styles: shallow, deep"
+msgstr ""
+
+#: builtin/log.c:1114
+msgid "signature"
+msgstr ""
+
+#: builtin/log.c:1115
+msgid "add a signature"
+msgstr ""
+
+#: builtin/log.c:1117
+#, fuzzy
+msgid "don't print the patch filenames"
+msgstr "无法打开补丁文件 %s"
+
+#: builtin/log.c:1157
 #, c-format
 msgid "bogus committer info %s"
 msgstr "虚假的提交者信息 %s"
 
-#: builtin/log.c:1205
+#: builtin/log.c:1202
 msgid "-n and -k are mutually exclusive."
 msgstr "-n 和 -k 互斥。"
 
-#: builtin/log.c:1207
+#: builtin/log.c:1204
 msgid "--subject-prefix and -k are mutually exclusive."
 msgstr "--subject-prefix 和 -k 互斥。"
 
-#: builtin/log.c:1215
+#: builtin/log.c:1212
 msgid "--name-only does not make sense"
 msgstr "--name-only 无意义"
 
-#: builtin/log.c:1217
+#: builtin/log.c:1214
 msgid "--name-status does not make sense"
 msgstr "--name-status 无意义"
 
-#: builtin/log.c:1219
+#: builtin/log.c:1216
 msgid "--check does not make sense"
 msgstr "--check 无意义"
 
-#: builtin/log.c:1242
+#: builtin/log.c:1239
 msgid "standard output, or directory, which one?"
 msgstr "标准输出或目录,哪一个?"
 
-#: builtin/log.c:1244
+#: builtin/log.c:1241
 #, c-format
 msgid "Could not create directory '%s'"
 msgstr "不能创建目录 '%s'"
 
-#: builtin/log.c:1397
+#: builtin/log.c:1394
 msgid "Failed to create output files"
 msgstr "无法创建输出文件"
 
-#: builtin/log.c:1501
+#: builtin/log.c:1443
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr ""
+
+#: builtin/log.c:1498
 #, c-format
 msgid ""
 "Could not find a tracked remote branch, please specify <upstream> manually.\n"
 msgstr "不能找到跟踪的远程分支,请手工指定 <upstream>。\n"
 
-#: builtin/log.c:1517 builtin/log.c:1519 builtin/log.c:1531
+#: builtin/log.c:1511 builtin/log.c:1513 builtin/log.c:1525
 #, c-format
 msgid "Unknown commit %s"
 msgstr "未知提交 %s"
 
+#: builtin/ls-files.c:408
+#, fuzzy
+msgid "git ls-files [options] [<file>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/ls-files.c:463
+msgid "identify the file status with tags"
+msgstr ""
+
+#: builtin/ls-files.c:465
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr ""
+
+#: builtin/ls-files.c:467
+msgid "show cached files in the output (default)"
+msgstr ""
+
+#: builtin/ls-files.c:469
+#, fuzzy
+msgid "show deleted files in the output"
+msgstr "删除的文件 %s 仍有内容"
+
+#: builtin/ls-files.c:471
+msgid "show modified files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:473
+msgid "show other files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:475
+msgid "show ignored files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:478
+msgid "show staged contents' object name in the output"
+msgstr ""
+
+#: builtin/ls-files.c:480
+msgid "show files on the filesystem that need to be removed"
+msgstr ""
+
+#: builtin/ls-files.c:482
+msgid "show 'other' directories' name only"
+msgstr ""
+
+#: builtin/ls-files.c:485
+#, fuzzy
+msgid "don't show empty directories"
+msgstr "两个输出目录?"
+
+#: builtin/ls-files.c:488
+msgid "show unmerged files in the output"
+msgstr ""
+
+#: builtin/ls-files.c:490
+msgid "show resolve-undo information"
+msgstr ""
+
+#: builtin/ls-files.c:492
+#, fuzzy
+msgid "skip files matching pattern"
+msgstr "输出和模式匹配的行"
+
+#: builtin/ls-files.c:495
+msgid "exclude patterns are read from <file>"
+msgstr ""
+
+#: builtin/ls-files.c:498
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr ""
+
+#: builtin/ls-files.c:500
+msgid "add the standard git exclusions"
+msgstr ""
+
+#: builtin/ls-files.c:503
+msgid "make the output relative to the project top directory"
+msgstr ""
+
+#: builtin/ls-files.c:506
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr ""
+
+#: builtin/ls-files.c:507
+msgid "tree-ish"
+msgstr ""
+
+#: builtin/ls-files.c:508
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr ""
+
+#: builtin/ls-files.c:510
+msgid "show debugging data"
+msgstr ""
+
+#: builtin/ls-tree.c:27
+#, fuzzy
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/ls-tree.c:125
+msgid "only show trees"
+msgstr ""
+
+#: builtin/ls-tree.c:127
+#, fuzzy
+msgid "recurse into subtrees"
+msgstr "变基到远程 %s"
+
+#: builtin/ls-tree.c:129
+msgid "show trees when recursing"
+msgstr ""
+
+#: builtin/ls-tree.c:132
+msgid "terminate entries with NUL byte"
+msgstr ""
+
+#: builtin/ls-tree.c:133
+#, fuzzy
+msgid "include object size"
+msgstr "提供了无效对象 '%s'。"
+
+#: builtin/ls-tree.c:135 builtin/ls-tree.c:137
+msgid "list only filenames"
+msgstr ""
+
+#: builtin/ls-tree.c:140
+msgid "use full path names"
+msgstr ""
+
+#: builtin/ls-tree.c:142
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr ""
+
+#: builtin/merge.c:43
+#, fuzzy
+msgid "git merge [options] [<commit>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/merge.c:44
+msgid "git merge [options] <msg> HEAD <commit>"
+msgstr ""
+
+#: builtin/merge.c:45
+msgid "git merge --abort"
+msgstr ""
+
 #: builtin/merge.c:90
 msgid "switch `m' requires a value"
 msgstr "开关 `m' 需要一个值"
@@ -3780,6 +5779,71 @@
 msgid "Available custom strategies are:"
 msgstr "可用的自定义策略有:"
 
+#: builtin/merge.c:183
+msgid "do not show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:186
+msgid "show a diffstat at the end of the merge"
+msgstr ""
+
+#: builtin/merge.c:187
+msgid "(synonym to --stat)"
+msgstr ""
+
+#: builtin/merge.c:189
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr ""
+
+#: builtin/merge.c:192
+#, fuzzy
+msgid "create a single commit instead of doing a merge"
+msgstr "在合并过程中不能做部分提交。"
+
+#: builtin/merge.c:194
+msgid "perform a commit if the merge succeeds (default)"
+msgstr ""
+
+#: builtin/merge.c:196
+#, fuzzy
+msgid "edit message before committing"
+msgstr "尚未暂存以备提交的变更:"
+
+#: builtin/merge.c:198
+#, fuzzy
+msgid "allow fast-forward (default)"
+msgstr "可快进"
+
+#: builtin/merge.c:200
+msgid "abort if fast-forward is not possible"
+msgstr ""
+
+#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112
+msgid "strategy"
+msgstr ""
+
+#: builtin/merge.c:203
+#, fuzzy
+msgid "merge strategy to use"
+msgstr "尝试合并策略 %s...\n"
+
+#: builtin/merge.c:204
+msgid "option=value"
+msgstr ""
+
+#: builtin/merge.c:205
+msgid "option for selected merge strategy"
+msgstr ""
+
+#: builtin/merge.c:207
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr ""
+
+#: builtin/merge.c:211
+#, fuzzy
+msgid "abort the current in-progress merge"
+msgstr "无法保存当前索引状态"
+
 #: builtin/merge.c:240
 msgid "could not run stash."
 msgstr "不能进行进度保存。"
@@ -3820,49 +5884,49 @@
 msgid "No merge message -- not updating HEAD\n"
 msgstr "无合并信息 -- 未更新 HEAD\n"
 
-#: builtin/merge.c:437
+#: builtin/merge.c:436
 #, c-format
 msgid "'%s' does not point to a commit"
 msgstr "'%s' 没有指向一个提交"
 
-#: builtin/merge.c:536
+#: builtin/merge.c:535
 #, c-format
 msgid "Bad branch.%s.mergeoptions string: %s"
 msgstr "坏的 branch.%s.mergeoptions 字符串:%s"
 
-#: builtin/merge.c:629
+#: builtin/merge.c:628
 msgid "git write-tree failed to write a tree"
 msgstr "git write-tree 无法写入一树对象"
 
-#: builtin/merge.c:679
+#: builtin/merge.c:678
 msgid "failed to read the cache"
 msgstr "无法读取缓存"
 
-#: builtin/merge.c:710
+#: builtin/merge.c:709
 msgid "Not handling anything other than two heads merge."
 msgstr "不能处理两个头合并之外的任何操作。"
 
-#: builtin/merge.c:724
+#: builtin/merge.c:723
 #, c-format
 msgid "Unknown option for merge-recursive: -X%s"
 msgstr "merge-recursive 的未知选项:-X%s"
 
-#: builtin/merge.c:738
+#: builtin/merge.c:737
 #, c-format
 msgid "unable to write %s"
 msgstr "不能写 %s"
 
-#: builtin/merge.c:877
+#: builtin/merge.c:876
 #, c-format
 msgid "Could not read from '%s'"
 msgstr "不能从 '%s' 读取"
 
-#: builtin/merge.c:886
+#: builtin/merge.c:885
 #, c-format
 msgid "Not committing merge; use 'git commit' to complete the merge.\n"
 msgstr "未提交合并,使用 'git commit' 完成此次合并。\n"
 
-#: builtin/merge.c:892
+#: builtin/merge.c:891
 msgid ""
 "Please enter a commit message to explain why this merge is necessary,\n"
 "especially if it merges an updated upstream into a topic branch.\n"
@@ -3875,52 +5939,52 @@
 "\n"
 "以 '#' 开头的行将被忽略,而且空提交说明将会终止提交。\n"
 
-#: builtin/merge.c:916
+#: builtin/merge.c:915
 msgid "Empty commit message."
 msgstr "空提交信息。"
 
-#: builtin/merge.c:928
+#: builtin/merge.c:927
 #, c-format
 msgid "Wonderful.\n"
 msgstr "太棒了。\n"
 
-#: builtin/merge.c:993
+#: builtin/merge.c:992
 #, c-format
 msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
 msgstr "自动合并失败,修正冲突然后提交修正的结果。\n"
 
-#: builtin/merge.c:1009
+#: builtin/merge.c:1008
 #, c-format
 msgid "'%s' is not a commit"
 msgstr "'%s' 不是一个提交"
 
-#: builtin/merge.c:1050
+#: builtin/merge.c:1049
 msgid "No current branch."
 msgstr "没有当前分支。"
 
-#: builtin/merge.c:1052
+#: builtin/merge.c:1051
 msgid "No remote for the current branch."
 msgstr "当前分支没有对应的远程版本库。"
 
-#: builtin/merge.c:1054
+#: builtin/merge.c:1053
 msgid "No default upstream defined for the current branch."
 msgstr "当前分支没有定义默认的上游分支。"
 
-#: builtin/merge.c:1059
+#: builtin/merge.c:1058
 #, c-format
 msgid "No remote tracking branch for %s from %s"
 msgstr "%s 没有来自 %s 的远程跟踪分支"
 
-#: builtin/merge.c:1146 builtin/merge.c:1303
+#: builtin/merge.c:1145 builtin/merge.c:1302
 #, c-format
 msgid "%s - not something we can merge"
 msgstr "%s - 不能被合并"
 
-#: builtin/merge.c:1214
+#: builtin/merge.c:1213
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "没有要终止的合并(MERGE_HEAD 丢失)。"
 
-#: builtin/merge.c:1230 git-pull.sh:31
+#: builtin/merge.c:1229 git-pull.sh:31
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3928,11 +5992,11 @@
 "您尚未结束您的合并(存在 MERGE_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1233 git-pull.sh:34
+#: builtin/merge.c:1232 git-pull.sh:34
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "您尚未结束您的合并(存在 MERGE_HEAD)。"
 
-#: builtin/merge.c:1237
+#: builtin/merge.c:1236
 msgid ""
 "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
 "Please, commit your changes before you can merge."
@@ -3940,83 +6004,184 @@
 "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。\n"
 "请在合并前先提交您的修改。"
 
-#: builtin/merge.c:1240
+#: builtin/merge.c:1239
 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
 msgstr "您尚未结束您的拣选(存在 CHERRY_PICK_HEAD)。"
 
-#: builtin/merge.c:1249
+#: builtin/merge.c:1248
 msgid "You cannot combine --squash with --no-ff."
 msgstr "您不能将 --squash 与 --no-ff 同时使用。"
 
-#: builtin/merge.c:1254
+#: builtin/merge.c:1253
 msgid "You cannot combine --no-ff with --ff-only."
 msgstr "您不能将 --no-ff 与 --ff-only 同时使用。"
 
-#: builtin/merge.c:1261
+#: builtin/merge.c:1260
 msgid "No commit specified and merge.defaultToUpstream not set."
 msgstr "未指定提交并且 merge.defaultToUpstream 未设置。"
 
-#: builtin/merge.c:1293
+#: builtin/merge.c:1292
 msgid "Can merge only exactly one commit into empty head"
 msgstr "只能将一个提交合并到空分支上"
 
-#: builtin/merge.c:1296
+#: builtin/merge.c:1295
 msgid "Squash commit into empty head not supported yet"
 msgstr "尚不支持到空分支的压缩提交"
 
-#: builtin/merge.c:1298
+#: builtin/merge.c:1297
 msgid "Non-fast-forward commit does not make sense into an empty head"
 msgstr "到空分支的非快进式提交没有意义"
 
-#: builtin/merge.c:1413
+#: builtin/merge.c:1412
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "更新 %s..%s\n"
 
-#: builtin/merge.c:1451
+#: builtin/merge.c:1450
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "尝试非常小的索引内合并...\n"
 
-#: builtin/merge.c:1458
+#: builtin/merge.c:1457
 #, c-format
 msgid "Nope.\n"
 msgstr "无。\n"
 
-#: builtin/merge.c:1490
+#: builtin/merge.c:1489
 msgid "Not possible to fast-forward, aborting."
 msgstr "无法快进,终止。"
 
-#: builtin/merge.c:1513 builtin/merge.c:1592
+#: builtin/merge.c:1512 builtin/merge.c:1591
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "将树回滚至原始状态...\n"
 
-#: builtin/merge.c:1517
+#: builtin/merge.c:1516
 #, c-format
 msgid "Trying merge strategy %s...\n"
 msgstr "尝试合并策略 %s...\n"
 
-#: builtin/merge.c:1583
+#: builtin/merge.c:1582
 #, c-format
 msgid "No merge strategy handled the merge.\n"
 msgstr "没有合并策略处理此合并。\n"
 
-#: builtin/merge.c:1585
+#: builtin/merge.c:1584
 #, c-format
 msgid "Merge with strategy %s failed.\n"
 msgstr "使用策略 %s 合并失败。\n"
 
-#: builtin/merge.c:1594
+#: builtin/merge.c:1593
 #, c-format
 msgid "Using the %s to prepare resolving by hand.\n"
 msgstr "使用 %s 以准备手工解决。\n"
 
-#: builtin/merge.c:1606
+#: builtin/merge.c:1605
 #, c-format
 msgid "Automatic merge went well; stopped before committing as requested\n"
 msgstr "自动合并进展顺利,按要求在提交前停止\n"
 
+#: builtin/merge-base.c:26
+msgid "git merge-base [-a|--all] <commit> <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:27
+msgid "git merge-base [-a|--all] --octopus <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:28
+msgid "git merge-base --independent <commit>..."
+msgstr ""
+
+#: builtin/merge-base.c:29
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr ""
+
+#: builtin/merge-base.c:98
+#, fuzzy
+msgid "output all common ancestors"
+msgstr "发现 %u 个共同祖先:"
+
+#: builtin/merge-base.c:99
+msgid "find ancestors for a single n-way merge"
+msgstr ""
+
+#: builtin/merge-base.c:100
+msgid "list revs not reachable from others"
+msgstr ""
+
+#: builtin/merge-base.c:102
+msgid "is the first one ancestor of the other?"
+msgstr ""
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file "
+"file2"
+msgstr ""
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr ""
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr ""
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr ""
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr ""
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr ""
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr ""
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr ""
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig_file/file2"
+msgstr ""
+
+#: builtin/mktree.c:67
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr ""
+
+#: builtin/mktree.c:153
+msgid "input is NUL terminated"
+msgstr ""
+
+#: builtin/mktree.c:154 builtin/write-tree.c:24
+#, fuzzy
+msgid "allow missing objects"
+msgstr "接收对象中"
+
+#: builtin/mktree.c:155
+msgid "allow creation of more than one tree"
+msgstr ""
+
+#: builtin/mv.c:14
+msgid "git mv [options] <source>... <destination>"
+msgstr ""
+
+#: builtin/mv.c:64
+msgid "force move/rename even if target exists"
+msgstr ""
+
+#: builtin/mv.c:65
+#, fuzzy
+msgid "skip move/rename errors"
+msgstr "程序错误"
+
 #: builtin/mv.c:108
 #, c-format
 msgid "Checking rename of '%s' to '%s'\n"
@@ -4079,6 +6244,151 @@
 msgid "renaming '%s' failed"
 msgstr "重命名 '%s' 失败"
 
+#: builtin/name-rev.c:175
+#, fuzzy
+msgid "git name-rev [options] <commit>..."
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/name-rev.c:176
+msgid "git name-rev [options] --all"
+msgstr ""
+
+#: builtin/name-rev.c:177
+msgid "git name-rev [options] --stdin"
+msgstr ""
+
+#: builtin/name-rev.c:229
+msgid "print only names (no SHA-1)"
+msgstr ""
+
+#: builtin/name-rev.c:230
+msgid "only use tags to name the commits"
+msgstr ""
+
+#: builtin/name-rev.c:232
+#, fuzzy
+msgid "only use refs matching <pattern>"
+msgstr "输出和模式匹配的行"
+
+#: builtin/name-rev.c:234
+msgid "list all commits reachable from all refs"
+msgstr ""
+
+#: builtin/name-rev.c:235
+msgid "read from stdin"
+msgstr ""
+
+#: builtin/name-rev.c:236
+msgid "allow to print `undefined` names"
+msgstr ""
+
+#: builtin/notes.c:23
+msgid "git notes [--ref <notes_ref>] [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:24
+msgid ""
+"git notes [--ref <notes_ref>] add [-f] [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes_ref>] append [-m <msg> | -F <file> | (-c | -C) "
+"<object>] [<object>]"
+msgstr ""
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes_ref>] edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:28
+msgid "git notes [--ref <notes_ref>] show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:29
+msgid ""
+"git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:30
+msgid "git notes merge --commit [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:31
+msgid "git notes merge --abort [-v | -q]"
+msgstr ""
+
+#: builtin/notes.c:32
+msgid "git notes [--ref <notes_ref>] remove [<object>...]"
+msgstr ""
+
+#: builtin/notes.c:33
+msgid "git notes [--ref <notes_ref>] prune [-n | -v]"
+msgstr ""
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes_ref>] get-ref"
+msgstr ""
+
+#: builtin/notes.c:39
+msgid "git notes [list [<object>]]"
+msgstr ""
+
+#: builtin/notes.c:44
+#, fuzzy
+msgid "git notes add [<options>] [<object>]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/notes.c:49
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr ""
+
+#: builtin/notes.c:50
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr ""
+
+#: builtin/notes.c:55
+#, fuzzy
+msgid "git notes append [<options>] [<object>]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/notes.c:60
+msgid "git notes edit [<object>]"
+msgstr ""
+
+#: builtin/notes.c:65
+msgid "git notes show [<object>]"
+msgstr ""
+
+#: builtin/notes.c:70
+msgid "git notes merge [<options>] <notes_ref>"
+msgstr ""
+
+#: builtin/notes.c:71
+msgid "git notes merge --commit [<options>]"
+msgstr ""
+
+#: builtin/notes.c:72
+msgid "git notes merge --abort [<options>]"
+msgstr ""
+
+#: builtin/notes.c:77
+msgid "git notes remove [<object>]"
+msgstr ""
+
+#: builtin/notes.c:82
+msgid "git notes prune [<options>]"
+msgstr ""
+
+#: builtin/notes.c:87
+msgid "git notes get-ref"
+msgstr ""
+
 #: builtin/notes.c:139
 #, c-format
 msgid "unable to start 'show' for object '%s'"
@@ -4186,6 +6496,37 @@
 msgid "No note found for object %s."
 msgstr "未发现对象 %s 的注解。"
 
+#: builtin/notes.c:535 builtin/notes.c:692
+#, fuzzy
+msgid "note contents as a string"
+msgstr "注解内容被留在文件 %s 中"
+
+#: builtin/notes.c:538 builtin/notes.c:695
+#, fuzzy
+msgid "note contents in a file"
+msgstr "无法存储索引文件"
+
+#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697
+#: builtin/notes.c:700 builtin/tag.c:476
+#, fuzzy
+msgid "object"
+msgstr "坏对象 %s"
+
+#: builtin/notes.c:541 builtin/notes.c:698
+#, fuzzy
+msgid "reuse and edit specified note object"
+msgstr "不能写注解对象"
+
+#: builtin/notes.c:544 builtin/notes.c:701
+#, fuzzy
+msgid "reuse specified note object"
+msgstr "不能写注解对象"
+
+#: builtin/notes.c:546 builtin/notes.c:614
+#, fuzzy
+msgid "replace existing notes"
+msgstr "不能读取现存对象 %s"
+
 #: builtin/notes.c:580
 #, c-format
 msgid ""
@@ -4198,6 +6539,15 @@
 msgid "Overwriting existing notes for object %s\n"
 msgstr "覆盖对象 %s 现存注解\n"
 
+#: builtin/notes.c:615
+#, fuzzy
+msgid "read objects from stdin"
+msgstr "坏对象 %s"
+
+#: builtin/notes.c:617
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr ""
+
 #: builtin/notes.c:635
 msgid "too few parameters"
 msgstr "参数太少"
@@ -4223,16 +6573,73 @@
 "子命令 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
 "请换用 'git notes add -f -m/-F/-c/-C'。\n"
 
+#: builtin/notes.c:864
+#, fuzzy
+msgid "General options"
+msgstr "无效选项:%s"
+
+#: builtin/notes.c:866
+msgid "Merge options"
+msgstr ""
+
+#: builtin/notes.c:868
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr ""
+
+#: builtin/notes.c:870
+msgid "Committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:872
+msgid "finalize notes merge by committing unmerged notes"
+msgstr ""
+
+#: builtin/notes.c:874
+msgid "Aborting notes merge resolution"
+msgstr ""
+
+#: builtin/notes.c:876
+#, fuzzy
+msgid "abort notes merge"
+msgstr "path '%s':无法合并"
+
 #: builtin/notes.c:971
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "对象 %s 没有注解\n"
 
+#: builtin/notes.c:983
+msgid "attempt to remove non-existent note is not an error"
+msgstr ""
+
+#: builtin/notes.c:986
+#, fuzzy
+msgid "read object names from the standard input"
+msgstr "(正从标准输入中读取日志信息)\n"
+
+#: builtin/notes.c:1067
+msgid "notes_ref"
+msgstr ""
+
+#: builtin/notes.c:1068
+msgid "use notes from <notes_ref>"
+msgstr ""
+
 #: builtin/notes.c:1103 builtin/remote.c:1598
 #, c-format
 msgid "Unknown subcommand: %s"
 msgstr "未知子命令:%s"
 
+#: builtin/pack-objects.c:23
+msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
+msgstr ""
+
+#: builtin/pack-objects.c:24
+msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
+msgstr ""
+
 #: builtin/pack-objects.c:183 builtin/pack-objects.c:186
 #, c-format
 msgid "deflate error (%d)"
@@ -4258,6 +6665,171 @@
 msgid "unable to parse value '%s' for option %s"
 msgstr "不能解析选项 %1$s 的值 '%2$s'"
 
+#: builtin/pack-objects.c:2448
+msgid "do not show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2450
+msgid "show progress meter"
+msgstr ""
+
+#: builtin/pack-objects.c:2452
+msgid "show progress meter during object writing phase"
+msgstr ""
+
+#: builtin/pack-objects.c:2455
+msgid "similar to --all-progress when progress meter is shown"
+msgstr ""
+
+#: builtin/pack-objects.c:2456
+msgid "version[,offset]"
+msgstr ""
+
+#: builtin/pack-objects.c:2457
+msgid "write the pack index file in the specified idx format version"
+msgstr ""
+
+#: builtin/pack-objects.c:2460
+#, fuzzy
+msgid "maximum size of each output pack file"
+msgstr "无法创建输出文件"
+
+#: builtin/pack-objects.c:2462
+msgid "ignore borrowed objects from alternate object store"
+msgstr ""
+
+#: builtin/pack-objects.c:2464
+#, fuzzy
+msgid "ignore packed objects"
+msgstr "不能读取对象 %s"
+
+#: builtin/pack-objects.c:2466
+msgid "limit pack window by objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2468
+msgid "limit pack window by memory in addition to object limit"
+msgstr ""
+
+#: builtin/pack-objects.c:2470
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr ""
+
+#: builtin/pack-objects.c:2472
+#, fuzzy
+msgid "reuse existing deltas"
+msgstr "处理 delta 中"
+
+#: builtin/pack-objects.c:2474
+#, fuzzy
+msgid "reuse existing objects"
+msgstr "不能读取现存对象 %s"
+
+#: builtin/pack-objects.c:2476
+msgid "use OFS_DELTA objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2478
+msgid "use threads when searching for best delta matches"
+msgstr ""
+
+#: builtin/pack-objects.c:2480
+msgid "do not create an empty pack output"
+msgstr ""
+
+#: builtin/pack-objects.c:2482
+#, fuzzy
+msgid "read revision arguments from standard input"
+msgstr "(正从标准输入中读取日志信息)\n"
+
+#: builtin/pack-objects.c:2484
+msgid "limit the objects to those that are not yet packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2487
+msgid "include objects reachable from any reference"
+msgstr ""
+
+#: builtin/pack-objects.c:2490
+msgid "include objects referred by reflog entries"
+msgstr ""
+
+#: builtin/pack-objects.c:2493
+msgid "output pack to stdout"
+msgstr ""
+
+#: builtin/pack-objects.c:2495
+msgid "include tag objects that refer to objects to be packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2497
+msgid "keep unreachable objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2498 parse-options.h:141
+msgid "time"
+msgstr "时间"
+
+#: builtin/pack-objects.c:2499
+msgid "unpack unreachable objects newer than <time>"
+msgstr ""
+
+#: builtin/pack-objects.c:2502
+msgid "create thin packs"
+msgstr ""
+
+#: builtin/pack-objects.c:2504
+msgid "ignore packs that have companion .keep file"
+msgstr ""
+
+#: builtin/pack-objects.c:2506
+msgid "pack compression level"
+msgstr ""
+
+#: builtin/pack-objects.c:2508
+#, fuzzy
+msgid "do not hide commits by grafts"
+msgstr "不能写提交模版"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [options]"
+msgstr ""
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr ""
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr ""
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
+msgstr ""
+
+#: builtin/prune.c:12
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr ""
+
+#: builtin/prune.c:132
+#, fuzzy
+msgid "do not remove, show only"
+msgstr "不会删除 %s\n"
+
+#: builtin/prune.c:133
+#, fuzzy
+msgid "report pruned objects"
+msgstr "不能读取对象 %s"
+
+#: builtin/prune.c:136
+msgid "expire objects older than <time>"
+msgstr ""
+
+#: builtin/push.c:14
+#, fuzzy
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git apply [选项] [<补丁>...]"
+
 #: builtin/push.c:45
 msgid "tag shorthand without <tag>"
 msgstr "tag 简写没有跟 <tag> 参数"
@@ -4340,12 +6912,44 @@
 "您正推送至远程 '%s'(其并非当前分支 '%s' 的上游),\n"
 "而没有告诉我要推送什么、更新哪个远程分支。"
 
-#: builtin/push.c:174
+#  译者:字符串首行行首要添加“warning: ”字串,故此首行要较其余行短
+#: builtin/push.c:151
+msgid ""
+"push.default is unset; its implicit value is changing in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the current behavior after the default changes, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"push.default 未设置,它的默认值将会在 Git 2.0 由 'matching'\n"
+"修改为 'simple'。若要不再显示本信息并在其默认值改变后维持当前使用习惯,\n"
+"进行如下设置:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"若要不再显示本信息并从现在开始采用新的使用习惯,设置:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"参见 'git help config' 并查找 'push.default' 以获取更多信息。\n"
+"('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,\n"
+"为保持兼容,请用 'current' 代替 'simple' 模式)"
+
+#: builtin/push.c:199
 msgid ""
 "You didn't specify any refspecs to push, and push.default is \"nothing\"."
 msgstr "您没有为推送指定任何引用表达式,并且 push.default 为 \"nothing\"。"
 
-#: builtin/push.c:181
+#: builtin/push.c:206
 msgid ""
 "Updates were rejected because the tip of your current branch is behind\n"
 "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n"
@@ -4356,18 +6960,19 @@
 "再次推送前,先与远程变更合并(如 'git pull')。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:187
+#: builtin/push.c:212
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration\n"
-"variable to 'current' or 'upstream' to push only the current branch."
+"specify branches to push or set the 'push.default' configuration variable\n"
+"to 'simple', 'current' or 'upstream' to push only the current branch."
 msgstr ""
 "更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。\n"
 "如果您并非有意推送该分支,您可以在推送时指定要推送的分支,或者将\n"
-"配置变量 'push.default' 设置为 'current' 或 'upstream' 以便只推送当前分支。"
+"配置变量 'push.default' 设置为 'simple'、'current' 或 'upstream'\n"
+"以便只推送当前分支。"
 
-#: builtin/push.c:193
+#: builtin/push.c:218
 msgid ""
 "Updates were rejected because a pushed branch tip is behind its remote\n"
 "counterpart. Check out this branch and merge the remote changes\n"
@@ -4378,22 +6983,22 @@
 "检出该分支并与远程变更合并(如 'git pull'),然后再推送。详见\n"
 "'git push --help' 中的 'Note about fast-forwards' 小节。"
 
-#: builtin/push.c:233
+#: builtin/push.c:258
 #, c-format
 msgid "Pushing to %s\n"
 msgstr "推送到 %s\n"
 
-#: builtin/push.c:237
+#: builtin/push.c:262
 #, c-format
 msgid "failed to push some refs to '%s'"
 msgstr "无法推送一些引用到 '%s'"
 
-#: builtin/push.c:269
+#: builtin/push.c:294
 #, c-format
 msgid "bad repository '%s'"
 msgstr "坏的版本库 '%s'"
 
-#: builtin/push.c:270
+#: builtin/push.c:295
 msgid ""
 "No configured push destination.\n"
 "Either specify the URL from the command-line or configure a remote "
@@ -4414,34 +7019,241 @@
 "\n"
 "    git push <name>\n"
 
-#: builtin/push.c:285
+#: builtin/push.c:310
 msgid "--all and --tags are incompatible"
 msgstr "--all 和 --tags 不兼容"
 
-#: builtin/push.c:286
+#: builtin/push.c:311
 msgid "--all can't be combined with refspecs"
 msgstr "--all 不能和引用表达式同时使用"
 
-#: builtin/push.c:291
+#: builtin/push.c:316
 msgid "--mirror and --tags are incompatible"
 msgstr "--mirror 和 --tags 不兼容"
 
-#: builtin/push.c:292
+#: builtin/push.c:317
 msgid "--mirror can't be combined with refspecs"
 msgstr "--mirror 不能和引用表达式同时使用"
 
-#: builtin/push.c:297
+#: builtin/push.c:322
 msgid "--all and --mirror are incompatible"
 msgstr "--all 和 --mirror 不兼容"
 
-#: builtin/push.c:385
+#: builtin/push.c:382
+#, fuzzy
+msgid "repository"
+msgstr "坏的版本库 '%s'"
+
+#: builtin/push.c:383
+msgid "push all refs"
+msgstr ""
+
+#: builtin/push.c:384
+msgid "mirror all refs"
+msgstr ""
+
+#: builtin/push.c:386
+#, fuzzy
+msgid "delete refs"
+msgstr "删除"
+
+#: builtin/push.c:387
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr ""
+
+#: builtin/push.c:390
+#, fuzzy
+msgid "force updates"
+msgstr "强制更新"
+
+#: builtin/push.c:391
+msgid "check"
+msgstr ""
+
+#: builtin/push.c:392
+msgid "control recursive pushing of submodules"
+msgstr ""
+
+#: builtin/push.c:394
+msgid "use thin pack"
+msgstr ""
+
+#: builtin/push.c:395 builtin/push.c:396
+msgid "receive pack program"
+msgstr ""
+
+#: builtin/push.c:397
+msgid "set upstream for git pull/status"
+msgstr ""
+
+#: builtin/push.c:400
+msgid "prune locally removed refs"
+msgstr ""
+
+#: builtin/push.c:410
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "--delete 与 --all、--mirror 及 --tags 不兼容"
 
-#: builtin/push.c:387
+#: builtin/push.c:412
 msgid "--delete doesn't make sense without any refs"
 msgstr "--delete 未接任何引用没有意义"
 
+#: builtin/read-tree.c:36
+msgid ""
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr ""
+
+#: builtin/read-tree.c:108
+#, fuzzy
+msgid "write resulting index to <file>"
+msgstr "损坏的索引文件"
+
+#: builtin/read-tree.c:111
+#, fuzzy
+msgid "only empty the index"
+msgstr "不能读取索引"
+
+#: builtin/read-tree.c:113
+#, fuzzy
+msgid "Merging"
+msgstr "合并:"
+
+#: builtin/read-tree.c:115
+msgid "perform a merge in addition to a read"
+msgstr ""
+
+#: builtin/read-tree.c:117
+msgid "3-way merge if no file level merging required"
+msgstr ""
+
+#: builtin/read-tree.c:119
+msgid "3-way merge in presence of adds and removes"
+msgstr ""
+
+#: builtin/read-tree.c:121
+msgid "same as -m, but discard unmerged entries"
+msgstr ""
+
+#: builtin/read-tree.c:122
+#, fuzzy
+msgid "<subdirectory>/"
+msgstr "目录/文件"
+
+#: builtin/read-tree.c:123
+msgid "read the tree into the index under <subdirectory>/"
+msgstr ""
+
+#: builtin/read-tree.c:126
+msgid "update working tree with merge result"
+msgstr ""
+
+#: builtin/read-tree.c:128
+#, fuzzy
+msgid "gitignore"
+msgstr "忽略的"
+
+#: builtin/read-tree.c:129
+msgid "allow explicitly ignored files to be overwritten"
+msgstr ""
+
+#: builtin/read-tree.c:132
+#, fuzzy
+msgid "don't check the working tree after merging"
+msgstr "显示工作区状态"
+
+#: builtin/read-tree.c:133
+msgid "don't update the index or the work tree"
+msgstr ""
+
+#: builtin/read-tree.c:135
+msgid "skip applying sparse checkout filter"
+msgstr ""
+
+#: builtin/read-tree.c:137
+msgid "debug unpack-trees"
+msgstr ""
+
+#: builtin/remote.c:11
+msgid "git remote [-v | --verbose]"
+msgstr ""
+
+#: builtin/remote.c:12
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:13 builtin/remote.c:32
+msgid "git remote rename <old> <new>"
+msgstr ""
+
+#: builtin/remote.c:14 builtin/remote.c:37
+msgid "git remote remove <name>"
+msgstr ""
+
+#: builtin/remote.c:15
+msgid "git remote set-head <name> (-a | -d | <branch>)"
+msgstr ""
+
+#: builtin/remote.c:16
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr ""
+
+#: builtin/remote.c:17
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr ""
+
+#: builtin/remote.c:18
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+
+#: builtin/remote.c:19
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:20 builtin/remote.c:68
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr ""
+
+#: builtin/remote.c:21 builtin/remote.c:69
+msgid "git remote set-url --add <name> <newurl>"
+msgstr ""
+
+#: builtin/remote.c:22 builtin/remote.c:70
+msgid "git remote set-url --delete <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:27
+msgid "git remote add [<options>] <name> <url>"
+msgstr ""
+
+#: builtin/remote.c:42
+msgid "git remote set-head <name> (-a | -d | <branch>])"
+msgstr ""
+
+#: builtin/remote.c:47
+msgid "git remote set-branches <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:48
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr ""
+
+#: builtin/remote.c:53
+msgid "git remote show [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:58
+msgid "git remote prune [<options>] <name>"
+msgstr ""
+
+#: builtin/remote.c:63
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr ""
+
 #: builtin/remote.c:98
 #, c-format
 msgid "Updating %s"
@@ -4460,6 +7272,36 @@
 msgid "unknown mirror argument: %s"
 msgstr "未知的镜像参数:%s"
 
+#: builtin/remote.c:163
+#, fuzzy
+msgid "fetch the remote branches"
+msgstr "  远程分支:%s"
+
+#: builtin/remote.c:165
+msgid "import all tags and associated objects when fetching"
+msgstr ""
+
+#: builtin/remote.c:168
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr ""
+
+#: builtin/remote.c:170
+msgid "branch(es) to track"
+msgstr ""
+
+#: builtin/remote.c:171
+#, fuzzy
+msgid "master branch"
+msgstr "  远程分支:%s"
+
+#: builtin/remote.c:172
+msgid "push|fetch"
+msgstr ""
+
+#: builtin/remote.c:173
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr ""
+
 #: builtin/remote.c:185
 msgid "specifying a master branch makes no sense with --mirror"
 msgstr "指定一个 master 分支并使用 --mirror 选项没有意义"
@@ -4652,6 +7494,11 @@
 msgid "    %-*s pushes to %s"
 msgstr "    %-*s 推送至 %s"
 
+#: builtin/remote.c:1091
+#, fuzzy
+msgid "do not query remotes"
+msgstr "不会删除 %s\n"
+
 #: builtin/remote.c:1118
 #, c-format
 msgid "* remote %s"
@@ -4711,6 +7558,14 @@
 msgstr[0] "  为 'git push' 配置的本地引用%s:"
 msgstr[1] "  为 'git push' 配置的本地引用%s:"
 
+#: builtin/remote.c:1199
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr ""
+
+#: builtin/remote.c:1201
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr ""
+
 #: builtin/remote.c:1216
 msgid "Cannot determine remote HEAD"
 msgstr "无法确定远程 HEAD"
@@ -4766,15 +7621,37 @@
 msgid " * [pruned] %s"
 msgstr " * [已删除] %s"
 
+#: builtin/remote.c:1321
+msgid "prune remotes after fetching"
+msgstr ""
+
 #: builtin/remote.c:1387 builtin/remote.c:1461
 #, c-format
 msgid "No such remote '%s'"
 msgstr "没有此远程 '%s'"
 
+#: builtin/remote.c:1407
+#, fuzzy
+msgid "add branch"
+msgstr "位于分支 "
+
 #: builtin/remote.c:1414
 msgid "no remote specified"
 msgstr "未指定远程"
 
+#: builtin/remote.c:1436
+msgid "manipulate push URLs"
+msgstr ""
+
+#: builtin/remote.c:1438
+msgid "add URL"
+msgstr ""
+
+#: builtin/remote.c:1440
+#, fuzzy
+msgid "delete URLs"
+msgstr "删除"
+
 #: builtin/remote.c:1447
 msgid "--add --delete doesn't make sense"
 msgstr "--add --delete 无意义"
@@ -4793,6 +7670,56 @@
 msgid "Will not delete all non-push URLs"
 msgstr "将不会删除所有非推送URL地址"
 
+#: builtin/remote.c:1569
+msgid "be verbose; must be placed before a subcommand"
+msgstr ""
+
+#: builtin/replace.c:17
+msgid "git replace [-f] <object> <replacement>"
+msgstr ""
+
+#: builtin/replace.c:18
+msgid "git replace -d <object>..."
+msgstr ""
+
+#: builtin/replace.c:19
+msgid "git replace -l [<pattern>]"
+msgstr ""
+
+#: builtin/replace.c:118
+msgid "list replace refs"
+msgstr ""
+
+#: builtin/replace.c:119
+msgid "delete replace refs"
+msgstr ""
+
+#: builtin/replace.c:120
+msgid "replace the ref if it exists"
+msgstr ""
+
+#: builtin/rerere.c:11
+msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
+msgstr ""
+
+#: builtin/rerere.c:56
+#, fuzzy
+msgid "register clean resolutions in index"
+msgstr "%s:已经存在于索引中"
+
+#: builtin/reset.c:25
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr ""
+
+#: builtin/reset.c:26
+msgid "git reset [-q] <commit> [--] <paths>..."
+msgstr ""
+
+#: builtin/reset.c:27
+msgid "git reset --patch [<commit>] [--] [<paths>...]"
+msgstr ""
+
 #: builtin/reset.c:33
 msgid "mixed"
 msgstr "混杂"
@@ -4849,6 +7776,26 @@
 msgid "Cannot do a %s reset in the middle of a merge."
 msgstr "在合并过程中不能做%s重置操作。"
 
+#: builtin/reset.c:238
+msgid "be quiet, only report errors"
+msgstr ""
+
+#: builtin/reset.c:240
+msgid "reset HEAD and index"
+msgstr ""
+
+#: builtin/reset.c:241
+msgid "reset only HEAD"
+msgstr ""
+
+#: builtin/reset.c:243 builtin/reset.c:245
+msgid "reset HEAD, index and working tree"
+msgstr ""
+
+#: builtin/reset.c:247
+msgid "reset HEAD but keep local changes"
+msgstr ""
+
 #: builtin/reset.c:303
 #, c-format
 msgid "Could not parse object '%s'."
@@ -4879,23 +7826,132 @@
 msgid "Could not reset index file to revision '%s'."
 msgstr "不能重置索引文件至版本 '%s'。"
 
+#: builtin/rev-parse.c:339
+#, fuzzy
+msgid "git rev-parse --parseopt [options] -- [<args>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/rev-parse.c:344
+msgid "keep the `--` passed as an arg"
+msgstr ""
+
+#: builtin/rev-parse.c:346
+msgid "stop parsing after the first non-option argument"
+msgstr ""
+
+#: builtin/rev-parse.c:464
+msgid ""
+"git rev-parse --parseopt [options] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [options] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+
+#: builtin/revert.c:22
+msgid "git revert [options] <commit-ish>"
+msgstr ""
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr ""
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [options] <commit-ish>"
+msgstr ""
+
+#: builtin/revert.c:29
+#, fuzzy
+msgid "git cherry-pick <subcommand>"
+msgstr "拣选失败"
+
 #: builtin/revert.c:70 builtin/revert.c:92
 #, c-format
 msgid "%s: %s cannot be used with %s"
 msgstr "%s:%s 不能和 %s 同时使用"
 
-#: builtin/revert.c:131
+#: builtin/revert.c:103
+msgid "end revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:104
+msgid "resume revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:105
+msgid "cancel revert or cherry-pick sequence"
+msgstr ""
+
+#: builtin/revert.c:106
+#, fuzzy
+msgid "don't automatically commit"
+msgstr "不能作为初始提交还原"
+
+#: builtin/revert.c:107
+#, fuzzy
+msgid "edit the commit message"
+msgstr "空提交信息。"
+
+#: builtin/revert.c:110
+msgid "parent number"
+msgstr ""
+
+#: builtin/revert.c:112
+#, fuzzy
+msgid "merge strategy"
+msgstr "尝试合并策略 %s...\n"
+
+#: builtin/revert.c:113
+#, fuzzy
+msgid "option"
+msgstr "动作"
+
+#: builtin/revert.c:114
+#, fuzzy
+msgid "option for merge strategy"
+msgstr "尝试合并策略 %s...\n"
+
+#: builtin/revert.c:125
+msgid "append commit name"
+msgstr ""
+
+#: builtin/revert.c:126
+#, fuzzy
+msgid "allow fast-forward"
+msgstr "(非快进式)"
+
+#: builtin/revert.c:127
+#, fuzzy
+msgid "preserve initially empty commits"
+msgstr "不能作为初始提交还原"
+
+#: builtin/revert.c:128
+#, fuzzy
+msgid "allow commits with empty messages"
+msgstr "提交说明为空"
+
+#: builtin/revert.c:129
+#, fuzzy
+msgid "keep redundant, empty commits"
+msgstr "合并未返回提交"
+
+#: builtin/revert.c:133
 msgid "program error"
 msgstr "程序错误"
 
-#: builtin/revert.c:221
+#: builtin/revert.c:223
 msgid "revert failed"
 msgstr "还原失败"
 
-#: builtin/revert.c:236
+#: builtin/revert.c:238
 msgid "cherry-pick failed"
 msgstr "拣选失败"
 
+#: builtin/rm.c:14
+#, fuzzy
+msgid "git rm [options] [--] <file>..."
+msgstr "git apply [选项] [<补丁>...]"
+
 #: builtin/rm.c:109
 #, c-format
 msgid ""
@@ -4923,6 +7979,28 @@
 "'%s' 有本地修改\n"
 "(使用 --cached 保存文件,或用 -f 强制删除)"
 
+#: builtin/rm.c:134
+#, fuzzy
+msgid "do not list removed files"
+msgstr "无法还原修改的文件"
+
+#: builtin/rm.c:135
+#, fuzzy
+msgid "only remove from the index"
+msgstr "不能从索引中移除 %s"
+
+#: builtin/rm.c:136
+msgid "override the up-to-date check"
+msgstr ""
+
+#: builtin/rm.c:137
+msgid "allow recursive removal"
+msgstr ""
+
+#: builtin/rm.c:139
+msgid "exit with a zero status even if nothing matched"
+msgstr ""
+
 #: builtin/rm.c:194
 #, c-format
 msgid "not removing '%s' recursively without -r"
@@ -4933,11 +8011,199 @@
 msgid "git rm: unable to remove %s"
 msgstr "git rm:不能删除 %s"
 
+#: builtin/shortlog.c:13
+msgid "git shortlog [-n] [-s] [-e] [-w] [rev-opts] [--] [<commit-id>... ]"
+msgstr ""
+
 #: builtin/shortlog.c:157
 #, c-format
 msgid "Missing author: %s"
 msgstr "缺少作者:%s"
 
+#: builtin/shortlog.c:253
+msgid "sort output according to the number of commits per author"
+msgstr ""
+
+#: builtin/shortlog.c:255
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr ""
+
+#: builtin/shortlog.c:257
+msgid "Show the email address of each author"
+msgstr ""
+
+#: builtin/shortlog.c:258
+msgid "w[,i1[,i2]]"
+msgstr ""
+
+#: builtin/shortlog.c:259
+msgid "Linewrap output"
+msgstr ""
+
+#: builtin/show-branch.c:9
+msgid ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
+"<glob>)...]"
+msgstr ""
+
+#: builtin/show-branch.c:10
+msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr ""
+
+#: builtin/show-branch.c:651
+#, fuzzy
+msgid "show remote-tracking and local branches"
+msgstr "%s 没有来自 %s 的远程跟踪分支"
+
+#: builtin/show-branch.c:653
+#, fuzzy
+msgid "show remote-tracking branches"
+msgstr "%s 没有来自 %s 的远程跟踪分支"
+
+#: builtin/show-branch.c:655
+msgid "color '*!+-' corresponding to the branch"
+msgstr ""
+
+#: builtin/show-branch.c:657
+msgid "show <n> more commits after the common ancestor"
+msgstr ""
+
+#: builtin/show-branch.c:659
+msgid "synonym to more=-1"
+msgstr ""
+
+#: builtin/show-branch.c:660
+msgid "suppress naming strings"
+msgstr ""
+
+#: builtin/show-branch.c:662
+#, fuzzy
+msgid "include the current branch"
+msgstr "没有当前分支。"
+
+#: builtin/show-branch.c:664
+#, fuzzy
+msgid "name commits with their object names"
+msgstr "不能写注解对象"
+
+#: builtin/show-branch.c:666
+msgid "show possible merge bases"
+msgstr ""
+
+#: builtin/show-branch.c:668
+msgid "show refs unreachable from any other ref"
+msgstr ""
+
+#: builtin/show-branch.c:670
+msgid "show commits in topological order"
+msgstr ""
+
+#: builtin/show-branch.c:672
+msgid "show only commits not on the first branch"
+msgstr ""
+
+#: builtin/show-branch.c:674
+msgid "show merges reachable from only one tip"
+msgstr ""
+
+#: builtin/show-branch.c:676
+msgid "show commits where no parent comes before its children"
+msgstr ""
+
+#: builtin/show-branch.c:678
+msgid "<n>[,<base>]"
+msgstr ""
+
+#: builtin/show-branch.c:679
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr ""
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+msgstr ""
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=pattern] < ref-list"
+msgstr ""
+
+#: builtin/show-ref.c:182
+#, fuzzy
+msgid "only show tags (can be combined with heads)"
+msgstr "--all 不能和引用表达式同时使用"
+
+#: builtin/show-ref.c:183
+#, fuzzy
+msgid "only show heads (can be combined with tags)"
+msgstr "--all 不能和引用表达式同时使用"
+
+#: builtin/show-ref.c:184
+msgid "stricter reference checking, requires exact ref path"
+msgstr ""
+
+#: builtin/show-ref.c:187 builtin/show-ref.c:189
+msgid "show the HEAD reference"
+msgstr ""
+
+#: builtin/show-ref.c:191
+#, fuzzy
+msgid "dereference tags into object IDs"
+msgstr "引用不是一个树:%s"
+
+#: builtin/show-ref.c:193
+msgid "only show SHA1 hash using <n> digits"
+msgstr ""
+
+#: builtin/show-ref.c:197
+msgid "do not print results to stdout (useful with --verify)"
+msgstr ""
+
+#: builtin/show-ref.c:199
+msgid "show refs from stdin that aren't in local repository"
+msgstr ""
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [options] name [ref]"
+msgstr ""
+
+#: builtin/symbolic-ref.c:38
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr ""
+
+#: builtin/symbolic-ref.c:39
+msgid "shorten ref output"
+msgstr ""
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason"
+msgstr ""
+
+#: builtin/symbolic-ref.c:40 builtin/update-ref.c:18
+msgid "reason of the update"
+msgstr ""
+
+#: builtin/tag.c:22
+msgid ""
+"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"
+msgstr ""
+
+#: builtin/tag.c:23
+msgid "git tag -d <tagname>..."
+msgstr ""
+
+#: builtin/tag.c:24
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
+"\t\t[<pattern>...]"
+msgstr ""
+
+#: builtin/tag.c:26
+msgid "git tag -v <tagname>..."
+msgstr ""
+
 #: builtin/tag.c:60
 #, c-format
 msgid "malformed object at '%s'"
@@ -5026,6 +8292,66 @@
 msgid "malformed object name '%s'"
 msgstr "非法的对象名 '%s'"
 
+#: builtin/tag.c:447
+msgid "list tag names"
+msgstr ""
+
+#: builtin/tag.c:449
+msgid "print <n> lines of each tag message"
+msgstr ""
+
+#: builtin/tag.c:451
+#, fuzzy
+msgid "delete tags"
+msgstr "删除"
+
+#: builtin/tag.c:452
+msgid "verify tags"
+msgstr ""
+
+#: builtin/tag.c:454
+msgid "Tag creation options"
+msgstr ""
+
+#: builtin/tag.c:456
+#, fuzzy
+msgid "annotated tag, needs a message"
+msgstr "注释 tag %s 没有嵌入名称"
+
+#: builtin/tag.c:458
+#, fuzzy
+msgid "tag message"
+msgstr "无 tag 说明?"
+
+#: builtin/tag.c:460
+msgid "annotated and GPG-signed tag"
+msgstr ""
+
+#: builtin/tag.c:464
+#, fuzzy
+msgid "use another key to sign the tag"
+msgstr "无法签署 tag"
+
+#: builtin/tag.c:465
+msgid "replace the tag if exists"
+msgstr ""
+
+#: builtin/tag.c:466
+msgid "show tag list in columns"
+msgstr ""
+
+#: builtin/tag.c:468
+msgid "Tag listing options"
+msgstr ""
+
+#: builtin/tag.c:471
+msgid "print only tags that contain the commit"
+msgstr ""
+
+#: builtin/tag.c:477
+msgid "print only tags of the object"
+msgstr ""
+
 #: builtin/tag.c:506
 msgid "--column and -n are incompatible"
 msgstr "--column 和 -n 不兼容"
@@ -5075,26 +8401,188 @@
 msgid "Updated tag '%s' (was %s)\n"
 msgstr "已更新tag '%s'(曾为 %s)\n"
 
+#: builtin/update-index.c:401
+#, fuzzy
+msgid "git update-index [options] [--] [<file>...]"
+msgstr "git apply [选项] [<补丁>...]"
+
+#: builtin/update-index.c:717
+msgid "continue refresh even when index needs update"
+msgstr ""
+
+#: builtin/update-index.c:720
+msgid "refresh: ignore submodules"
+msgstr ""
+
+#: builtin/update-index.c:723
+#, fuzzy
+msgid "do not ignore new files"
+msgstr "无法存储索引文件"
+
+#: builtin/update-index.c:725
+msgid "let files replace directories and vice-versa"
+msgstr ""
+
+#: builtin/update-index.c:727
+msgid "notice files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:729
+msgid "refresh even if index contains unmerged entries"
+msgstr ""
+
+#: builtin/update-index.c:732
+msgid "refresh stat information"
+msgstr ""
+
+#: builtin/update-index.c:736
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr ""
+
+#: builtin/update-index.c:740
+msgid "<mode> <object> <path>"
+msgstr ""
+
+#: builtin/update-index.c:741
+#, fuzzy
+msgid "add the specified entry to the index"
+msgstr "添加文件内容至索引"
+
+#: builtin/update-index.c:745
+msgid "(+/-)x"
+msgstr ""
+
+#: builtin/update-index.c:746
+msgid "override the executable bit of the listed files"
+msgstr ""
+
+#: builtin/update-index.c:750
+msgid "mark files as \"not changing\""
+msgstr ""
+
+#: builtin/update-index.c:753
+msgid "clear assumed-unchanged bit"
+msgstr ""
+
+#: builtin/update-index.c:756
+msgid "mark files as \"index-only\""
+msgstr ""
+
+#: builtin/update-index.c:759
+msgid "clear skip-worktree bit"
+msgstr ""
+
+#: builtin/update-index.c:762
+msgid "add to index only; do not add content to object database"
+msgstr ""
+
+#: builtin/update-index.c:764
+msgid "remove named paths even if present in worktree"
+msgstr ""
+
+#: builtin/update-index.c:766
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr ""
+
+#: builtin/update-index.c:768
+#, fuzzy
+msgid "read list of paths to be updated from standard input"
+msgstr "(正从标准输入中读取日志信息)\n"
+
+#: builtin/update-index.c:772
+#, fuzzy
+msgid "add entries from standard input to the index"
+msgstr "不能从标准输入中读取日志信息"
+
+#: builtin/update-index.c:776
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr ""
+
+#: builtin/update-index.c:780
+msgid "only update entries that differ from HEAD"
+msgstr ""
+
+#: builtin/update-index.c:784
+msgid "ignore files missing from worktree"
+msgstr ""
+
+#: builtin/update-index.c:787
+msgid "report actions to standard output"
+msgstr ""
+
+#: builtin/update-index.c:789
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr ""
+
+#: builtin/update-index.c:793
+msgid "write index in this format"
+msgstr ""
+
+#: builtin/update-ref.c:7
+msgid "git update-ref [options] -d <refname> [<oldval>]"
+msgstr ""
+
+#: builtin/update-ref.c:8
+msgid "git update-ref [options]    <refname> <newval> [<oldval>]"
+msgstr ""
+
+#: builtin/update-ref.c:19
+msgid "delete the reference"
+msgstr ""
+
+#: builtin/update-ref.c:21
+msgid "update <refname> not the one it points to"
+msgstr ""
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr ""
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr ""
+
+#: builtin/verify-pack.c:56
+msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
+msgstr ""
+
+#: builtin/verify-pack.c:66
+#, fuzzy
+msgid "verbose"
+msgstr "冗长输出"
+
+#: builtin/verify-pack.c:68
+msgid "show statistics only"
+msgstr ""
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v|--verbose] <tag>..."
+msgstr ""
+
+#: builtin/verify-tag.c:73
+msgid "print tag contents"
+msgstr ""
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr ""
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr ""
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr ""
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr ""
+
 #: git.c:16
 msgid "See 'git help <command>' for more information on a specific command."
 msgstr "参见 'git help <command>' 以获得该特定命令的详细信息。"
 
-#: parse-options.h:133 parse-options.h:235
-msgid "n"
-msgstr "数字"
-
-#: parse-options.h:141
-msgid "time"
-msgstr "时间"
-
-#: parse-options.h:149
-msgid "file"
-msgstr "文件"
-
-#: parse-options.h:151
-msgid "when"
-msgstr "何时"
-
 #: parse-options.h:156
 msgid "no-op (backward compatibility)"
 msgstr "空操作(向后兼容)"
@@ -5344,6 +8832,13 @@
 msgid "Patch failed at $msgnum $FIRSTLINE"
 msgstr "补丁失败于 $msgnum $FIRSTLINE"
 
+#: git-am.sh:858
+#, sh-format
+msgid ""
+"The copy of the patch that failed is found in:\n"
+"   $dotest/patch"
+msgstr ""
+
 #: git-am.sh:876
 msgid "applying to an empty history"
 msgstr "正应用到一个空历史上"
@@ -5769,25 +9264,25 @@
 msgid "Cannot unstage modified files"
 msgstr "无法还原修改的文件"
 
-#: git-stash.sh:474
+#: git-stash.sh:475
 msgid "Index was not unstashed."
 msgstr "索引的进度没有被恢复。"
 
-#: git-stash.sh:491
+#: git-stash.sh:492
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "丢弃了 ${REV} ($s)"
 
-#: git-stash.sh:492
+#: git-stash.sh:493
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}:不能丢弃进度条目"
 
-#: git-stash.sh:499
+#: git-stash.sh:500
 msgid "No branch name specified"
 msgstr "未指定分支名"
 
-#: git-stash.sh:570
+#: git-stash.sh:571
 msgid "(To restore them type \"git stash apply\")"
 msgstr "(为恢复数据输入 \"git stash apply\")"
 
@@ -5796,32 +9291,32 @@
 msgid "cannot strip one component off url '$remoteurl'"
 msgstr "无法从 url '$remoteurl' 剥离一个组件"
 
-#: git-submodule.sh:145
+#: git-submodule.sh:167
 #, sh-format
 msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
 msgstr "未在 .gitmodules 中发现路径 '$sm_path' 的子模组映射"
 
-#: git-submodule.sh:189
+#: git-submodule.sh:211
 #, sh-format
 msgid "Clone of '$url' into submodule path '$sm_path' failed"
 msgstr "无法克隆 '$url' 到子模组路径 '$sm_path'"
 
-#: git-submodule.sh:201
+#: git-submodule.sh:223
 #, sh-format
 msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
 msgstr "Gitdir '$a' 在子模组路径 '$b' 之下或者相反"
 
-#: git-submodule.sh:290
+#: git-submodule.sh:312
 #, sh-format
 msgid "repo URL: '$repo' must be absolute or begin with ./|../"
 msgstr "版本库URL:'$repo' 必须是绝对路径或以 ./|../ 起始"
 
-#: git-submodule.sh:307
+#: git-submodule.sh:329
 #, sh-format
 msgid "'$sm_path' already exists in the index"
 msgstr "'$sm_path' 已经存在于索引中"
 
-#: git-submodule.sh:311
+#: git-submodule.sh:333
 #, sh-format
 msgid ""
 "The following path is ignored by one of your .gitignore files:\n"
@@ -5832,62 +9327,62 @@
 "$sm_path\n"
 "如果您确实想添加它,使用 -f 参数。"
 
-#: git-submodule.sh:322
+#: git-submodule.sh:344
 #, sh-format
 msgid "Adding existing repo at '$sm_path' to the index"
 msgstr "添加位于 '$sm_path' 的现存版本库到索引"
 
-#: git-submodule.sh:324
+#: git-submodule.sh:346
 #, sh-format
 msgid "'$sm_path' already exists and is not a valid git repo"
 msgstr "'$sm_path' 已存在且不是一个有效的 git 版本库"
 
-#: git-submodule.sh:338
+#: git-submodule.sh:360
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "不能检出子模组 '$sm_path'"
 
-#: git-submodule.sh:343
+#: git-submodule.sh:365
 #, sh-format
 msgid "Failed to add submodule '$sm_path'"
 msgstr "无法添加子模组 '$sm_path'"
 
-#: git-submodule.sh:348
+#: git-submodule.sh:370
 #, sh-format
 msgid "Failed to register submodule '$sm_path'"
 msgstr "无法注册子模组 '$sm_path'"
 
-#: git-submodule.sh:390
+#: git-submodule.sh:413
 #, sh-format
 msgid "Entering '$prefix$sm_path'"
 msgstr "正在进入 '$prefix$sm_path'"
 
-#: git-submodule.sh:404
+#: git-submodule.sh:427
 #, sh-format
 msgid "Stopping at '$sm_path'; script returned non-zero status."
 msgstr "停止于 '$sm_path',脚本返回非零值。"
 
-#: git-submodule.sh:447
+#: git-submodule.sh:471
 #, sh-format
 msgid "No url found for submodule path '$sm_path' in .gitmodules"
 msgstr "在 .gitmodules 中未找到子模组路径 '$sm_path' 的 url"
 
-#: git-submodule.sh:456
+#: git-submodule.sh:480
 #, sh-format
 msgid "Failed to register url for submodule path '$sm_path'"
 msgstr "无法为子模组路径 '$sm_path' 注册 url"
 
-#: git-submodule.sh:458
+#: git-submodule.sh:482
 #, sh-format
 msgid "Submodule '$name' ($url) registered for path '$sm_path'"
 msgstr "子模组 '$name' ($url) 已为路径 '$sm_path' 注册"
 
-#: git-submodule.sh:466
+#: git-submodule.sh:490
 #, sh-format
 msgid "Failed to register update mode for submodule path '$sm_path'"
 msgstr "无法为子模组路径 '$sm_path' 注册更新模式"
 
-#: git-submodule.sh:565
+#: git-submodule.sh:590
 #, sh-format
 msgid ""
 "Submodule path '$sm_path' not initialized\n"
@@ -5896,92 +9391,130 @@
 "子模组路径 '$sm_path' 没有初始化\n"
 "也许您想用 'update --init'?"
 
-#: git-submodule.sh:578
+#: git-submodule.sh:603
 #, sh-format
 msgid "Unable to find current revision in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中找到当前版本"
 
-#: git-submodule.sh:597
+#: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中获取"
 
-#: git-submodule.sh:611
+#: git-submodule.sh:636
 #, sh-format
 msgid "Unable to rebase '$sha1' in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中变基 '$sha1'"
 
-#: git-submodule.sh:612
+#: git-submodule.sh:637
 #, sh-format
 msgid "Submodule path '$sm_path': rebased into '$sha1'"
 msgstr "子模组路径 '$sm_path':变基至 '$sha1'"
 
-#: git-submodule.sh:617
+#: git-submodule.sh:642
 #, sh-format
 msgid "Unable to merge '$sha1' in submodule path '$sm_path'"
 msgstr "无法合并 '$sha1' 到子模组路径 '$sm_path' 中"
 
-#: git-submodule.sh:618
+#: git-submodule.sh:643
 #, sh-format
 msgid "Submodule path '$sm_path': merged in '$sha1'"
 msgstr "子模组路径 '$sm_path':已合并入 '$sha1'"
 
-#: git-submodule.sh:623
+#: git-submodule.sh:648
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$sm_path'"
 msgstr "无法在子模组路径 '$sm_path' 中检出 '$sha1'"
 
-#: git-submodule.sh:624
+#: git-submodule.sh:649
 #, sh-format
 msgid "Submodule path '$sm_path': checked out '$sha1'"
 msgstr "子模组路径 '$sm_path':检出 '$sha1'"
 
-#: git-submodule.sh:646 git-submodule.sh:969
+#: git-submodule.sh:671 git-submodule.sh:995
 #, sh-format
 msgid "Failed to recurse into submodule path '$sm_path'"
 msgstr "无法递归进子模组路径 '$sm_path'"
 
-#: git-submodule.sh:754
+#: git-submodule.sh:779
 msgid "The --cached option cannot be used with the --files option"
 msgstr "选项 --cached 不能和选项 --files 同时使用"
 
 #. unexpected type
-#: git-submodule.sh:794
+#: git-submodule.sh:819
 #, sh-format
 msgid "unexpected mode $mod_dst"
 msgstr "意外的模式 $mod_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:812
+#: git-submodule.sh:837
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_src"
 msgstr "  警告:$name 未包含提交 $sha1_src"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:815
+#: git-submodule.sh:840
 #, sh-format
 msgid "  Warn: $name doesn't contain commit $sha1_dst"
 msgstr "  警告:$name 未包含提交 $sha1_dst"
 
 #  译者:注意保持前导空格
-#: git-submodule.sh:818
+#: git-submodule.sh:843
 #, sh-format
 msgid "  Warn: $name doesn't contain commits $sha1_src and $sha1_dst"
 msgstr "  警告:$name 未包含提交 $sha1_src 和 $sha1_dst"
 
-#: git-submodule.sh:843
+#: git-submodule.sh:868
 msgid "blob"
 msgstr "二进制对象"
 
-#: git-submodule.sh:881
+#: git-submodule.sh:906
 msgid "# Submodules changed but not updated:"
 msgstr "# 子模组已修改但尚未更新:"
 
-#: git-submodule.sh:883
+#: git-submodule.sh:908
 msgid "# Submodule changes to be committed:"
 msgstr "要提交的子模组变更:"
 
-#: git-submodule.sh:1027
+#: git-submodule.sh:1054
 #, sh-format
 msgid "Synchronizing submodule url for '$name'"
 msgstr "为 '$name' 同步子模组 url"
+
+#  译者:中文字符串拼接,可删除前导空格
+#~ msgid " (use \"git add\" to track)"
+#~ msgstr "(使用 \"git add\" 建立跟踪)"
+
+#~ msgid "-B cannot be used with -b"
+#~ msgstr "-B 不能和 -b 同时使用"
+
+#~ msgid "--patch is incompatible with all other options"
+#~ msgstr "--patch 选项和其他选项不兼容"
+
+#~ msgid "--detach cannot be used with -b/-B/--orphan"
+#~ msgstr "--detach 不能和 -b/-B/--orphan 同时使用"
+
+#~ msgid "--detach cannot be used with -t"
+#~ msgstr "--detach 不能和 -t 同时使用"
+
+#~ msgid "--orphan and -b|-B are mutually exclusive"
+#~ msgstr "--orphan 和 -b|-B 互斥"
+
+#~ msgid "--orphan cannot be used with -t"
+#~ msgstr "--orphan 不能和 -t 同时使用"
+
+#~ msgid "git checkout: -f and -m are incompatible"
+#~ msgstr "git checkout:-f 和 -m 不兼容"
+
+#~ msgid ""
+#~ "git checkout: updating paths is incompatible with switching branches."
+#~ msgstr "git checkout:更新路径和切换分支不兼容。"
+
+#~ msgid "diff setup failed"
+#~ msgstr "diff 设置失败"
+
+#~ msgid "merge-recursive: disk full?"
+#~ msgstr "merge-recursive:磁盘已满?"
+
+#~ msgid "diff_setup_done failed"
+#~ msgstr "diff_setup_done 失败"
diff --git a/read-cache.c b/read-cache.c
index 79e3bbe..fda78bc 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -424,7 +424,7 @@
 	return cache_name_stage_compare(name1, len1, 0, name2, len2, 0);
 }
 
-int index_name_stage_pos(const struct index_state *istate, const char *name, int namelen, int stage)
+static int index_name_stage_pos(const struct index_state *istate, const char *name, int namelen, int stage)
 {
 	int first, last;
 
diff --git a/remote-curl.c b/remote-curl.c
index 3ec474f..10fa8f1 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -95,15 +95,16 @@
 	struct strbuf buffer = STRBUF_INIT;
 	struct discovery *last = last_discovery;
 	char *refs_url;
-	int http_ret, is_http = 0, proto_git_candidate = 1;
+	int http_ret, maybe_smart = 0;
 
 	if (last && !strcmp(service, last->service))
 		return last;
 	free_discovery(last);
 
 	strbuf_addf(&buffer, "%sinfo/refs", url);
-	if (!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) {
-		is_http = 1;
+	if ((!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) &&
+	     git_env_bool("GIT_SMART_HTTP", 1)) {
+		maybe_smart = 1;
 		if (!strchr(url, '?'))
 			strbuf_addch(&buffer, '?');
 		else
@@ -113,19 +114,6 @@
 	refs_url = strbuf_detach(&buffer, NULL);
 
 	http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE);
-
-	/* try again with "plain" url (no ? or & appended) */
-	if (http_ret != HTTP_OK && http_ret != HTTP_NOAUTH) {
-		free(refs_url);
-		strbuf_reset(&buffer);
-
-		proto_git_candidate = 0;
-		strbuf_addf(&buffer, "%sinfo/refs", url);
-		refs_url = strbuf_detach(&buffer, NULL);
-
-		http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE);
-	}
-
 	switch (http_ret) {
 	case HTTP_OK:
 		break;
@@ -144,8 +132,7 @@
 	last->buf_alloc = strbuf_detach(&buffer, &last->len);
 	last->buf = last->buf_alloc;
 
-	if (is_http && proto_git_candidate
-		&& 5 <= last->len && last->buf[4] == '#') {
+	if (maybe_smart && 5 <= last->len && last->buf[4] == '#') {
 		/* smart HTTP response; validate that the service
 		 * pkt-line matches our request.
 		 */
@@ -393,7 +380,7 @@
 	curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
 	curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
 	curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
-	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
+	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL);
 	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000");
 	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4);
 	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
@@ -449,7 +436,7 @@
 	curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0);
 	curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
 	curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
-	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
+	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip");
 
 	headers = curl_slist_append(headers, rpc->hdr_content_type);
 	headers = curl_slist_append(headers, rpc->hdr_accept);
diff --git a/rerere.c b/rerere.c
index b57a34d..a6a5cd5 100644
--- a/rerere.c
+++ b/rerere.c
@@ -25,7 +25,7 @@
 	return git_path("rr-cache/%s/%s", hex, file);
 }
 
-int has_rerere_resolution(const char *hex)
+static int has_rerere_resolution(const char *hex)
 {
 	struct stat st;
 	return !stat(rerere_path(hex, "postimage"), &st);
diff --git a/rerere.h b/rerere.h
index fcd8bc1..156d2aa 100644
--- a/rerere.h
+++ b/rerere.h
@@ -16,7 +16,6 @@
 extern int setup_rerere(struct string_list *, int);
 extern int rerere(int);
 extern const char *rerere_path(const char *hex, const char *file);
-extern int has_rerere_resolution(const char *hex);
 extern int rerere_forget(const char **);
 extern int rerere_remaining(struct string_list *);
 extern void rerere_clear(struct string_list *);
diff --git a/revision.c b/revision.c
index dc3fecf..ae12e11 100644
--- a/revision.c
+++ b/revision.c
@@ -1598,6 +1598,8 @@
 	} else if ((argcount = parse_long_opt("grep", argv, &optarg))) {
 		add_message_grep(revs, optarg);
 		return argcount;
+	} else if (!strcmp(arg, "--grep-debug")) {
+		revs->grep_filter.debug = 1;
 	} else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
 		revs->grep_filter.regflags |= REG_EXTENDED;
 	} else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
diff --git a/sequencer.c b/sequencer.c
index bd62680..e3723d2 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -17,7 +17,9 @@
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
-void remove_sequencer_state(void)
+const char sign_off_header[] = "Signed-off-by: ";
+
+static void remove_sequencer_state(void)
 {
 	struct strbuf seq_dir = STRBUF_INIT;
 
@@ -233,6 +235,9 @@
 		die(_("%s: Unable to write new index file"), action_name(opts));
 	rollback_lock_file(&index_lock);
 
+	if (opts->signoff)
+		append_signoff(msgbuf, 0);
+
 	if (!clean) {
 		int i;
 		strbuf_addstr(msgbuf, "\nConflicts:\n");
@@ -311,6 +316,9 @@
 	if (allow_empty)
 		argv_array_push(&array, "--allow-empty");
 
+	if (opts->allow_empty_message)
+		argv_array_push(&array, "--allow-empty-message");
+
 	rc = run_command_v_opt(array.argv, RUN_GIT_CMD);
 	argv_array_clear(&array);
 	return rc;
@@ -1008,3 +1016,63 @@
 	save_opts(opts);
 	return pick_commits(todo_list, opts);
 }
+
+static int ends_rfc2822_footer(struct strbuf *sb, int ignore_footer)
+{
+	int ch;
+	int hit = 0;
+	int i, j, k;
+	int len = sb->len - ignore_footer;
+	int first = 1;
+	const char *buf = sb->buf;
+
+	for (i = len - 1; i > 0; i--) {
+		if (hit && buf[i] == '\n')
+			break;
+		hit = (buf[i] == '\n');
+	}
+
+	while (i < len - 1 && buf[i] == '\n')
+		i++;
+
+	for (; i < len; i = k) {
+		for (k = i; k < len && buf[k] != '\n'; k++)
+			; /* do nothing */
+		k++;
+
+		if ((buf[k] == ' ' || buf[k] == '\t') && !first)
+			continue;
+
+		first = 0;
+
+		for (j = 0; i + j < len; j++) {
+			ch = buf[i + j];
+			if (ch == ':')
+				break;
+			if (isalnum(ch) ||
+			    (ch == '-'))
+				continue;
+			return 0;
+		}
+	}
+	return 1;
+}
+
+void append_signoff(struct strbuf *msgbuf, int ignore_footer)
+{
+	struct strbuf sob = STRBUF_INIT;
+	int i;
+
+	strbuf_addstr(&sob, sign_off_header);
+	strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
+				getenv("GIT_COMMITTER_EMAIL")));
+	strbuf_addch(&sob, '\n');
+	for (i = msgbuf->len - 1 - ignore_footer; i > 0 && msgbuf->buf[i - 1] != '\n'; i--)
+		; /* do nothing */
+	if (prefixcmp(msgbuf->buf + i, sob.buf)) {
+		if (!i || !ends_rfc2822_footer(msgbuf, ignore_footer))
+			strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0, "\n", 1);
+		strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0, sob.buf, sob.len);
+	}
+	strbuf_release(&sob);
+}
diff --git a/sequencer.h b/sequencer.h
index aa5f17c..9d57d57 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -30,6 +30,7 @@
 	int allow_ff;
 	int allow_rerere_auto;
 	int allow_empty;
+	int allow_empty_message;
 	int keep_redundant_commits;
 
 	int mainline;
@@ -43,9 +44,10 @@
 	struct rev_info *revs;
 };
 
-/* Removes SEQ_DIR. */
-extern void remove_sequencer_state(void);
-
 int sequencer_pick_revisions(struct replay_opts *opts);
 
+extern const char sign_off_header[];
+
+void append_signoff(struct strbuf *msgbuf, int ignore_footer);
+
 #endif
diff --git a/sha1-array.c b/sha1-array.c
index b2f47f9..6f4a224 100644
--- a/sha1-array.c
+++ b/sha1-array.c
@@ -14,7 +14,7 @@
 	return hashcmp(a, b);
 }
 
-void sha1_array_sort(struct sha1_array *array)
+static void sha1_array_sort(struct sha1_array *array)
 {
 	qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp);
 	array->sorted = 1;
diff --git a/sha1-array.h b/sha1-array.h
index 4499b5d..72bb33b 100644
--- a/sha1-array.h
+++ b/sha1-array.h
@@ -11,7 +11,6 @@
 #define SHA1_ARRAY_INIT { NULL, 0, 0, 0 }
 
 void sha1_array_append(struct sha1_array *array, const unsigned char *sha1);
-void sha1_array_sort(struct sha1_array *array);
 int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1);
 void sha1_array_clear(struct sha1_array *array);
 
diff --git a/strbuf.c b/strbuf.c
index ec88266..0510f76 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -445,8 +445,8 @@
 		ch == '-' || ch == '_' || ch == '.' || ch == '~';
 }
 
-void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len,
-			  int reserved)
+static void strbuf_add_urlencode(struct strbuf *sb, const char *s, size_t len,
+				 int reserved)
 {
 	strbuf_grow(sb, len);
 	while (len--) {
@@ -465,15 +465,6 @@
 	strbuf_add_urlencode(sb, s, strlen(s), reserved);
 }
 
-void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...)
-{
-	va_list ap;
-	va_start(ap, fmt);
-	strbuf_vaddf(sb, fmt, ap);
-	va_end(ap);
-	strbuf_addch(sb, '\n');
-}
-
 int printf_ln(const char *fmt, ...)
 {
 	int ret;
diff --git a/strbuf.h b/strbuf.h
index b888d40..be941ee 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -99,8 +99,6 @@
 extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
 __attribute__((format (printf,2,0)))
 extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap);
-__attribute__((format (printf,2,3)))
-extern void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...);
 
 extern void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, size_t size);
 
@@ -126,8 +124,6 @@
 extern int strbuf_branchname(struct strbuf *sb, const char *name);
 extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
 
-extern void strbuf_add_urlencode(struct strbuf *, const char *, size_t,
-				 int reserved);
 extern void strbuf_addstr_urlencode(struct strbuf *, const char *,
 				    int reserved);
 
diff --git a/string-list.c b/string-list.c
index d9810ab..c54b816 100644
--- a/string-list.c
+++ b/string-list.c
@@ -92,6 +92,23 @@
 	return list->items + i;
 }
 
+void string_list_remove_duplicates(struct string_list *list, int free_util)
+{
+	if (list->nr > 1) {
+		int src, dst;
+		for (src = dst = 1; src < list->nr; src++) {
+			if (!strcmp(list->items[dst - 1].string, list->items[src].string)) {
+				if (list->strdup_strings)
+					free(list->items[src].string);
+				if (free_util)
+					free(list->items[src].util);
+			} else
+				list->items[dst++] = list->items[src];
+		}
+		list->nr = dst;
+	}
+}
+
 int for_each_string_list(struct string_list *list,
 			 string_list_each_func_t fn, void *cb_data)
 {
@@ -102,6 +119,43 @@
 	return ret;
 }
 
+void filter_string_list(struct string_list *list, int free_util,
+			string_list_each_func_t want, void *cb_data)
+{
+	int src, dst = 0;
+	for (src = 0; src < list->nr; src++) {
+		if (want(&list->items[src], cb_data)) {
+			list->items[dst++] = list->items[src];
+		} else {
+			if (list->strdup_strings)
+				free(list->items[src].string);
+			if (free_util)
+				free(list->items[src].util);
+		}
+	}
+	list->nr = dst;
+}
+
+char *string_list_longest_prefix(const struct string_list *prefixes,
+				 const char *string)
+{
+	int i, max_len = -1;
+	char *retval = NULL;
+
+	for (i = 0; i < prefixes->nr; i++) {
+		char *prefix = prefixes->items[i].string;
+		if (!prefixcmp(string, prefix)) {
+			int len = strlen(prefix);
+			if (len > max_len) {
+				retval = prefix;
+				max_len = len;
+			}
+		}
+	}
+
+	return retval;
+}
+
 void string_list_clear(struct string_list *list, int free_util)
 {
 	if (list->items) {
@@ -148,13 +202,23 @@
 		printf("%s:%p\n", p->items[i].string, p->items[i].util);
 }
 
-struct string_list_item *string_list_append(struct string_list *list, const char *string)
+struct string_list_item *string_list_append_nodup(struct string_list *list,
+						  char *string)
 {
+	struct string_list_item *retval;
 	ALLOC_GROW(list->items, list->nr + 1, list->alloc);
-	list->items[list->nr].string =
-		list->strdup_strings ? xstrdup(string) : (char *)string;
-	list->items[list->nr].util = NULL;
-	return list->items + list->nr++;
+	retval = &list->items[list->nr++];
+	retval->string = string;
+	retval->util = NULL;
+	return retval;
+}
+
+struct string_list_item *string_list_append(struct string_list *list,
+					    const char *string)
+{
+	return string_list_append_nodup(
+			list,
+			list->strdup_strings ? xstrdup(string) : (char *)string);
 }
 
 static int cmp_items(const void *a, const void *b)
@@ -194,3 +258,56 @@
 	list->items[i] = list->items[list->nr-1];
 	list->nr--;
 }
+
+int string_list_split(struct string_list *list, const char *string,
+		      int delim, int maxsplit)
+{
+	int count = 0;
+	const char *p = string, *end;
+
+	if (!list->strdup_strings)
+		die("internal error in string_list_split(): "
+		    "list->strdup_strings must be set");
+	for (;;) {
+		count++;
+		if (maxsplit >= 0 && count > maxsplit) {
+			string_list_append(list, p);
+			return count;
+		}
+		end = strchr(p, delim);
+		if (end) {
+			string_list_append_nodup(list, xmemdupz(p, end - p));
+			p = end + 1;
+		} else {
+			string_list_append(list, p);
+			return count;
+		}
+	}
+}
+
+int string_list_split_in_place(struct string_list *list, char *string,
+			       int delim, int maxsplit)
+{
+	int count = 0;
+	char *p = string, *end;
+
+	if (list->strdup_strings)
+		die("internal error in string_list_split_in_place(): "
+		    "list->strdup_strings must not be set");
+	for (;;) {
+		count++;
+		if (maxsplit >= 0 && count > maxsplit) {
+			string_list_append(list, p);
+			return count;
+		}
+		end = strchr(p, delim);
+		if (end) {
+			*end = '\0';
+			string_list_append(list, p);
+			p = end + 1;
+		} else {
+			string_list_append(list, p);
+			return count;
+		}
+	}
+}
diff --git a/string-list.h b/string-list.h
index 0684cb7..5efd07b 100644
--- a/string-list.h
+++ b/string-list.h
@@ -29,6 +29,24 @@
 #define for_each_string_list_item(item,list) \
 	for (item = (list)->items; item < (list)->items + (list)->nr; ++item)
 
+/*
+ * Apply want to each item in list, retaining only the ones for which
+ * the function returns true.  If free_util is true, call free() on
+ * the util members of any items that have to be deleted.  Preserve
+ * the order of the items that are retained.
+ */
+void filter_string_list(struct string_list *list, int free_util,
+			string_list_each_func_t want, void *cb_data);
+
+/*
+ * Return the longest string in prefixes that is a prefix (in the
+ * sense of prefixcmp()) of string, or NULL if no such prefix exists.
+ * This function does not require the string_list to be sorted (it
+ * does a linear search).
+ */
+char *string_list_longest_prefix(const struct string_list *prefixes, const char *string);
+
+
 /* Use these functions only on sorted lists: */
 int string_list_has_string(const struct string_list *list, const char *string);
 int string_list_find_insert_index(const struct string_list *list, const char *string,
@@ -38,11 +56,64 @@
 						     int insert_at, const char *string);
 struct string_list_item *string_list_lookup(struct string_list *list, const char *string);
 
+/*
+ * Remove all but the first of consecutive entries with the same
+ * string value.  If free_util is true, call free() on the util
+ * members of any items that have to be deleted.
+ */
+void string_list_remove_duplicates(struct string_list *sorted_list, int free_util);
+
+
 /* Use these functions only on unsorted lists: */
+
+/*
+ * Add string to the end of list.  If list->strdup_string is set, then
+ * string is copied; otherwise the new string_list_entry refers to the
+ * input string.
+ */
 struct string_list_item *string_list_append(struct string_list *list, const char *string);
+
+/*
+ * Like string_list_append(), except string is never copied.  When
+ * list->strdup_strings is set, this function can be used to hand
+ * ownership of a malloc()ed string to list without making an extra
+ * copy.
+ */
+struct string_list_item *string_list_append_nodup(struct string_list *list, char *string);
+
 void sort_string_list(struct string_list *list);
 int unsorted_string_list_has_string(struct string_list *list, const char *string);
 struct string_list_item *unsorted_string_list_lookup(struct string_list *list,
 						     const char *string);
+
 void unsorted_string_list_delete_item(struct string_list *list, int i, int free_util);
+
+/*
+ * Split string into substrings on character delim and append the
+ * substrings to list.  The input string is not modified.
+ * list->strdup_strings must be set, as new memory needs to be
+ * allocated to hold the substrings.  If maxsplit is non-negative,
+ * then split at most maxsplit times.  Return the number of substrings
+ * appended to list.
+ *
+ * Examples:
+ *   string_list_split(l, "foo:bar:baz", ':', -1) -> ["foo", "bar", "baz"]
+ *   string_list_split(l, "foo:bar:baz", ':', 0) -> ["foo:bar:baz"]
+ *   string_list_split(l, "foo:bar:baz", ':', 1) -> ["foo", "bar:baz"]
+ *   string_list_split(l, "foo:bar:", ':', -1) -> ["foo", "bar", ""]
+ *   string_list_split(l, "", ':', -1) -> [""]
+ *   string_list_split(l, ":", ':', -1) -> ["", ""]
+ */
+int string_list_split(struct string_list *list, const char *string,
+		      int delim, int maxsplit);
+
+/*
+ * Like string_list_split(), except that string is split in-place: the
+ * delimiter characters in string are overwritten with NULs, and the
+ * new string_list_items point into string (which therefore must not
+ * be modified or freed while the string_list is in use).
+ * list->strdup_strings must *not* be set.
+ */
+int string_list_split_in_place(struct string_list *list, char *string,
+			       int delim, int maxsplit);
 #endif /* STRING_LIST_H */
diff --git a/submodule.c b/submodule.c
index 51d48c2..50f213e 100644
--- a/submodule.c
+++ b/submodule.c
@@ -789,7 +789,7 @@
 		die("revision walk setup failed");
 	while ((commit = get_revision(&revs)) != NULL) {
 		struct object *o = &(commit->object);
-		if (in_merge_bases(b, &commit, 1))
+		if (in_merge_bases(b, commit))
 			add_object_array(o, NULL, &merges);
 	}
 	reset_revision_walk();
@@ -804,7 +804,7 @@
 		contains_another = 0;
 		for (j = 0; j < merges.nr; j++) {
 			struct commit *m2 = (struct commit *) merges.objects[j].item;
-			if (i != j && in_merge_bases(m2, &m1, 1)) {
+			if (i != j && in_merge_bases(m2, m1)) {
 				contains_another = 1;
 				break;
 			}
@@ -866,18 +866,18 @@
 	}
 
 	/* check whether both changes are forward */
-	if (!in_merge_bases(commit_base, &commit_a, 1) ||
-	    !in_merge_bases(commit_base, &commit_b, 1)) {
+	if (!in_merge_bases(commit_base, commit_a) ||
+	    !in_merge_bases(commit_base, commit_b)) {
 		MERGE_WARNING(path, "commits don't follow merge-base");
 		return 0;
 	}
 
 	/* Case #1: a is contained in b or vice versa */
-	if (in_merge_bases(commit_a, &commit_b, 1)) {
+	if (in_merge_bases(commit_a, commit_b)) {
 		hashcpy(result, b);
 		return 1;
 	}
-	if (in_merge_bases(commit_b, &commit_a, 1)) {
+	if (in_merge_bases(commit_b, commit_a)) {
 		hashcpy(result, a);
 		return 1;
 	}
diff --git a/symlinks.c b/symlinks.c
index 2900367..c2b41a8 100644
--- a/symlinks.c
+++ b/symlinks.c
@@ -1,5 +1,8 @@
 #include "cache.h"
 
+static int threaded_check_leading_path(struct cache_def *cache, const char *name, int len);
+static int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len);
+
 /*
  * Returns the length (on a path component basis) of the longest
  * common prefix match of 'name_a' and 'name_b'.
@@ -231,7 +234,7 @@
  * Return path length if leading path exists and is neither a
  * directory nor a symlink.
  */
-int threaded_check_leading_path(struct cache_def *cache, const char *name, int len)
+static int threaded_check_leading_path(struct cache_def *cache, const char *name, int len)
 {
 	int flags;
 	int match_len = lstat_cache_matchlen(cache, name, len, &flags,
@@ -263,7 +266,7 @@
  * 'prefix_len', thus we then allow for symlinks in the prefix part as
  * long as those points to real existing directories.
  */
-int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len)
+static int threaded_has_dirs_only_path(struct cache_def *cache, const char *name, int len, int prefix_len)
 {
 	return lstat_cache(cache, name, len,
 			   FL_DIR|FL_FULLPATH, prefix_len) &
diff --git a/t/Git-SVN/Utils/add_path_to_url.t b/t/Git-SVN/Utils/add_path_to_url.t
new file mode 100644
index 0000000..bfbd878
--- /dev/null
+++ b/t/Git-SVN/Utils/add_path_to_url.t
@@ -0,0 +1,27 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Git::SVN::Utils qw(
+	add_path_to_url
+);
+
+# A reference cannot be a hash key, so we use an array.
+my @tests = (
+	["http://x.com", "bar"]			=> 'http://x.com/bar',
+	["http://x.com", ""]			=> 'http://x.com',
+	["http://x.com/foo/", undef]		=> 'http://x.com/foo/',
+	["http://x.com/foo/", "/bar/baz/"]	=> 'http://x.com/foo/bar/baz/',
+	["http://x.com", 'per%cent']		=> 'http://x.com/per%25cent',
+);
+
+while(@tests) {
+	my($have, $want) = splice @tests, 0, 2;
+
+	my $args = join ", ", map { qq['$_'] } map { defined($_) ? $_ : 'undef' } @$have;
+	my $name = "add_path_to_url($args) eq $want";
+	is add_path_to_url(@$have), $want, $name;
+}
diff --git a/t/Git-SVN/Utils/canonicalize_url.t b/t/Git-SVN/Utils/canonicalize_url.t
new file mode 100644
index 0000000..05795ab
--- /dev/null
+++ b/t/Git-SVN/Utils/canonicalize_url.t
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+# Test our own home rolled URL canonicalizer.  Test the private one
+# directly because we can't predict what the SVN API is doing to do.
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Git::SVN::Utils;
+my $canonicalize_url = \&Git::SVN::Utils::_canonicalize_url_ourselves;
+
+my %tests = (
+	"http://x.com"			=> "http://x.com",
+	"http://x.com/"			=> "http://x.com",
+	"http://x.com/foo/bar"		=> "http://x.com/foo/bar",
+	"http://x.com//foo//bar//"	=> "http://x.com/foo/bar",
+	"http://x.com/  /%/"		=> "http://x.com/%20%20/%25",
+);
+
+for my $arg (keys %tests) {
+	my $want = $tests{$arg};
+
+	is $canonicalize_url->($arg), $want, "canonicalize_url('$arg') => $want";
+}
diff --git a/t/Git-SVN/Utils/collapse_dotdot.t b/t/Git-SVN/Utils/collapse_dotdot.t
new file mode 100644
index 0000000..1da1cce
--- /dev/null
+++ b/t/Git-SVN/Utils/collapse_dotdot.t
@@ -0,0 +1,23 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Git::SVN::Utils;
+my $collapse_dotdot = \&Git::SVN::Utils::_collapse_dotdot;
+
+my %tests = (
+	"foo/bar/baz"			=> "foo/bar/baz",
+	".."				=> "..",
+	"foo/.."			=> "",
+	"/foo/bar/../../baz"		=> "/baz",
+	"deeply/.././deeply/nested"	=> "./deeply/nested",
+);
+
+for my $arg (keys %tests) {
+	my $want = $tests{$arg};
+
+	is $collapse_dotdot->($arg), $want, "_collapse_dotdot('$arg') => $want";
+}
diff --git a/t/Git-SVN/Utils/join_paths.t b/t/Git-SVN/Utils/join_paths.t
new file mode 100644
index 0000000..d4488e7
--- /dev/null
+++ b/t/Git-SVN/Utils/join_paths.t
@@ -0,0 +1,32 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+
+use Git::SVN::Utils qw(
+	join_paths
+);
+
+# A reference cannot be a hash key, so we use an array.
+my @tests = (
+	[]					=> '',
+	["/x.com", "bar"]			=> '/x.com/bar',
+	["x.com", ""]				=> 'x.com',
+	["/x.com/foo/", undef, "bar"]		=> '/x.com/foo/bar',
+	["x.com/foo/", "/bar/baz/"]		=> 'x.com/foo/bar/baz/',
+	["foo", "bar"]				=> 'foo/bar',
+	["/foo/bar", "baz", "/biff"]		=> '/foo/bar/baz/biff',
+	["", undef, "."]			=> '.',
+	[]					=> '',
+
+);
+
+while(@tests) {
+	my($have, $want) = splice @tests, 0, 2;
+
+	my $args = join ", ", map { qq['$_'] } map { defined($_) ? $_ : 'undef' } @$have;
+	my $name = "join_paths($args) eq '$want'";
+	is join_paths(@$have), $want, $name;
+}
diff --git a/t/lib-credential.sh b/t/lib-credential.sh
index 957ae93..3c43ff1 100755
--- a/t/lib-credential.sh
+++ b/t/lib-credential.sh
@@ -18,6 +18,10 @@
 		cat stderr &&
 		false
 	fi &&
+	if test_have_prereq MINGW
+	then
+		dos2unix -q stderr
+	fi &&
 	test_cmp expect-stdout stdout &&
 	test_cmp expect-stderr stderr
 }
diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh
index 2d753ab..7061dce 100644
--- a/t/lib-git-p4.sh
+++ b/t/lib-git-p4.sh
@@ -26,9 +26,10 @@
 git_p4_test_start=9800
 P4DPORT=$((10669 + ($testid - $git_p4_test_start)))
 
-export P4PORT=localhost:$P4DPORT
-export P4CLIENT=client
-export P4EDITOR=:
+P4PORT=localhost:$P4DPORT
+P4CLIENT=client
+P4EDITOR=:
+export P4PORT P4CLIENT P4EDITOR
 
 db="$TRASH_DIRECTORY/db"
 cli=$(test-path-utils real_path "$TRASH_DIRECTORY/cli")
@@ -115,3 +116,20 @@
 	EOF
 	"$PYTHON_PATH" "$TRASH_DIRECTORY/marshal-dump.py"
 }
+
+#
+# Construct a client with this list of View lines
+#
+client_view() {
+	(
+		cat <<-EOF &&
+		Client: client
+		Description: client
+		Root: $cli
+		View:
+		EOF
+		for arg ; do
+			printf "\t$arg\n"
+		done
+	) | p4 client -i
+}
diff --git a/t/perf/perf-lib.sh b/t/perf/perf-lib.sh
index a1361e5..a816fbc 100644
--- a/t/perf/perf-lib.sh
+++ b/t/perf/perf-lib.sh
@@ -42,6 +42,7 @@
 fi
 
 TEST_NO_CREATE_REPO=t
+TEST_NO_MALLOC_CHECK=t
 
 . ../test-lib.sh
 
diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index ccb5435..08677df 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -18,16 +18,6 @@
 modification *should* take notice and update the test vectors here.
 '
 
-################################################################
-# It appears that people try to run tests without building...
-
-../git >/dev/null
-if test $? != 1
-then
-	echo >&2 'You do not seem to have built git yet.'
-	exit 1
-fi
-
 . ./test-lib.sh
 
 ################################################################
@@ -450,24 +440,6 @@
 	test $numpath0 = 1
 '
 
-test_expect_success SYMLINKS 'real path works as expected' '
-	mkdir first &&
-	ln -s ../.git first/.git &&
-	mkdir second &&
-	ln -s ../first second/other &&
-	mkdir third &&
-	dir="$(cd .git; pwd -P)" &&
-	dir2=third/../second/other/.git &&
-	test "$dir" = "$(test-path-utils real_path $dir2)" &&
-	file="$dir"/index &&
-	test "$file" = "$(test-path-utils real_path $dir2/index)" &&
-	basename=blub &&
-	test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" &&
-	ln -s ../first/file .git/syml &&
-	sym="$(cd first; pwd -P)"/file &&
-	test "$sym" = "$(test-path-utils real_path "$dir2/syml")"
-'
-
 test_expect_success 'very long name in the index handled sanely' '
 
 	a=a && # 1
diff --git a/t/t0006-date.sh b/t/t0006-date.sh
index 1d29810..e53cf6d 100755
--- a/t/t0006-date.sh
+++ b/t/t0006-date.sh
@@ -11,7 +11,7 @@
 	echo "$t -> $2" >expect
 	test_expect_${3:-success} "relative date ($2)" "
 	test-date show $t >actual &&
-	test_cmp expect actual
+	test_i18ncmp expect actual
 	"
 }
 
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index e3f354a..244a43c 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -51,7 +51,7 @@
 test_expect_success 'test help' '
 	test_must_fail test-parse-options -h > output 2> output.err &&
 	test ! -s output.err &&
-	test_cmp expect output
+	test_i18ncmp expect output
 '
 
 mv expect expect.err
@@ -79,6 +79,17 @@
 	test_cmp expect output
 }
 
+check_i18n() {
+	what="$1" &&
+	shift &&
+	expect="$1" &&
+	shift &&
+	sed "s/^$what .*/$what $expect/" <expect.template >expect &&
+	test-parse-options $* >output 2>output.err &&
+	test ! -s output.err &&
+	test_i18ncmp expect output
+}
+
 check_unknown() {
 	case "$1" in
 	--*)
@@ -92,6 +103,19 @@
 	test_cmp expect output.err
 }
 
+check_unknown_i18n() {
+	case "$1" in
+	--*)
+		echo error: unknown option \`${1#--}\' >expect ;;
+	-*)
+		echo error: unknown switch \`${1#-}\' >expect ;;
+	esac &&
+	cat expect.err >>expect &&
+	test_must_fail test-parse-options $* >output 2>output.err &&
+	test ! -s output &&
+	test_i18ncmp expect output.err
+}
+
 test_expect_success 'OPT_BOOL() #1' 'check boolean: 1 --yes'
 test_expect_success 'OPT_BOOL() #2' 'check boolean: 1 --no-doubt'
 test_expect_success 'OPT_BOOL() #3' 'check boolean: 1 -D'
@@ -104,8 +128,8 @@
 test_expect_success 'OPT_BOOL() negation #1' 'check boolean: 0 -D --no-yes'
 test_expect_success 'OPT_BOOL() negation #2' 'check boolean: 0 -D --no-no-doubt'
 
-test_expect_success 'OPT_BOOL() no negation #1' 'check_unknown --fear'
-test_expect_success 'OPT_BOOL() no negation #2' 'check_unknown --no-no-fear'
+test_expect_success 'OPT_BOOL() no negation #1' 'check_unknown_i18n --fear'
+test_expect_success 'OPT_BOOL() no negation #2' 'check_unknown_i18n --no-no-fear'
 
 test_expect_success 'OPT_BOOL() positivation' 'check boolean: 0 -D --doubt'
 
@@ -310,8 +334,8 @@
 
 test_expect_success 'OPT_CALLBACK() and callback errors work' '
 	test_must_fail test-parse-options --no-length > output 2> output.err &&
-	test_cmp expect output &&
-	test_cmp expect.err output.err
+	test_i18ncmp expect output &&
+	test_i18ncmp expect.err output.err
 '
 
 cat > expect <<EOF
diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh
index 53cf1f8..4ef2345 100755
--- a/t/t0060-path-utils.sh
+++ b/t/t0060-path-utils.sh
@@ -139,4 +139,63 @@
 	test c:/msysgit = $(test-path-utils strip_path_suffix \
 		c:/msysgit/libexec//git-core libexec/git-core)
 '
+
+test_expect_success 'absolute path rejects the empty string' '
+	test_must_fail test-path-utils absolute_path ""
+'
+
+test_expect_success 'real path rejects the empty string' '
+	test_must_fail test-path-utils real_path ""
+'
+
+test_expect_success POSIX 'real path works on absolute paths 1' '
+	nopath="hopefully-absent-path" &&
+	test "/" = "$(test-path-utils real_path "/")" &&
+	test "/$nopath" = "$(test-path-utils real_path "/$nopath")"
+'
+
+test_expect_success 'real path works on absolute paths 2' '
+	nopath="hopefully-absent-path" &&
+	# Find an existing top-level directory for the remaining tests:
+	d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
+	test "$d" = "$(test-path-utils real_path "$d")" &&
+	test "$d/$nopath" = "$(test-path-utils real_path "$d/$nopath")"
+'
+
+test_expect_success POSIX 'real path removes extra leading slashes' '
+	nopath="hopefully-absent-path" &&
+	test "/" = "$(test-path-utils real_path "///")" &&
+	test "/$nopath" = "$(test-path-utils real_path "///$nopath")" &&
+	# Find an existing top-level directory for the remaining tests:
+	d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
+	test "$d" = "$(test-path-utils real_path "//$d")" &&
+	test "$d/$nopath" = "$(test-path-utils real_path "//$d/$nopath")"
+'
+
+test_expect_success 'real path removes other extra slashes' '
+	nopath="hopefully-absent-path" &&
+	# Find an existing top-level directory for the remaining tests:
+	d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") &&
+	test "$d" = "$(test-path-utils real_path "$d///")" &&
+	test "$d/$nopath" = "$(test-path-utils real_path "$d///$nopath")"
+'
+
+test_expect_success SYMLINKS 'real path works on symlinks' '
+	mkdir first &&
+	ln -s ../.git first/.git &&
+	mkdir second &&
+	ln -s ../first second/other &&
+	mkdir third &&
+	dir="$(cd .git; pwd -P)" &&
+	dir2=third/../second/other/.git &&
+	test "$dir" = "$(test-path-utils real_path $dir2)" &&
+	file="$dir"/index &&
+	test "$file" = "$(test-path-utils real_path $dir2/index)" &&
+	basename=blub &&
+	test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" &&
+	ln -s ../first/file .git/syml &&
+	sym="$(cd first; pwd -P)"/file &&
+	test "$sym" = "$(test-path-utils real_path "$dir2/syml")"
+'
+
 test_done
diff --git a/t/t0063-string-list.sh b/t/t0063-string-list.sh
new file mode 100755
index 0000000..41c8826
--- /dev/null
+++ b/t/t0063-string-list.sh
@@ -0,0 +1,121 @@
+#!/bin/sh
+#
+# Copyright (c) 2012 Michael Haggerty
+#
+
+test_description='Test string list functionality'
+
+. ./test-lib.sh
+
+test_split () {
+	cat >expected &&
+	test_expect_success "split $1 at $2, max $3" "
+		test-string-list split '$1' '$2' '$3' >actual &&
+		test_cmp expected actual &&
+		test-string-list split_in_place '$1' '$2' '$3' >actual &&
+		test_cmp expected actual
+	"
+}
+
+test_longest_prefix () {
+	test "$(test-string-list longest_prefix "$1" "$2")" = "$3"
+}
+
+test_no_longest_prefix () {
+	test_must_fail test-string-list longest_prefix "$1" "$2"
+}
+
+test_split "foo:bar:baz" ":" "-1" <<EOF
+3
+[0]: "foo"
+[1]: "bar"
+[2]: "baz"
+EOF
+
+test_split "foo:bar:baz" ":" "0" <<EOF
+1
+[0]: "foo:bar:baz"
+EOF
+
+test_split "foo:bar:baz" ":" "1" <<EOF
+2
+[0]: "foo"
+[1]: "bar:baz"
+EOF
+
+test_split "foo:bar:baz" ":" "2" <<EOF
+3
+[0]: "foo"
+[1]: "bar"
+[2]: "baz"
+EOF
+
+test_split "foo:bar:" ":" "-1" <<EOF
+3
+[0]: "foo"
+[1]: "bar"
+[2]: ""
+EOF
+
+test_split "" ":" "-1" <<EOF
+1
+[0]: ""
+EOF
+
+test_split ":" ":" "-1" <<EOF
+2
+[0]: ""
+[1]: ""
+EOF
+
+test_expect_success "test filter_string_list" '
+	test "x-" = "x$(test-string-list filter - y)" &&
+	test "x-" = "x$(test-string-list filter no y)" &&
+	test yes = "$(test-string-list filter yes y)" &&
+	test yes = "$(test-string-list filter no:yes y)" &&
+	test yes = "$(test-string-list filter yes:no y)" &&
+	test y1:y2 = "$(test-string-list filter y1:y2 y)" &&
+	test y2:y1 = "$(test-string-list filter y2:y1 y)" &&
+	test "x-" = "x$(test-string-list filter x1:x2 y)"
+'
+
+test_expect_success "test remove_duplicates" '
+	test "x-" = "x$(test-string-list remove_duplicates -)" &&
+	test "x" = "x$(test-string-list remove_duplicates "")" &&
+	test a = "$(test-string-list remove_duplicates a)" &&
+	test a = "$(test-string-list remove_duplicates a:a)" &&
+	test a = "$(test-string-list remove_duplicates a:a:a:a:a)" &&
+	test a:b = "$(test-string-list remove_duplicates a:b)" &&
+	test a:b = "$(test-string-list remove_duplicates a:a:b)" &&
+	test a:b = "$(test-string-list remove_duplicates a:b:b)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:b:c)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:a:b:c)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:b:b:c)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:b:c:c)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:a:b:b:c:c)" &&
+	test a:b:c = "$(test-string-list remove_duplicates a:a:a:b:b:b:c:c:c)"
+'
+
+test_expect_success "test longest_prefix" '
+	test_no_longest_prefix - '' &&
+	test_no_longest_prefix - x &&
+	test_longest_prefix "" x "" &&
+	test_longest_prefix x x x &&
+	test_longest_prefix "" foo "" &&
+	test_longest_prefix : foo "" &&
+	test_longest_prefix f foo f &&
+	test_longest_prefix foo foobar foo &&
+	test_longest_prefix foo foo foo &&
+	test_no_longest_prefix bar foo &&
+	test_no_longest_prefix bar:bar foo &&
+	test_no_longest_prefix foobar foo &&
+	test_longest_prefix foo:bar foo foo &&
+	test_longest_prefix foo:bar bar bar &&
+	test_longest_prefix foo::bar foo foo &&
+	test_longest_prefix foo:foobar foo foo &&
+	test_longest_prefix foobar:foo foo foo &&
+	test_longest_prefix foo: bar "" &&
+	test_longest_prefix :foo bar ""
+'
+
+test_done
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index a477453..e127f35 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -391,7 +391,7 @@
 
 test_expect_success 'no arguments, but no crash' '
 	test_must_fail git config >output 2>&1 &&
-	grep usage output
+	test_i18ngrep usage output
 '
 
 cat > .git/config << EOF
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 1efd7f7..13c88c9 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -41,7 +41,7 @@
 
 test_expect_success 'test --parseopt help output' '
 	test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec &&
-	test_cmp expect output
+	test_i18ncmp expect output
 '
 
 cat > expect <<EOF
diff --git a/t/t2006-checkout-index-basic.sh b/t/t2006-checkout-index-basic.sh
index b855983..57cbdfe 100755
--- a/t/t2006-checkout-index-basic.sh
+++ b/t/t2006-checkout-index-basic.sh
@@ -7,7 +7,7 @@
 
 test_expect_success 'checkout-index --gobbledegook' '
 	test_expect_code 129 git checkout-index --gobbledegook 2>err &&
-	grep "[Uu]sage" err
+	test_i18ngrep "[Uu]sage" err
 '
 
 test_expect_success 'checkout-index -h in broken repository' '
@@ -18,7 +18,7 @@
 		>.git/index &&
 		test_expect_code 129 git checkout-index -h >usage 2>&1
 	) &&
-	grep "[Uu]sage" broken/usage
+	test_i18ngrep "[Uu]sage" broken/usage
 '
 
 test_done
diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh
index 0dbbb00..a6405d3 100755
--- a/t/t2107-update-index-basic.sh
+++ b/t/t2107-update-index-basic.sh
@@ -15,7 +15,7 @@
 
 test_expect_success 'update-index --nonsense dumps usage' '
 	test_expect_code 129 git update-index --nonsense 2>err &&
-	grep "[Uu]sage: git update-index" err
+	test_i18ngrep "[Uu]sage: git update-index" err
 '
 
 test_expect_success 'update-index -h with corrupt index' '
@@ -26,7 +26,7 @@
 		>.git/index &&
 		test_expect_code 129 git update-index -h >usage 2>&1
 	) &&
-	grep "[Uu]sage: git update-index" broken/usage
+	test_i18ngrep "[Uu]sage: git update-index" broken/usage
 '
 
 test_expect_success '--cacheinfo does not accept blob null sha1' '
diff --git a/t/t3004-ls-files-basic.sh b/t/t3004-ls-files-basic.sh
index 490e052..8d9bc3c 100755
--- a/t/t3004-ls-files-basic.sh
+++ b/t/t3004-ls-files-basic.sh
@@ -22,7 +22,7 @@
 
 test_expect_success 'ls-files with nonsense option' '
 	test_expect_code 129 git ls-files --nonsense 2>actual &&
-	grep "[Uu]sage: git ls-files" actual
+	test_i18ngrep "[Uu]sage: git ls-files" actual
 '
 
 test_expect_success 'ls-files -h in corrupt repository' '
@@ -33,7 +33,7 @@
 		>.git/index &&
 		test_expect_code 129 git ls-files -h >usage 2>&1
 	) &&
-	grep "[Uu]sage: git ls-files " broken/usage
+	test_i18ngrep "[Uu]sage: git ls-files " broken/usage
 '
 
 test_done
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index a17f8b2..79c8d01 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -31,7 +31,7 @@
 		>.git/refs/heads/master &&
 		test_expect_code 129 git branch -h >usage 2>&1
 	) &&
-	grep "[Uu]sage" broken/usage
+	test_i18ngrep "[Uu]sage" broken/usage
 '
 
 test_expect_success \
@@ -74,7 +74,7 @@
 test_expect_success \
     'git branch -m dumps usage' \
        'test_expect_code 129 git branch -m 2>err &&
-	grep "[Uu]sage: git branch" err'
+	test_i18ngrep "[Uu]sage: git branch" err'
 
 test_expect_success \
     'git branch -m m m/m should work' \
@@ -369,6 +369,76 @@
     'git tag foobar &&
      test_must_fail git branch --track my11 foobar'
 
+test_expect_success 'use --set-upstream-to modify HEAD' \
+    'test_config branch.master.remote foo &&
+     test_config branch.master.merge foo &&
+     git branch my12
+     git branch --set-upstream-to my12 &&
+     test "$(git config branch.master.remote)" = "." &&
+     test "$(git config branch.master.merge)" = "refs/heads/my12"'
+
+test_expect_success 'use --set-upstream-to modify a particular branch' \
+    'git branch my13
+     git branch --set-upstream-to master my13 &&
+     test "$(git config branch.my13.remote)" = "." &&
+     test "$(git config branch.my13.merge)" = "refs/heads/master"'
+
+test_expect_success '--unset-upstream should fail if given a non-existent branch' \
+    'test_must_fail git branch --unset-upstream i-dont-exist'
+
+test_expect_success 'test --unset-upstream on HEAD' \
+    'git branch my14
+     test_config branch.master.remote foo &&
+     test_config branch.master.merge foo &&
+     git branch --set-upstream-to my14 &&
+     git branch --unset-upstream &&
+     test_must_fail git config branch.master.remote &&
+     test_must_fail git config branch.master.merge &&
+     # fail for a branch without upstream set
+     test_must_fail git branch --unset-upstream
+'
+
+test_expect_success 'test --unset-upstream on a particular branch' \
+    'git branch my15
+     git branch --set-upstream-to master my14 &&
+     git branch --unset-upstream my14 &&
+     test_must_fail git config branch.my14.remote &&
+     test_must_fail git config branch.my14.merge'
+
+test_expect_success '--set-upstream shows message when creating a new branch that exists as remote-tracking' \
+    'git update-ref refs/remotes/origin/master HEAD &&
+     git branch --set-upstream origin/master 2>actual &&
+     test_when_finished git update-ref -d refs/remotes/origin/master &&
+     test_when_finished git branch -d origin/master &&
+     cat >expected <<EOF &&
+The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
+
+If you wanted to make '"'master'"' track '"'origin/master'"', do this:
+
+    git branch -d origin/master
+    git branch --set-upstream-to origin/master
+EOF
+     test_cmp expected actual
+'
+
+test_expect_success '--set-upstream with two args only shows the deprecation message' \
+    'git branch --set-upstream master my13 2>actual &&
+     test_when_finished git branch --unset-upstream master &&
+     cat >expected <<EOF &&
+The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
+EOF
+     test_cmp expected actual
+'
+
+test_expect_success '--set-upstream with one arg only shows the deprecation message if the branch existed' \
+    'git branch --set-upstream my13 2>actual &&
+     test_when_finished git branch --unset-upstream my13 &&
+     cat >expected <<EOF &&
+The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
+EOF
+     test_cmp expected actual
+'
+
 # Keep this test last, as it changes the current branch
 cat >expect <<EOF
 $_z40 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000	branch: Created from master
diff --git a/t/t3300-funny-names.sh b/t/t3300-funny-names.sh
index 1f35e55..7480d6e 100755
--- a/t/t3300-funny-names.sh
+++ b/t/t3300-funny-names.sh
@@ -11,6 +11,16 @@
 
 . ./test-lib.sh
 
+HT='	'
+
+echo 2>/dev/null > "Name with an${HT}HT"
+if ! test -f "Name with an${HT}HT"
+then
+	# since FAT/NTFS does not allow tabs in filenames, skip this test
+	skip_all='Your filesystem does not allow tabs in filenames'
+	test_done
+fi
+
 p0='no-funny'
 p1='tabs	," (dq) and spaces'
 p2='just space'
@@ -23,21 +33,9 @@
 	EOF
 
 	{ cat "$p0" >"$p1" || :; } &&
-	{ echo "Foo Bar Baz" >"$p2" || :; } &&
-
-	if test -f "$p1" && cmp "$p0" "$p1"
-	then
-		test_set_prereq TABS_IN_FILENAMES
-	fi
+	{ echo "Foo Bar Baz" >"$p2" || :; }
 '
 
-if ! test_have_prereq TABS_IN_FILENAMES
-then
-	# since FAT/NTFS does not allow tabs in filenames, skip this test
-	skip_all='Your filesystem does not allow tabs in filenames'
-	test_done
-fi
-
 test_expect_success 'setup: populate index and tree' '
 	git update-index --add "$p0" "$p2" &&
 	t0=$(git write-tree)
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 7304b66..32fdc99 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -118,6 +118,17 @@
 	git rebase --continue
 '
 
+test_expect_success 'rebase -i with exec of inexistent command' '
+	git checkout master &&
+	test_when_finished "git rebase --abort" &&
+	(
+	FAKE_LINES="exec_this-command-does-not-exist 1" &&
+	export FAKE_LINES &&
+	test_must_fail git rebase -i HEAD^ >actual 2>&1
+	) &&
+	! grep "Maybe git-rebase is broken" actual
+'
+
 test_expect_success 'no changes are a nop' '
 	git checkout branch2 &&
 	git rebase -i F &&
@@ -911,4 +922,22 @@
 	test 0 = $(git cat-file commit HEAD | grep -c ^parent\ )
 '
 
+test_expect_success 'rebase --edit-todo does not works on non-interactive rebase' '
+	git reset --hard &&
+	git checkout conflict-branch &&
+	test_must_fail git rebase --onto HEAD~2 HEAD~ &&
+	test_must_fail git rebase --edit-todo &&
+	git rebase --abort
+'
+
+test_expect_success 'rebase --edit-todo can be used to modify todo' '
+	git reset --hard &&
+	git checkout no-conflict-branch^0 &&
+	FAKE_LINES="edit 1 2 3" git rebase -i HEAD~3 &&
+	FAKE_LINES="2 1" git rebase --edit-todo &&
+	git rebase --continue
+	test M = $(git cat-file commit HEAD^ | sed -ne \$p) &&
+	test L = $(git cat-file commit HEAD | sed -ne \$p)
+'
+
 test_done
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index 595d2ff..34c86e5 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh
@@ -47,7 +47,7 @@
 	git diff --exit-code HEAD &&
 	test_must_fail git cherry-pick --nonsense 2>msg &&
 	git diff --exit-code HEAD "$pos" &&
-	grep '[Uu]sage:' msg
+	test_i18ngrep '[Uu]sage:' msg
 '
 
 test_expect_success 'revert --nonsense' '
@@ -56,7 +56,7 @@
 	git diff --exit-code HEAD &&
 	test_must_fail git revert --nonsense 2>msg &&
 	git diff --exit-code HEAD "$pos" &&
-	grep '[Uu]sage:' msg
+	test_i18ngrep '[Uu]sage:' msg
 '
 
 test_expect_success 'cherry-pick after renaming branch' '
diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh
index 5a1340c..a0c6e30 100755
--- a/t/t3505-cherry-pick-empty.sh
+++ b/t/t3505-cherry-pick-empty.sh
@@ -53,6 +53,11 @@
 
 '
 
+test_expect_success 'cherry-pick a commit with an empty message with --allow-empty-message' '
+	git checkout -f master &&
+	git cherry-pick --allow-empty-message empty-branch
+'
+
 test_expect_success 'cherry pick an empty non-ff commit without --allow-empty' '
 	git checkout master &&
 	echo fourth >>file2 &&
diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh
index 0c81b3c..c82f721 100755
--- a/t/t3507-cherry-pick-conflict.sh
+++ b/t/t3507-cherry-pick-conflict.sh
@@ -30,6 +30,7 @@
 	test_commit initial foo a &&
 	test_commit base foo b &&
 	test_commit picked foo c &&
+	test_commit --signoff picked-signed foo d &&
 	git config advice.detachedhead false
 
 '
@@ -340,4 +341,35 @@
 	test_cmp expected actual
 '
 
+test_expect_success 'failed cherry-pick does not forget -s' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick -s picked &&
+	test_i18ngrep -e "Signed-off-by" .git/MERGE_MSG
+'
+
+test_expect_success 'commit after failed cherry-pick does not add duplicated -s' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick -s picked-signed &&
+	git commit -a -s &&
+	test $(git show -s |grep -c "Signed-off-by") = 1
+'
+
+test_expect_success 'commit after failed cherry-pick adds -s at the right place' '
+	pristine_detach initial &&
+	test_must_fail git cherry-pick picked &&
+	git commit -a -s &&
+	pwd &&
+	cat <<EOF > expected &&
+picked
+
+Signed-off-by: C O Mitter <committer@example.com>
+
+Conflicts:
+	foo
+EOF
+
+	git show -s --pretty=format:%B > actual &&
+	test_cmp expected actual
+'
+
 test_done
diff --git a/t/t3510-cherry-pick-sequence.sh b/t/t3510-cherry-pick-sequence.sh
index f4e6450..b5fb527 100755
--- a/t/t3510-cherry-pick-sequence.sh
+++ b/t/t3510-cherry-pick-sequence.sh
@@ -410,7 +410,7 @@
 	grep "cherry picked from.*$picked" msg
 '
 
-test_expect_success '--signoff is not automatically propagated to resolved conflict' '
+test_expect_failure '--signoff is automatically propagated to resolved conflict' '
 	pristine_detach initial &&
 	test_expect_code 1 git cherry-pick --signoff base..anotherpick &&
 	echo "c" >foo &&
@@ -428,7 +428,7 @@
 	grep "Signed-off-by:" anotherpick_msg
 '
 
-test_expect_success '--signoff dropped for implicit commit of resolution, multi-pick case' '
+test_expect_failure '--signoff dropped for implicit commit of resolution, multi-pick case' '
 	pristine_detach initial &&
 	test_must_fail git cherry-pick -s picked anotherpick &&
 	echo c >foo &&
@@ -441,7 +441,7 @@
 	! grep Signed-off-by: msg
 '
 
-test_expect_success 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' '
+test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' '
 	pristine_detach initial &&
 	test_must_fail git cherry-pick -s picked &&
 	echo c >foo &&
diff --git a/t/t3902-quoted.sh b/t/t3902-quoted.sh
index 534ee08..892f567 100755
--- a/t/t3902-quoted.sh
+++ b/t/t3902-quoted.sh
@@ -16,9 +16,8 @@
 if ! test -f "Name and an${HT}HT"
 then
 	# FAT/NTFS does not allow tabs in filenames
-	say 'Your filesystem does not allow tabs in filenames'
-else
-	test_set_prereq TABS_IN_FILENAMES
+	skip_all='Your filesystem does not allow tabs in filenames'
+	test_done
 fi
 
 for_each_name () {
@@ -31,7 +30,7 @@
 	done
 }
 
-test_expect_success TABS_IN_FILENAMES 'setup' '
+test_expect_success 'setup' '
 
 	mkdir "$FN" &&
 	for_each_name "echo initial >\"\$name\"" &&
@@ -45,7 +44,7 @@
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'setup expected files' '
+test_expect_success 'setup expected files' '
 cat >expect.quoted <<\EOF &&
 Name
 "Name and a\nLF"
@@ -75,74 +74,74 @@
 EOF
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' '
+test_expect_success 'check fully quoted output from ls-files' '
 
 	git ls-files >current && test_cmp expect.quoted current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' '
+test_expect_success 'check fully quoted output from diff-files' '
 
 	git diff --name-only >current &&
 	test_cmp expect.quoted current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' '
+test_expect_success 'check fully quoted output from diff-index' '
 
 	git diff --name-only HEAD >current &&
 	test_cmp expect.quoted current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' '
+test_expect_success 'check fully quoted output from diff-tree' '
 
 	git diff --name-only HEAD^ HEAD >current &&
 	test_cmp expect.quoted current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' '
+test_expect_success 'check fully quoted output from ls-tree' '
 
 	git ls-tree --name-only -r HEAD >current &&
 	test_cmp expect.quoted current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'setting core.quotepath' '
+test_expect_success 'setting core.quotepath' '
 
 	git config --bool core.quotepath false
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' '
+test_expect_success 'check fully quoted output from ls-files' '
 
 	git ls-files >current && test_cmp expect.raw current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' '
+test_expect_success 'check fully quoted output from diff-files' '
 
 	git diff --name-only >current &&
 	test_cmp expect.raw current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' '
+test_expect_success 'check fully quoted output from diff-index' '
 
 	git diff --name-only HEAD >current &&
 	test_cmp expect.raw current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' '
+test_expect_success 'check fully quoted output from diff-tree' '
 
 	git diff --name-only HEAD^ HEAD >current &&
 	test_cmp expect.raw current
 
 '
 
-test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' '
+test_expect_success 'check fully quoted output from ls-tree' '
 
 	git ls-tree --name-only -r HEAD >current &&
 	test_cmp expect.raw current
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index cd04263..5dfbda7 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -610,7 +610,7 @@
 		git stash apply
 	) |
 	sed -e 1,2d >actual && # drop "Saved..." and "HEAD is now..."
-	test_cmp expect actual
+	test_i18ncmp expect actual
 '
 
 cat > expect << EOF
diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh
index 7a3e1f9..3d4b1ba 100755
--- a/t/t4006-diff-mode.sh
+++ b/t/t4006-diff-mode.sh
@@ -36,24 +36,24 @@
 	test_chmod -x rezrov &&
 	echo " 0 files changed" >expect &&
 	git diff HEAD --stat >actual &&
-	test_cmp expect actual
+	test_i18ncmp expect actual
 '
 
 test_expect_success '--shortstat output after text chmod' '
 	git diff HEAD --shortstat >actual &&
-	test_cmp expect actual
+	test_i18ncmp expect actual
 '
 
 test_expect_success '--stat output after binary chmod' '
 	test_chmod +x binbin &&
 	echo " 0 files changed" >expect &&
 	git diff HEAD --stat >actual &&
-	test_cmp expect actual
+	test_i18ncmp expect actual
 '
 
 test_expect_success '--shortstat output after binary chmod' '
 	git diff HEAD --shortstat >actual &&
-	test_cmp expect actual
+	test_i18ncmp expect actual
 '
 
 test_done
diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh
index ec4deea..1215ae5 100755
--- a/t/t4012-diff-binary.sh
+++ b/t/t4012-diff-binary.sh
@@ -63,7 +63,7 @@
 
 # apply needs to be able to skip the binary material correctly
 # in order to report the line number of a corrupt patch.
-test_expect_success 'apply detecting corrupt patch correctly' '
+test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
 	git diff >output &&
 	sed -e "s/-CIT/xCIT/" <output >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
@@ -73,7 +73,7 @@
 	test "$detected" = xCIT
 '
 
-test_expect_success 'apply detecting corrupt patch correctly' '
+test_expect_success C_LOCALE_OUTPUT 'apply detecting corrupt patch correctly' '
 	git diff --binary | sed -e "s/-CIT/xCIT/" >broken &&
 	test_must_fail git apply --stat --summary broken 2>detected &&
 	detected=`cat detected` &&
diff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh
index 97b8177..cd543ec 100755
--- a/t/t4016-diff-quote.sh
+++ b/t/t4016-diff-quote.sh
@@ -13,14 +13,12 @@
 P2='pathname with SP'
 P3='pathname
 with LF'
-if : 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1"
-then
-	test_set_prereq TABS_IN_FILENAMES
-else
-	say 'Your filesystem does not allow tabs in filenames'
-fi
+echo 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" || {
+	skip_all='Your filesystem does not allow tabs in filenames'
+	test_done
+}
 
-test_expect_success TABS_IN_FILENAMES setup '
+test_expect_success setup '
 	echo P0.0 >"$P0.0" &&
 	echo P0.1 >"$P0.1" &&
 	echo P0.2 >"$P0.2" &&
@@ -40,7 +38,7 @@
 	:
 '
 
-test_expect_success TABS_IN_FILENAMES 'setup expected files' '
+test_expect_success 'setup expected files' '
 cat >expect <<\EOF
  rename pathname.1 => "Rpathname\twith HT.0" (100%)
  rename pathname.3 => "Rpathname\nwith LF.0" (100%)
@@ -52,12 +50,12 @@
 EOF
 '
 
-test_expect_success TABS_IN_FILENAMES 'git diff --summary -M HEAD' '
+test_expect_success 'git diff --summary -M HEAD' '
 	git diff --summary -M HEAD >actual &&
 	test_cmp expect actual
 '
 
-test_expect_success TABS_IN_FILENAMES 'git diff --numstat -M HEAD' '
+test_expect_success 'git diff --numstat -M HEAD' '
 	cat >expect <<-\EOF &&
 	0	0	pathname.1 => "Rpathname\twith HT.0"
 	0	0	pathname.3 => "Rpathname\nwith LF.0"
@@ -71,7 +69,7 @@
 	test_cmp expect actual
 '
 
-test_expect_success TABS_IN_FILENAMES 'git diff --stat -M HEAD' '
+test_expect_success 'git diff --stat -M HEAD' '
 	cat >expect <<-\EOF &&
 	 pathname.1 => "Rpathname\twith HT.0"            | 0
 	 pathname.3 => "Rpathname\nwith LF.0"            | 0
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 4bd2a1c..082d3e8 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -105,7 +105,7 @@
 	grep "^@@.*@@ $1" diff
 }
 
-for p in bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex
+for p in ada bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex
 do
 	test_expect_success "builtin $p pattern compiles" '
 		echo "*.java diff=$p" >.gitattributes &&
diff --git a/t/t4034-diff-words.sh b/t/t4034-diff-words.sh
index 30d42cb..40ab333 100755
--- a/t/t4034-diff-words.sh
+++ b/t/t4034-diff-words.sh
@@ -298,6 +298,7 @@
 	test_unconfig diff.wordregex
 '
 
+test_language_driver ada
 test_language_driver bibtex
 test_language_driver cpp
 test_language_driver csharp
diff --git a/t/t4034/ada/expect b/t/t4034/ada/expect
new file mode 100644
index 0000000..be2376e
--- /dev/null
+++ b/t/t4034/ada/expect
@@ -0,0 +1,27 @@
+<BOLD>diff --git a/pre b/post<RESET>
+<BOLD>index d96fdd1..df21bb0 100644<RESET>
+<BOLD>--- a/pre<RESET>
+<BOLD>+++ b/post<RESET>
+<CYAN>@@ -1,13 +1,13 @@<RESET>
+Ada.Text_IO.Put_Line("Hello World<RED>!<RESET><GREEN>?<RESET>");
+1 1e<RED>-<RESET>10 16#FE12#E2 3.141_592 '<RED>x<RESET><GREEN>y<RESET>'
+<RED>a<RESET><GREEN>x<RESET>+<RED>b a<RESET><GREEN>y x<RESET>-<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>*<RED>b a<RESET><GREEN>y x<RESET>/<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>**<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>(<RED>b<RESET><GREEN>y<RESET>)
+<RED>a<RESET><GREEN>x<RESET>:=<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>=<RED>b a<RESET><GREEN>y x<RESET>/= <RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET><<RED>b a<RESET><GREEN>y x<RESET><=<RED>b a<RESET><GREEN>y x<RESET>><RED>b a<RESET><GREEN>y x<RESET>>=<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>,<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>=><RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET>..<RED>b<RESET>
+<RED>a<RESET><GREEN>y<RESET>
+<GREEN>x<RESET><><RED>b<RESET><GREEN>y<RESET>
diff --git a/t/t4034/ada/post b/t/t4034/ada/post
new file mode 100644
index 0000000..df21bb0
--- /dev/null
+++ b/t/t4034/ada/post
@@ -0,0 +1,13 @@
+Ada.Text_IO.Put_Line("Hello World?");
+1 1e10 16#FE12#E2 3.141_592 'y'
+x+y x-y
+x*y x/y
+x**y
+x(y)
+x:=y
+x=y x/= y
+x<y x<=y x>y x>=y
+x,y
+x=>y
+x..y
+x<>y
diff --git a/t/t4034/ada/pre b/t/t4034/ada/pre
new file mode 100644
index 0000000..d96fdd1
--- /dev/null
+++ b/t/t4034/ada/pre
@@ -0,0 +1,13 @@
+Ada.Text_IO.Put_Line("Hello World!");
+1 1e-10 16#FE12#E2 3.141_592 'x'
+a+b a-b
+a*b a/b
+a**b
+a(b)
+a:=b
+a=b a/= b
+a<b a<=b a>b a>=b
+a,b
+a=>b
+a..b
+a<>b
diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh
index a33d510..c5fecdf 100755
--- a/t/t4120-apply-popt.sh
+++ b/t/t4120-apply-popt.sh
@@ -32,7 +32,7 @@
 test_expect_success 'apply with too large -p' '
 	cp file1.saved file1 &&
 	test_must_fail git apply --stat -p3 patch.file 2>err &&
-	grep "removing 3 leading" err
+	test_i18ngrep "removing 3 leading" err
 '
 
 test_expect_success 'apply (-p2) traditional diff with funny filenames' '
@@ -54,7 +54,7 @@
 test_expect_success 'apply with too large -p and fancy filename' '
 	cp file1.saved file1 &&
 	test_must_fail git apply --stat -p3 patch.escaped 2>err &&
-	grep "removing 3 leading" err
+	test_i18ngrep "removing 3 leading" err
 '
 
 test_expect_success 'apply (-p2) diff, mode change only' '
diff --git a/t/t4133-apply-filenames.sh b/t/t4133-apply-filenames.sh
index 94da990..2ecb421 100755
--- a/t/t4133-apply-filenames.sh
+++ b/t/t4133-apply-filenames.sh
@@ -30,9 +30,9 @@
 
 test_expect_success 'apply diff with inconsistent filenames in headers' '
 	test_must_fail git apply bad1.patch 2>err &&
-	grep "inconsistent new filename" err &&
+	test_i18ngrep "inconsistent new filename" err &&
 	test_must_fail git apply bad2.patch 2>err &&
-	grep "inconsistent old filename" err
+	test_i18ngrep "inconsistent old filename" err
 '
 
 test_done
diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh
index 3ab670d..7f6666f 100755
--- a/t/t4200-rerere.sh
+++ b/t/t4200-rerere.sh
@@ -382,13 +382,13 @@
 	git update-index --index-info <failedmerge &&
 	cp file3.conflict file3 &&
 	test_must_fail git rerere --no-no-rerere-autoupdate 2>err &&
-	grep [Uu]sage err &&
+	test_i18ngrep [Uu]sage err &&
 	test_must_fail git update-index --refresh
 '
 
 test_expect_success 'rerere -h' '
 	test_must_fail git rerere -h >help &&
-	grep [Uu]sage help
+	test_i18ngrep [Uu]sage help
 '
 
 test_done
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index b3ac6be..924ba53 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -813,7 +813,7 @@
 test_expect_success 'log --graph with diff and stats' '
 	git log --graph --pretty=short --stat -p >actual &&
 	sanitize_output >actual.sanitized <actual &&
-	test_cmp expect actual.sanitized
+	test_i18ncmp expect actual.sanitized
 '
 
 test_expect_success 'dotdot is a parent directory' '
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index 4afd778..2c45de7 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -88,7 +88,7 @@
 	stat1_part=$(git diff --stat --root HEAD^) &&
 	printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n" >expected &&
 	git log -z --stat --pretty="format:%s" >actual &&
-	test_cmp expected actual
+	test_i18ncmp expected actual
 '
 
 test_expect_failure 'NUL termination with --stat' '
@@ -96,7 +96,7 @@
 	stat1_part=$(git diff --stat --root HEAD^) &&
 	printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n\0" >expected &&
 	git log -z --stat --pretty="tformat:%s" >actual &&
-	test_cmp expected actual
+	test_i18ncmp expected actual
 '
 
 test_done
diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh
index 81904d9..3e64a7a 100755
--- a/t/t5100-mailinfo.sh
+++ b/t/t5100-mailinfo.sh
@@ -11,7 +11,7 @@
 	'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last &&
 	last=`cat last` &&
 	echo total is $last &&
-	test `cat last` = 16'
+	test `cat last` = 17'
 
 check_mailinfo () {
 	mail=$1 opt=$2
diff --git a/t/t5100/info0017 b/t/t5100/info0017
new file mode 100644
index 0000000..d2bc89f
--- /dev/null
+++ b/t/t5100/info0017
@@ -0,0 +1,5 @@
+Author: A U Thor
+Email: a.u.thor@example.com
+Subject: A E I O U
+Date: Mon, 17 Sep 2012 14:23:44 -0700
+
diff --git a/t/t5100/msg0017 b/t/t5100/msg0017
new file mode 100644
index 0000000..2ee0900
--- /dev/null
+++ b/t/t5100/msg0017
@@ -0,0 +1,2 @@
+New content here
+
diff --git a/t/t5100/patch0017 b/t/t5100/patch0017
new file mode 100644
index 0000000..35cf84c
--- /dev/null
+++ b/t/t5100/patch0017
@@ -0,0 +1,6 @@
+diff --git a/foo b/foo
+index e69de29..d95f3ad 100644
+--- a/foo
++++ b/foo
+@@ -0,0 +1 @@
++New content
diff --git a/t/t5100/sample.mbox b/t/t5100/sample.mbox
index 34a09a0..8b2ae06 100644
--- a/t/t5100/sample.mbox
+++ b/t/t5100/sample.mbox
@@ -683,3 +683,19 @@
 @@ -0,0 +1 @@
 +content
 
+From nobody Mon Sep 17 00:00:00 2001
+From: A U Thor <a.u.thor@example.com>
+Subject: A E I O U
+Date: Mon, 17 Sep 2012 14:23:44 -0700
+MIME-Version: 1.0
+Content-Type: text/plain; charset="iso-2022-jp"
+Content-type: text/plain; charset="UTF-8"
+
+New content here
+
+diff --git a/foo b/foo
+index e69de29..d95f3ad 100644
+--- a/foo
++++ b/foo
+@@ -0,0 +1 @@
++New content
diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh
index 2e52f8b..a07c871 100755
--- a/t/t5300-pack-object.sh
+++ b/t/t5300-pack-object.sh
@@ -416,11 +416,11 @@
 test_expect_success \
     'make sure index-pack detects the SHA1 collision' \
     'test_must_fail git index-pack -o bad.idx test-3.pack 2>msg &&
-     grep "SHA1 COLLISION FOUND" msg'
+     test_i18ngrep "SHA1 COLLISION FOUND" msg'
 
 test_expect_success \
     'make sure index-pack detects the SHA1 collision (large blobs)' \
     'test_must_fail git -c core.bigfilethreshold=1 index-pack -o bad.idx test-3.pack 2>msg &&
-     grep "SHA1 COLLISION FOUND" msg'
+     test_i18ngrep "SHA1 COLLISION FOUND" msg'
 
 test_done
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index e80a2af..6322e8a 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -391,10 +391,55 @@
 test_expect_success 'test duplicate refs from stdin' '
 	(
 	cd client &&
-	test_must_fail git fetch-pack --stdin --no-progress .. <../input.dup
+	git fetch-pack --stdin --no-progress .. <../input.dup
 	) >output &&
 	cut -d " " -f 2 <output | sort >actual &&
 	test_cmp expect actual
 '
 
+test_expect_success 'set up tests of missing reference' '
+	cat >expect-error <<-\EOF
+	error: no such remote ref refs/heads/xyzzy
+	EOF
+'
+
+test_expect_success 'test lonely missing ref' '
+	(
+		cd client &&
+		test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy
+	) >/dev/null 2>error-m &&
+	test_cmp expect-error error-m
+'
+
+test_expect_success 'test missing ref after existing' '
+	(
+		cd client &&
+		test_must_fail git fetch-pack --no-progress .. refs/heads/A refs/heads/xyzzy
+	) >/dev/null 2>error-em &&
+	test_cmp expect-error error-em
+'
+
+test_expect_success 'test missing ref before existing' '
+	(
+		cd client &&
+		test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy refs/heads/A
+	) >/dev/null 2>error-me &&
+	test_cmp expect-error error-me
+'
+
+test_expect_success 'test --all, --depth, and explicit head' '
+	(
+		cd client &&
+		git fetch-pack --no-progress --all --depth=1 .. refs/heads/A
+	) >out-adh 2>error-adh
+'
+
+test_expect_success 'test --all, --depth, and explicit tag' '
+	git tag OLDTAG refs/heads/B~5 &&
+	(
+		cd client &&
+		git fetch-pack --no-progress --all --depth=1 .. refs/tags/OLDTAG
+	) >out-adt 2>error-adt
+'
+
 test_done
diff --git a/t/t5504-fetch-receive-strict.sh b/t/t5504-fetch-receive-strict.sh
index 35ec294..69ee13c 100755
--- a/t/t5504-fetch-receive-strict.sh
+++ b/t/t5504-fetch-receive-strict.sh
@@ -89,7 +89,7 @@
 
 cat >exp <<EOF
 To dst
-!	refs/heads/master:refs/heads/test	[remote rejected] (n/a (unpacker error))
+!	refs/heads/master:refs/heads/test	[remote rejected] (unpacker error)
 EOF
 
 test_expect_success 'push with receive.fsckobjects' '
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index c03ffdd..ccc55eb 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -52,7 +52,7 @@
 
 '
 
-test_expect_success 'remote information for the origin' '
+test_expect_success C_LOCALE_OUTPUT 'remote information for the origin' '
 (
 	cd test &&
 	tokens_match origin "$(git remote)" &&
@@ -66,8 +66,6 @@
 	cd test &&
 	git remote add -f second ../two &&
 	tokens_match "origin second" "$(git remote)" &&
-	check_remote_track origin master side &&
-	check_remote_track second master side another &&
 	check_tracking_branch second master side another &&
 	git for-each-ref "--format=%(refname)" refs/remotes |
 	sed -e "/^refs\/remotes\/origin\//d" \
@@ -77,6 +75,14 @@
 )
 '
 
+test_expect_success C_LOCALE_OUTPUT 'check remote tracking' '
+(
+	cd test &&
+	check_remote_track origin master side &&
+	check_remote_track second master side another
+)
+'
+
 test_expect_success 'remote forces tracking branches' '
 (
 	cd test &&
@@ -95,7 +101,7 @@
 )
 '
 
-test_expect_success 'remove remote' '
+test_expect_success C_LOCALE_OUTPUT 'remove remote' '
 (
 	cd test &&
 	tokens_match origin "$(git remote)" &&
@@ -131,8 +137,8 @@
 	git remote rm oops 2>actual2 &&
 	git branch -d foobranch &&
 	git tag -d footag &&
-	test_cmp expect1 actual1 &&
-	test_cmp expect2 actual2
+	test_i18ncmp expect1 actual1 &&
+	test_i18ncmp expect2 actual2
 )
 '
 
@@ -192,7 +198,7 @@
 	 git config --add remote.two.push refs/heads/master:refs/heads/another &&
 	 git remote show origin two > output &&
 	 git branch -d rebase octopus &&
-	 test_cmp expect output)
+	 test_i18ncmp expect output)
 '
 
 cat > test/expect << EOF
@@ -217,7 +223,7 @@
 	 cd test &&
 	 git remote show -n origin > output &&
 	 mv ../one.unreachable ../one &&
-	 test_cmp expect output)
+	 test_i18ncmp expect output)
 '
 
 test_expect_success 'prune' '
@@ -255,7 +261,7 @@
 test_expect_success 'set-head --auto fails w/multiple HEADs' '
 	(cd test &&
 	 test_must_fail git remote set-head --auto two >output 2>&1 &&
-	test_cmp expect output)
+	test_i18ncmp expect output)
 '
 
 cat >test/expect <<EOF
@@ -285,7 +291,7 @@
 	 test_must_fail git rev-parse refs/remotes/origin/side &&
 	(cd ../one &&
 	 git branch -m side side2) &&
-	 test_cmp expect output)
+	 test_i18ncmp expect output)
 '
 
 test_expect_success 'add --mirror && prune' '
@@ -705,7 +711,7 @@
 		cd seven &&
 		git remote prune origin
 	) >err 2>&1 &&
-	grep "has become dangling" err &&
+	test_i18ngrep "has become dangling" err &&
 
 	: And the dangling symref will not cause other annoying errors &&
 	(
diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh
index 6b2a5f4..c983d36 100755
--- a/t/t5530-upload-pack-error.sh
+++ b/t/t5530-upload-pack-error.sh
@@ -35,8 +35,8 @@
 	printf "0032want %s\n00000009done\n0000" \
 		$(git rev-parse HEAD) >input &&
 	test_must_fail git upload-pack . <input >/dev/null 2>output.err &&
-	grep "unable to read" output.err &&
-	grep "pack-objects died" output.err
+	test_i18ngrep "unable to read" output.err &&
+	test_i18ngrep "pack-objects died" output.err
 '
 
 test_expect_success 'corrupt repo differently' '
diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh
index ef6d6b6..4b4b4a6 100755
--- a/t/t5541-http-push.sh
+++ b/t/t5541-http-push.sh
@@ -66,7 +66,10 @@
 
 test_expect_success 'clone remote repository' '
 	rm -rf test_repo_clone &&
-	git clone $HTTPD_URL/smart/test_repo.git test_repo_clone
+	git clone $HTTPD_URL/smart/test_repo.git test_repo_clone &&
+	(
+		cd test_repo_clone && git config push.default matching
+	)
 '
 
 test_expect_success 'push to remote repository (standard)' '
diff --git a/t/t5551-http-fetch.sh b/t/t5551-http-fetch.sh
index 2db5c35..5060879 100755
--- a/t/t5551-http-fetch.sh
+++ b/t/t5551-http-fetch.sh
@@ -32,13 +32,14 @@
 cat >exp <<EOF
 > GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1
 > Accept: */*
+> Accept-Encoding: gzip
 > Pragma: no-cache
 < HTTP/1.1 200 OK
 < Pragma: no-cache
 < Cache-Control: no-cache, max-age=0, must-revalidate
 < Content-Type: application/x-git-upload-pack-advertisement
 > POST /smart/repo.git/git-upload-pack HTTP/1.1
-> Accept-Encoding: deflate, gzip
+> Accept-Encoding: gzip
 > Content-Type: application/x-git-upload-pack-request
 > Accept: application/x-git-upload-pack-result
 > Content-Length: xxx
@@ -129,6 +130,18 @@
 	test_cmp expect actual
 '
 
+test_expect_success 'disable dumb http on server' '
+	git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
+		config http.getanyfile false
+'
+
+test_expect_success 'GIT_SMART_HTTP can disable smart http' '
+	(GIT_SMART_HTTP=0 &&
+	 export GIT_SMART_HTTP &&
+	 cd clone &&
+	 test_must_fail git fetch)
+'
+
 test -n "$GIT_TEST_LONG" && test_set_prereq EXPENSIVE
 
 test_expect_success EXPENSIVE 'create 50,000 tags in the repo' '
diff --git a/t/t5709-clone-refspec.sh b/t/t5709-clone-refspec.sh
new file mode 100755
index 0000000..6f1ea98
--- /dev/null
+++ b/t/t5709-clone-refspec.sh
@@ -0,0 +1,156 @@
+#!/bin/sh
+
+test_description='test refspec written by clone-command'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	# Make two branches, "master" and "side"
+	echo one >file &&
+	git add file &&
+	git commit -m one &&
+	echo two >file &&
+	git commit -a -m two &&
+	git tag two &&
+	echo three >file &&
+	git commit -a -m three &&
+	git checkout -b side &&
+	echo four >file &&
+	git commit -a -m four &&
+	git checkout master &&
+
+	# default clone
+	git clone . dir_all &&
+
+	# default --single that follows HEAD=master
+	git clone --single-branch . dir_master &&
+
+	# default --single that follows HEAD=side
+	git checkout side &&
+	git clone --single-branch . dir_side &&
+
+	# explicit --single that follows side
+	git checkout master &&
+	git clone --single-branch --branch side . dir_side2 &&
+
+	# default --single with --mirror
+	git clone --single-branch --mirror . dir_mirror &&
+
+	# default --single with --branch and --mirror
+	git clone --single-branch --mirror --branch side . dir_mirror_side &&
+
+	# --single that does not know what branch to follow
+	git checkout two^ &&
+	git clone --single-branch . dir_detached &&
+
+	# explicit --single with tag
+	git clone --single-branch --branch two . dir_tag &&
+
+	# advance both "master" and "side" branches
+	git checkout side &&
+	echo five >file &&
+	git commit -a -m five &&
+	git checkout master &&
+	echo six >file &&
+	git commit -a -m six &&
+
+	# update tag
+	git tag -d two && git tag two
+'
+
+test_expect_success 'by default all branches will be kept updated' '
+	(
+		cd dir_all && git fetch &&
+		git for-each-ref refs/remotes/origin |
+		sed -e "/HEAD$/d" \
+		    -e "s|/remotes/origin/|/heads/|" >../actual
+	) &&
+	# follow both master and side
+	git for-each-ref refs/heads >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'by default no tags will be kept updated' '
+	(
+		cd dir_all && git fetch &&
+		git for-each-ref refs/tags >../actual
+	) &&
+	git for-each-ref refs/tags >expect &&
+	test_must_fail test_cmp expect actual
+'
+
+test_expect_success '--single-branch while HEAD pointing at master' '
+	(
+		cd dir_master && git fetch &&
+		git for-each-ref refs/remotes/origin |
+		sed -e "/HEAD$/d" \
+		    -e "s|/remotes/origin/|/heads/|" >../actual
+	) &&
+	# only follow master
+	git for-each-ref refs/heads/master >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch while HEAD pointing at side' '
+	(
+		cd dir_side && git fetch &&
+		git for-each-ref refs/remotes/origin |
+		sed -e "/HEAD$/d" \
+		    -e "s|/remotes/origin/|/heads/|" >../actual
+	) &&
+	# only follow side
+	git for-each-ref refs/heads/side >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch side' '
+	(
+		cd dir_side2 && git fetch &&
+		git for-each-ref refs/remotes/origin |
+		sed -e "/HEAD$/d" \
+		    -e "s|/remotes/origin/|/heads/|" >../actual
+	) &&
+	# only follow side
+	git for-each-ref refs/heads/side >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
+	(
+		cd dir_tag && git fetch &&
+		git for-each-ref refs/tags >../actual
+	) &&
+	git for-each-ref refs/tags >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch with --mirror' '
+	(
+		cd dir_mirror && git fetch &&
+		git for-each-ref refs > ../actual
+	) &&
+	git for-each-ref refs >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch with explicit --branch and --mirror' '
+	(
+		cd dir_mirror_side && git fetch &&
+		git for-each-ref refs > ../actual
+	) &&
+	git for-each-ref refs >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success '--single-branch with detached' '
+	(
+		cd dir_detached && git fetch &&
+		git for-each-ref refs/remotes/origin |
+		sed -e "/HEAD$/d" \
+		    -e "s|/remotes/origin/|/heads/|" >../actual
+	)
+	# nothing
+	>expect &&
+	test_cmp expect actual
+'
+
+test_done
diff --git a/t/t6037-merge-ours-theirs.sh b/t/t6037-merge-ours-theirs.sh
index 2cf42c7..3889eca 100755
--- a/t/t6037-merge-ours-theirs.sh
+++ b/t/t6037-merge-ours-theirs.sh
@@ -53,7 +53,19 @@
 	! grep 1 file
 '
 
-test_expect_success 'pull with -X' '
+test_expect_success 'binary file with -Xours/-Xtheirs' '
+	echo file binary >.gitattributes &&
+
+	git reset --hard master &&
+	git merge -s recursive -X theirs side &&
+	git diff --exit-code side HEAD -- file &&
+
+	git reset --hard master &&
+	git merge -s recursive -X ours side &&
+	git diff --exit-code master HEAD -- file
+'
+
+test_expect_success 'pull passes -X to underlying merge' '
 	git reset --hard master && git pull -s recursive -Xours . side &&
 	git reset --hard master && git pull -s recursive -X ours . side &&
 	git reset --hard master && git pull -s recursive -Xtheirs . side &&
diff --git a/t/t6500-gc.sh b/t/t6500-gc.sh
index 82f3639..b1a6365 100755
--- a/t/t6500-gc.sh
+++ b/t/t6500-gc.sh
@@ -11,7 +11,7 @@
 
 test_expect_success 'gc --gobbledegook' '
 	test_expect_code 129 git gc --nonsense 2>err &&
-	grep "[Uu]sage: git gc" err
+	test_i18ngrep "[Uu]sage: git gc" err
 '
 
 test_expect_success 'gc -h with invalid configuration' '
@@ -22,7 +22,7 @@
 		echo "[gc] pruneexpire = CORRUPT" >>.git/config &&
 		test_expect_code 129 git gc -h >usage 2>&1
 	) &&
-	grep "[Uu]sage" broken/usage
+	test_i18ngrep "[Uu]sage" broken/usage
 '
 
 test_done
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index 56a81cd..5397037 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -438,8 +438,8 @@
 	git checkout second
 '
 
-test_expect_success 'submodule <invalid-path> warns' '
-	test_failure_with_unknown_submodule
+test_expect_success 'submodule <invalid-subcommand> fails' '
+	test_must_fail git submodule no-such-subcommand
 '
 
 test_expect_success 'add submodules without specifying an explicit path' '
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index c206f47..e313ef1 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -80,7 +80,7 @@
 #	dir1/untracked dir2/untracked untracked
 #	dir2/modified  output
 EOF
-	test_cmp expect output
+	test_i18ncmp expect output
 '
 
 cat >expect <<\EOF
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 9e27bbf..5e19598 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -157,7 +157,7 @@
 		>.git/index &&
 		test_expect_code 129 git merge -h 2>usage
 	) &&
-	grep "[Uu]sage: git merge" broken/usage
+	test_i18ngrep "[Uu]sage: git merge" broken/usage
 '
 
 test_expect_success 'reject non-strategy with a git-merge-foo name' '
diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh
index 6fa0c70..bc38737 100755
--- a/t/t7610-mergetool.sh
+++ b/t/t7610-mergetool.sh
@@ -509,4 +509,17 @@
     git reset --hard master >/dev/null 2>&1
 '
 
+test_expect_success 'custom commands override built-ins' '
+    git checkout -b test14 branch1 &&
+    git config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
+    git config mergetool.defaults.trustExitCode true &&
+    test_must_fail git merge master &&
+    git mergetool --no-prompt --tool defaults -- both &&
+    echo master both added >expected &&
+    test_cmp both expected &&
+    git config --unset mergetool.defaults.cmd &&
+    git config --unset mergetool.defaults.trustExitCode &&
+    git reset --hard master >/dev/null 2>&1
+'
+
 test_done
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index 9c3e997..eb1d3f8 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -76,6 +76,17 @@
 	test "$diff" = "branch"
 '
 
+# Ensures that a custom difftool.<tool>.cmd overrides built-ins
+test_expect_success PERL 'custom commands override built-ins' '
+	restore_test_defaults &&
+	git config difftool.defaults.cmd "cat \$REMOTE" &&
+
+	diff=$(git difftool --tool defaults --no-prompt branch) &&
+	test "$diff" = "master" &&
+
+	git config --unset difftool.defaults.cmd
+'
+
 # Ensures that git-difftool ignores bogus --tool values
 test_expect_success PERL 'difftool ignores bad --tool values' '
 	diff=$(git difftool --no-prompt --tool=bad-tool branch)
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index 523d041..91db352 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -250,6 +250,84 @@
 		git -c grep.extendedRegexp=true grep "a+b*c" ab >actual &&
 		test_cmp expected actual
 	'
+
+	test_expect_success "grep $L with grep.patterntype=basic" '
+		echo "ab:a+bc" >expected &&
+		git -c grep.patterntype=basic grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success "grep $L with grep.patterntype=extended" '
+		echo "ab:abc" >expected &&
+		git -c grep.patterntype=extended grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success "grep $L with grep.patterntype=fixed" '
+		echo "ab:a+b*c" >expected &&
+		git -c grep.patterntype=fixed grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success LIBPCRE "grep $L with grep.patterntype=perl" '
+		echo "ab:a+b*c" >expected &&
+		git -c grep.patterntype=perl grep "a\x{2b}b\x{2a}c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success "grep $L with grep.patternType=default and grep.extendedRegexp=true" '
+		echo "ab:abc" >expected &&
+		git \
+			-c grep.patternType=default \
+			-c grep.extendedRegexp=true \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success "grep $L with grep.extendedRegexp=true and grep.patternType=default" '
+		echo "ab:abc" >expected &&
+		git \
+			-c grep.extendedRegexp=true \
+			-c grep.patternType=default \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success 'grep $L with grep.patternType=extended and grep.extendedRegexp=false' '
+		echo "ab:abc" >expected &&
+		git \
+			-c grep.patternType=extended \
+			-c grep.extendedRegexp=false \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success 'grep $L with grep.patternType=basic and grep.extendedRegexp=true' '
+		echo "ab:a+bc" >expected &&
+		git \
+			-c grep.patternType=basic \
+			-c grep.extendedRegexp=true \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success 'grep $L with grep.extendedRegexp=false and grep.patternType=extended' '
+		echo "ab:abc" >expected &&
+		git \
+			-c grep.extendedRegexp=false \
+			-c grep.patternType=extended \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
+
+	test_expect_success 'grep $L with grep.extendedRegexp=true and grep.patternType=basic' '
+		echo "ab:a+bc" >expected &&
+		git \
+			-c grep.extendedRegexp=true \
+			-c grep.patternType=basic \
+			grep "a+b*c" ab >actual &&
+		test_cmp expected actual
+	'
 done
 
 cat >expected <<EOF
@@ -424,31 +502,41 @@
 
 test_expect_success 'log grep (1)' '
 	git log --author=author --pretty=tformat:%s >actual &&
-	( echo third ; echo initial ) >expect &&
+	{
+		echo third && echo initial
+	} >expect &&
 	test_cmp expect actual
 '
 
 test_expect_success 'log grep (2)' '
 	git log --author=" * " -F --pretty=tformat:%s >actual &&
-	( echo second ) >expect &&
+	{
+		echo second
+	} >expect &&
 	test_cmp expect actual
 '
 
 test_expect_success 'log grep (3)' '
 	git log --author="^A U" --pretty=tformat:%s >actual &&
-	( echo third ; echo initial ) >expect &&
+	{
+		echo third && echo initial
+	} >expect &&
 	test_cmp expect actual
 '
 
 test_expect_success 'log grep (4)' '
 	git log --author="frotz\.com>$" --pretty=tformat:%s >actual &&
-	( echo second ) >expect &&
+	{
+		echo second
+	} >expect &&
 	test_cmp expect actual
 '
 
 test_expect_success 'log grep (5)' '
 	git log --author=Thor -F --pretty=tformat:%s >actual &&
-	( echo third ; echo initial ) >expect &&
+	{
+		echo third && echo initial
+	} >expect &&
 	test_cmp expect actual
 '
 
@@ -458,11 +546,19 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'log --grep --author implicitly uses all-match' '
-	# grep matches initial and second but not third
-	# author matches only initial and third
-	git log --author="A U Thor" --grep=s --grep=l --format=%s >actual &&
-	echo initial >expect &&
+test_expect_success 'log with multiple --grep uses union' '
+	git log --grep=i --grep=r --format=%s >actual &&
+	{
+		echo fourth && echo third && echo initial
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --all-match with multiple --grep uses intersection' '
+	git log --all-match --grep=i --grep=r --format=%s >actual &&
+	{
+		echo third
+	} >expect &&
 	test_cmp expect actual
 '
 
@@ -474,7 +570,47 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'log with --grep and multiple --author uses all-match' '
+test_expect_success 'log --all-match with multiple --author still uses union' '
+	git log --all-match --author="Thor" --author="Aster" --format=%s >actual &&
+	{
+	    echo third && echo second && echo initial
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --grep --author uses intersection' '
+	# grep matches only third and fourth
+	# author matches only initial and third
+	git log --author="A U Thor" --grep=r --format=%s >actual &&
+	{
+		echo third
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --grep --grep --author takes union of greps and intersects with author' '
+	# grep matches initial and second but not third
+	# author matches only initial and third
+	git log --author="A U Thor" --grep=s --grep=l --format=%s >actual &&
+	{
+		echo initial
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log ---all-match -grep --author --author still takes union of authors and intersects with grep' '
+	# grep matches only initial and third
+	# author matches all but second
+	git log --all-match --author="Thor" --author="Night" --grep=i --format=%s >actual &&
+	{
+	    echo third && echo initial
+	} >expect &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --grep --author --author takes union of authors and intersects with grep' '
+	# grep matches only initial and third
+	# author matches all but second
 	git log --author="Thor" --author="Night" --grep=i --format=%s >actual &&
 	{
 	    echo third && echo initial
@@ -482,9 +618,13 @@
 	test_cmp expect actual
 '
 
-test_expect_success 'log with --grep and multiple --author uses all-match' '
-	git log --author="Thor" --author="Night" --grep=q --format=%s >actual &&
-	>expect &&
+test_expect_success 'log --all-match --grep --grep --author takes intersection' '
+	# grep matches only third
+	# author matches only initial and third
+	git log --all-match --author="A U Thor" --grep=i --grep=r --format=%s >actual &&
+	{
+		echo third
+	} >expect &&
 	test_cmp expect actual
 '
 
@@ -761,44 +901,147 @@
 	test_must_fail git grep -G "a["
 '
 
+test_expect_success 'grep invalidpattern properly dies with grep.patternType=basic' '
+	test_must_fail git -c grep.patterntype=basic grep "a["
+'
+
 test_expect_success 'grep -E invalidpattern properly dies ' '
 	test_must_fail git grep -E "a["
 '
 
+test_expect_success 'grep invalidpattern properly dies with grep.patternType=extended' '
+	test_must_fail git -c grep.patterntype=extended grep "a["
+'
+
 test_expect_success LIBPCRE 'grep -P invalidpattern properly dies ' '
 	test_must_fail git grep -P "a["
 '
 
+test_expect_success LIBPCRE 'grep invalidpattern properly dies with grep.patternType=perl' '
+	test_must_fail git -c grep.patterntype=perl grep "a["
+'
+
 test_expect_success 'grep -G -E -F pattern' '
 	echo "ab:a+b*c" >expected &&
 	git grep -G -E -F "a+b*c" ab >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success 'grep pattern with grep.patternType=basic, =extended, =fixed' '
+	echo "ab:a+b*c" >expected &&
+	git \
+		-c grep.patterntype=basic \
+		-c grep.patterntype=extended \
+		-c grep.patterntype=fixed \
+		grep "a+b*c" ab >actual &&
+	test_cmp expected actual
+'
+
 test_expect_success 'grep -E -F -G pattern' '
 	echo "ab:a+bc" >expected &&
 	git grep -E -F -G "a+b*c" ab >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success 'grep pattern with grep.patternType=extended, =fixed, =basic' '
+	echo "ab:a+bc" >expected &&
+	git \
+		-c grep.patterntype=extended \
+		-c grep.patterntype=fixed \
+		-c grep.patterntype=basic \
+		grep "a+b*c" ab >actual &&
+	test_cmp expected actual
+'
+
 test_expect_success 'grep -F -G -E pattern' '
 	echo "ab:abc" >expected &&
 	git grep -F -G -E "a+b*c" ab >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =extended' '
+	echo "ab:abc" >expected &&
+	git \
+		-c grep.patterntype=fixed \
+		-c grep.patterntype=basic \
+		-c grep.patterntype=extended \
+		grep "a+b*c" ab >actual &&
+	test_cmp expected actual
+'
+
 test_expect_success 'grep -G -F -P -E pattern' '
 	>empty &&
 	test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual &&
 	test_cmp empty actual
 '
 
+test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =perl, =extended' '
+	>empty &&
+	test_must_fail git \
+		-c grep.patterntype=fixed \
+		-c grep.patterntype=basic \
+		-c grep.patterntype=perl \
+		-c grep.patterntype=extended \
+		grep "a\x{2b}b\x{2a}c" ab >actual &&
+	test_cmp empty actual
+'
+
 test_expect_success LIBPCRE 'grep -G -F -E -P pattern' '
 	echo "ab:a+b*c" >expected &&
 	git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual &&
 	test_cmp expected actual
 '
 
+test_expect_success LIBPCRE 'grep pattern with grep.patternType=fixed, =basic, =extended, =perl' '
+	echo "ab:a+b*c" >expected &&
+	git \
+		-c grep.patterntype=fixed \
+		-c grep.patterntype=basic \
+		-c grep.patterntype=extended \
+		-c grep.patterntype=perl \
+		grep "a\x{2b}b\x{2a}c" ab >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success LIBPCRE 'grep -P pattern with grep.patternType=fixed' '
+	echo "ab:a+b*c" >expected &&
+	git \
+		-c grep.patterntype=fixed \
+		grep -P "a\x{2b}b\x{2a}c" ab >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'grep -F pattern with grep.patternType=basic' '
+	echo "ab:a+b*c" >expected &&
+	git \
+		-c grep.patterntype=basic \
+		grep -F "*c" ab >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'grep -G pattern with grep.patternType=fixed' '
+	{
+		echo "ab:a+b*c"
+		echo "ab:a+bc"
+	} >expected &&
+	git \
+		-c grep.patterntype=fixed \
+		grep -G "a+b" ab >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'grep -E pattern with grep.patternType=fixed' '
+	{
+		echo "ab:a+b*c"
+		echo "ab:a+bc"
+		echo "ab:abc"
+	} >expected &&
+	git \
+		-c grep.patterntype=fixed \
+		grep -E "a+" ab >actual &&
+	test_cmp expected actual
+'
+
 test_config() {
 	git config "$1" "$2" &&
 	test_when_finished "git config --unset $1"
diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh
index 289fc31..ee73013 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/t/t9107-git-svn-migrate.sh
@@ -27,15 +27,17 @@
 head=`git rev-parse --verify refs/heads/git-svn-HEAD^0`
 test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'"
 
+svnrepo_escaped=`echo $svnrepo | sed 's/ /%20/'`
+
 test_expect_success 'initialize old-style (v0) git svn layout' '
 	mkdir -p "$GIT_DIR"/git-svn/info "$GIT_DIR"/svn/info &&
 	echo "$svnrepo" > "$GIT_DIR"/git-svn/info/url &&
 	echo "$svnrepo" > "$GIT_DIR"/svn/info/url &&
 	git svn migrate &&
-	! test -d "$GIT_DIR"/git svn &&
+	! test -d "$GIT_DIR"/git-svn &&
 	git rev-parse --verify refs/${remotes_git_svn}^0 &&
 	git rev-parse --verify refs/remotes/svn^0 &&
-	test "$(git config --get svn-remote.svn.url)" = "$svnrepo" &&
+	test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" &&
 	test `git config --get svn-remote.svn.fetch` = \
              ":refs/${remotes_git_svn}"
 	'
diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh
index 63fc982..193d3ca 100755
--- a/t/t9118-git-svn-funky-branch-names.sh
+++ b/t/t9118-git-svn-funky-branch-names.sh
@@ -32,6 +32,11 @@
 	start_httpd
 	'
 
+# SVN 1.7 will truncate "not-a%40{0]" to just "not-a".
+# Look at what SVN wound up naming the branch and use that.
+# Be sure to escape the @ if it shows up.
+non_reflog=`svn_cmd ls "$svnrepo/pr ject/branches" | grep not-a | sed 's/\///' | sed 's/@/%40/'`
+
 test_expect_success 'test clone with funky branch names' '
 	git svn clone -s "$svnrepo/pr ject" project &&
 	(
@@ -42,7 +47,7 @@
 		git rev-parse "refs/remotes/%2Eleading_dot" &&
 		git rev-parse "refs/remotes/trailing_dot%2E" &&
 		git rev-parse "refs/remotes/trailing_dotlock%2Elock" &&
-		git rev-parse "refs/remotes/not-a%40{0}reflog"
+		git rev-parse "refs/remotes/$non_reflog"
 	)
 	'
 
diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh
index 99fe16b..9730821 100755
--- a/t/t9801-git-p4-branch.sh
+++ b/t/t9801-git-p4-branch.sh
@@ -410,6 +410,83 @@
 		test_path_is_missing file3
 	)
 '
+
+# From a report in http://stackoverflow.com/questions/11893688
+# where --use-client-spec caused branch prefixes not to be removed;
+# every file in git appeared into a subdirectory of the branch name.
+test_expect_success 'use-client-spec detect-branches setup' '
+	rm -rf "$cli" &&
+	mkdir "$cli" &&
+	(
+		cd "$cli" &&
+		client_view "//depot/usecs/... //client/..." &&
+		mkdir b1 &&
+		echo b1/b1-file1 >b1/b1-file1 &&
+		p4 add b1/b1-file1 &&
+		p4 submit -d "b1/b1-file1" &&
+
+		p4 integrate //depot/usecs/b1/... //depot/usecs/b2/... &&
+		p4 submit -d "b1 -> b2" &&
+		p4 branch -i <<-EOF &&
+		Branch: b2
+		View: //depot/usecs/b1/... //depot/usecs/b2/...
+		EOF
+
+		echo b2/b2-file2 >b2/b2-file2 &&
+		p4 add b2/b2-file2 &&
+		p4 submit -d "b2/b2-file2"
+	)
+'
+
+test_expect_success 'use-client-spec detect-branches files in top-level' '
+	test_when_finished cleanup_git &&
+	test_create_repo "$git" &&
+	(
+		cd "$git" &&
+		git p4 sync --detect-branches --use-client-spec //depot/usecs@all &&
+		git checkout -b master p4/usecs/b1 &&
+		test_path_is_file b1-file1 &&
+		test_path_is_missing b2-file2 &&
+		test_path_is_missing b1 &&
+		test_path_is_missing b2 &&
+
+		git checkout -b b2 p4/usecs/b2 &&
+		test_path_is_file b1-file1 &&
+		test_path_is_file b2-file2 &&
+		test_path_is_missing b1 &&
+		test_path_is_missing b2
+	)
+'
+
+test_expect_success 'use-client-spec detect-branches skips branches setup' '
+	(
+		cd "$cli" &&
+
+		p4 integrate //depot/usecs/b1/... //depot/usecs/b3/... &&
+		p4 submit -d "b1 -> b3" &&
+		p4 branch -i <<-EOF &&
+		Branch: b3
+		View: //depot/usecs/b1/... //depot/usecs/b3/...
+		EOF
+
+		echo b3/b3-file3 >b3/b3-file3 &&
+		p4 add b3/b3-file3 &&
+		p4 submit -d "b3/b3-file3"
+	)
+'
+
+test_expect_success 'use-client-spec detect-branches skips branches' '
+	client_view "//depot/usecs/... //client/..." \
+		    "-//depot/usecs/b3/... //client/b3/..." &&
+	test_when_finished cleanup_git &&
+	test_create_repo "$git" &&
+	(
+		cd "$git" &&
+		git p4 sync --detect-branches --use-client-spec //depot/usecs@all &&
+		test_must_fail git rev-parse refs/remotes/p4/usecs/b3
+	)
+'
+
 test_expect_success 'kill p4d' '
 	kill_p4d
 '
diff --git a/t/t9805-git-p4-skip-submit-edit.sh b/t/t9805-git-p4-skip-submit-edit.sh
index fb3c8ec..ff2cc79 100755
--- a/t/t9805-git-p4-skip-submit-edit.sh
+++ b/t/t9805-git-p4-skip-submit-edit.sh
@@ -38,7 +38,7 @@
 		cd "$git" &&
 		echo line >>file1 &&
 		git commit -a -m "change 3 (not really)" &&
-		printf "bad response\nn\n" | git p4 submit &&
+		printf "bad response\nn\n" | test_expect_code 1 git p4 submit &&
 		p4 changes //depot/... >wc &&
 		test_line_count = 2 wc
 	)
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 9394fd4..0ae048f 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -54,6 +54,47 @@
 	)
 '
 
+test_expect_success 'submit --dry-run' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		test_commit "dry-run1" &&
+		test_commit "dry-run2" &&
+		git p4 submit --dry-run >out &&
+		test_i18ngrep "Would apply" out
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing "dry-run1.t" &&
+		test_path_is_missing "dry-run2.t"
+	)
+'
+
+test_expect_success 'submit --dry-run --export-labels' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		echo dry-run1 >dry-run1 &&
+		git add dry-run1 &&
+		git commit -m "dry-run1" dry-run1 &&
+		git config git-p4.skipSubmitEdit true &&
+		git p4 submit &&
+		echo dry-run2 >dry-run2 &&
+		git add dry-run2 &&
+		git commit -m "dry-run2" dry-run2 &&
+		git tag -m "dry-run-tag1" dry-run-tag1 HEAD^ &&
+		git p4 submit --dry-run --export-labels >out &&
+		test_i18ngrep "Would create p4 label" out
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_file "dry-run1" &&
+		test_path_is_missing "dry-run2"
+	)
+'
+
 test_expect_success 'submit with allowSubmit' '
 	test_when_finished cleanup_git &&
 	git p4 clone --dest="$git" //depot &&
@@ -334,6 +375,30 @@
 		make_job $(cat jobname) &&
 		test_must_fail git p4 submit 2>err &&
 		test_i18ngrep "Unknown field name" err
+	) &&
+	(
+		cd "$cli" &&
+		p4 revert desc6 &&
+		rm desc6
+	)
+'
+
+test_expect_success 'submit --prepare-p4-only' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		echo prep-only-add >prep-only-add &&
+		git add prep-only-add &&
+		git commit -m "prep only add" &&
+		git p4 submit --prepare-p4-only >out &&
+		test_i18ngrep "prepared for submission" out &&
+		test_i18ngrep "must be deleted" out
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_file prep-only-add &&
+		p4 fstat -T action prep-only-add | grep -w add
 	)
 '
 
diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh
index 7d993ef..281be29 100755
--- a/t/t9809-git-p4-client-view.sh
+++ b/t/t9809-git-p4-client-view.sh
@@ -9,23 +9,6 @@
 '
 
 #
-# Construct a client with this list of View lines
-#
-client_view() {
-	(
-		cat <<-EOF &&
-		Client: client
-		Description: client
-		Root: $cli
-		View:
-		EOF
-		for arg ; do
-			printf "\t$arg\n"
-		done
-	) | p4 client -i
-}
-
-#
 # Verify these files exist, exactly.  Caller creates
 # a list of files in file "files".
 #
diff --git a/t/t9810-git-p4-rcs.sh b/t/t9810-git-p4-rcs.sh
index e9daa9c..fe30ad8 100755
--- a/t/t9810-git-p4-rcs.sh
+++ b/t/t9810-git-p4-rcs.sh
@@ -160,9 +160,6 @@
 # the cli file so that submit will get a conflict.  Make sure that
 # scrubbing doesn't make a mess of things.
 #
-# Assumes that git-p4 exits leaving the p4 file open, with the
-# conflict-generating patch unapplied.
-#
 # This might happen only if the git repo is behind the p4 repo at
 # submit time, and there is a conflict.
 #
@@ -181,14 +178,11 @@
 			sed -i "s/^line5/line5 p4 edit/" file_text &&
 			p4 submit -d "file5 p4 edit"
 		) &&
-		! git p4 submit &&
+		echo s | test_expect_code 1 git p4 submit &&
 		(
-			# exepct something like:
-			#    file_text - file(s) not opened on this client
-			# but not copious diff output
+			# make sure the file is not left open
 			cd "$cli" &&
-			p4 diff file_text >wc &&
-			test_line_count = 1 wc
+			! p4 fstat -T action file_text
 		)
 	)
 '
@@ -343,44 +337,6 @@
 	)
 '
 
-# Check that the existing merge conflict handling still works.
-# Modify kwfile1.c in git, and delete in p4. We should be able
-# to skip the git commit.
-#
-test_expect_success 'merge conflict handling still works' '
-	test_when_finished cleanup_git &&
-	(
-		cd "$cli" &&
-		echo "Hello:\$Id\$" >merge2.c &&
-		echo "World" >>merge2.c &&
-		p4 add -t ktext merge2.c &&
-		p4 submit -d "add merge test file"
-	) &&
-	git p4 clone --dest="$git" //depot &&
-	(
-		cd "$git" &&
-		sed -e "/Hello/d" merge2.c >merge2.c.tmp &&
-		mv merge2.c.tmp merge2.c &&
-		git add merge2.c &&
-		git commit -m "Modifying merge2.c"
-	) &&
-	(
-		cd "$cli" &&
-		p4 delete merge2.c &&
-		p4 submit -d "remove merge test file"
-	) &&
-	(
-		cd "$git" &&
-		test -f merge2.c &&
-		git config git-p4.skipSubmitEdit true &&
-		git config git-p4.attemptRCSCleanup true &&
-		!(echo "s" | git p4 submit) &&
-		git rebase --skip &&
-		! test -f merge2.c
-	)
-'
-
-
 test_expect_success 'kill p4d' '
 	kill_p4d
 '
diff --git a/t/t9815-git-p4-submit-fail.sh b/t/t9815-git-p4-submit-fail.sh
new file mode 100755
index 0000000..d2b7b3d
--- /dev/null
+++ b/t/t9815-git-p4-submit-fail.sh
@@ -0,0 +1,429 @@
+#!/bin/sh
+
+test_description='git p4 submit failure handling'
+
+. ./lib-git-p4.sh
+
+test_expect_success 'start p4d' '
+	start_p4d
+'
+
+test_expect_success 'init depot' '
+	(
+		cd "$cli" &&
+		p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
+		echo line1 >file1 &&
+		p4 add file1 &&
+		p4 submit -d "line1 in file1"
+	)
+'
+
+test_expect_success 'conflict on one commit' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line2 >>file1 &&
+		p4 submit -d "line2 in file1"
+	) &&
+	(
+		# now this commit should cause a conflict
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		echo line3 >>file1 &&
+		git add file1 &&
+		git commit -m "line3 in file1 will conflict" &&
+		test_expect_code 1 git p4 submit >out &&
+		test_i18ngrep "No commits applied" out
+	)
+'
+
+test_expect_success 'conflict on second of two commits' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line3 >>file1 &&
+		p4 submit -d "line3 in file1"
+	) &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# this commit is okay
+		test_commit "first_commit_okay" &&
+		# now this submit should cause a conflict
+		echo line4 >>file1 &&
+		git add file1 &&
+		git commit -m "line4 in file1 will conflict" &&
+		test_expect_code 1 git p4 submit >out &&
+		test_i18ngrep "Applied only the commits" out
+	)
+'
+
+test_expect_success 'conflict on first of two commits, skip' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line4 >>file1 &&
+		p4 submit -d "line4 in file1"
+	) &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# this submit should cause a conflict
+		echo line5 >>file1 &&
+		git add file1 &&
+		git commit -m "line5 in file1 will conflict" &&
+		# but this commit is okay
+		test_commit "okay_commit_after_skip" &&
+		echo s | test_expect_code 1 git p4 submit >out &&
+		test_i18ngrep "Applied only the commits" out
+	)
+'
+
+test_expect_success 'conflict on first of two commits, quit' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line7 >>file1 &&
+		p4 submit -d "line7 in file1"
+	) &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# this submit should cause a conflict
+		echo line8 >>file1 &&
+		git add file1 &&
+		git commit -m "line8 in file1 will conflict" &&
+		# but this commit is okay
+		test_commit "okay_commit_after_quit" &&
+		echo q | test_expect_code 1 git p4 submit >out &&
+		test_i18ngrep "No commits applied" out
+	)
+'
+
+test_expect_success 'conflict cli and config options' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		git p4 submit --conflict=ask &&
+		git p4 submit --conflict=skip &&
+		git p4 submit --conflict=quit &&
+		test_expect_code 2 git p4 submit --conflict=foo &&
+		test_expect_code 2 git p4 submit --conflict &&
+		git config git-p4.conflict foo &&
+		test_expect_code 1 git p4 submit &&
+		git config --unset git-p4.conflict &&
+		git p4 submit
+	)
+'
+
+test_expect_success 'conflict on first of two commits, --conflict=skip' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line9 >>file1 &&
+		p4 submit -d "line9 in file1"
+	) &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# this submit should cause a conflict
+		echo line10 >>file1 &&
+		git add file1 &&
+		git commit -m "line10 in file1 will conflict" &&
+		# but this commit is okay
+		test_commit "okay_commit_after_auto_skip" &&
+		test_expect_code 1 git p4 submit --conflict=skip >out &&
+		test_i18ngrep "Applied only the commits" out
+	)
+'
+
+test_expect_success 'conflict on first of two commits, --conflict=quit' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo line11 >>file1 &&
+		p4 submit -d "line11 in file1"
+	) &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# this submit should cause a conflict
+		echo line12 >>file1 &&
+		git add file1 &&
+		git commit -m "line12 in file1 will conflict" &&
+		# but this commit is okay
+		test_commit "okay_commit_after_auto_quit" &&
+		test_expect_code 1 git p4 submit --conflict=quit >out &&
+		test_i18ngrep "No commits applied" out
+	)
+'
+
+#
+# Cleanup after submit fail, all cases.  Some modifications happen
+# before trying to apply the patch.  Make sure these are unwound
+# properly.  Put each one in a diff along with something that will
+# obviously conflict.  Make sure it is back to normal after.
+#
+
+test_expect_success 'cleanup edit p4 populate' '
+	(
+		cd "$cli" &&
+		echo text file >text &&
+		p4 add text &&
+		echo text+x file >text+x &&
+		chmod 755 text+x &&
+		p4 add text+x &&
+		p4 submit -d "populate p4"
+	)
+'
+
+setup_conflict() {
+	# clone before modifying file1 to force it to conflict
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	# ticks outside subshells
+	test_tick &&
+	(
+		cd "$cli" &&
+		p4 open file1 &&
+		echo $test_tick >>file1 &&
+		p4 submit -d "$test_tick in file1"
+	) &&
+	test_tick &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		# easy conflict
+		echo $test_tick >>file1 &&
+		git add file1
+		# caller will add more and submit
+	)
+}
+
+test_expect_success 'cleanup edit after submit fail' '
+	setup_conflict &&
+	(
+		cd "$git" &&
+		echo another line >>text &&
+		git add text &&
+		git commit -m "conflict" &&
+		test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		# make sure it is not open
+		! p4 fstat -T action text
+	)
+'
+
+test_expect_success 'cleanup add after submit fail' '
+	setup_conflict &&
+	(
+		cd "$git" &&
+		echo new file >textnew &&
+		git add textnew &&
+		git commit -m "conflict" &&
+		test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		# make sure it is not there
+		# and that p4 thinks it is not added
+		#   P4 returns 0 both for "not there but added" and
+		#   "not there", so grep.
+		test_path_is_missing textnew &&
+		p4 fstat -T action textnew 2>&1 | grep "no such file"
+	)
+'
+
+test_expect_success 'cleanup delete after submit fail' '
+	setup_conflict &&
+	(
+		cd "$git" &&
+		git rm text+x &&
+		git commit -m "conflict" &&
+		test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		# make sure it is there
+		test_path_is_file text+x &&
+		! p4 fstat -T action text+x
+	)
+'
+
+test_expect_success 'cleanup copy after submit fail' '
+	setup_conflict &&
+	(
+		cd "$git" &&
+		cp text text2 &&
+		git add text2 &&
+		git commit -m "conflict" &&
+		git config git-p4.detectCopies true &&
+		git config git-p4.detectCopiesHarder true &&
+		# make sure setup is okay
+		git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 &&
+		test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing text2 &&
+		p4 fstat -T action text2 2>&1 | grep "no such file"
+	)
+'
+
+test_expect_success 'cleanup rename after submit fail' '
+	setup_conflict &&
+	(
+		cd "$git" &&
+		git mv text text2 &&
+		git commit -m "conflict" &&
+		git config git-p4.detectRenames true &&
+		# make sure setup is okay
+		git diff-tree -r -M HEAD | grep text2 | grep R100 &&
+		test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing text2 &&
+		p4 fstat -T action text2 2>&1 | grep "no such file"
+	)
+'
+
+#
+# Cleanup after deciding not to submit during editTemplate.  This
+# involves unwinding more work, because files have been added, deleted
+# and chmod-ed now.  Same approach as above.
+#
+
+test_expect_success 'cleanup edit after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		echo line >>text &&
+		git add text &&
+		git commit -m text &&
+		echo n | test_expect_code 1 git p4 submit &&
+		git reset --hard HEAD^
+	) &&
+	(
+		cd "$cli" &&
+		! p4 fstat -T action text &&
+		test_cmp "$git"/text text
+	)
+'
+
+test_expect_success 'cleanup add after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		echo line >textnew &&
+		git add textnew &&
+		git commit -m textnew &&
+		echo n | test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing textnew &&
+		p4 fstat -T action textnew 2>&1 | grep "no such file"
+	)
+'
+
+test_expect_success 'cleanup delete after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		git rm text &&
+		git commit -m "rm text" &&
+		echo n | test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_file text &&
+		! p4 fstat -T action text
+	)
+'
+
+test_expect_success 'cleanup copy after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		cp text text2 &&
+		git add text2 &&
+		git commit -m text2 &&
+		git config git-p4.detectCopies true &&
+		git config git-p4.detectCopiesHarder true &&
+		git diff-tree -r -C --find-copies-harder HEAD | grep text2 | grep C100 &&
+		echo n | test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing text2 &&
+		p4 fstat -T action text2 2>&1 | grep "no such file"
+	)
+'
+
+test_expect_success 'cleanup rename after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		git mv text text2 &&
+		git commit -m text2 &&
+		git config git-p4.detectRenames true &&
+		git diff-tree -r -M HEAD | grep text2 | grep R100 &&
+		echo n | test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_missing text2 &&
+		p4 fstat -T action text2 2>&1 | grep "no such file"
+		test_path_is_file text &&
+		! p4 fstat -T action text
+	)
+'
+
+test_expect_success 'cleanup chmod after submit cancel' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		chmod u+x text &&
+		chmod u-x text+x &&
+		git add text text+x &&
+		git commit -m "chmod texts" &&
+		echo n | test_expect_code 1 git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		test_path_is_file text &&
+		! p4 fstat -T action text &&
+		stat --format=%A text | egrep ^-r-- &&
+		test_path_is_file text+x &&
+		! p4 fstat -T action text+x &&
+		stat --format=%A text+x | egrep ^-r-x
+	)
+'
+
+test_expect_success 'kill p4d' '
+	kill_p4d
+'
+
+test_done
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 9bc57d2..8889ba5 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -144,11 +144,22 @@
 
 test_commit () {
 	notick= &&
-	if test "z$1" = "z--notick"
-	then
-		notick=yes
+	signoff= &&
+	while test $# != 0
+	do
+		case "$1" in
+		--notick)
+			notick=yes
+			;;
+		--signoff)
+			signoff="$1"
+			;;
+		*)
+			break
+			;;
+		esac
 		shift
-	fi &&
+	done &&
 	file=${2:-"$1.t"} &&
 	echo "${3-$1}" > "$file" &&
 	git add "$file" &&
@@ -156,7 +167,7 @@
 	then
 		test_tick
 	fi &&
-	git commit -m "$1" &&
+	git commit $signoff -m "$1" &&
 	git tag "$1"
 }
 
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 78c4286..514282c 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -15,22 +15,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see http://www.gnu.org/licenses/ .
 
-# if --tee was passed, write the output not only to the terminal, but
-# additionally to the file test-results/$BASENAME.out, too.
-case "$GIT_TEST_TEE_STARTED, $* " in
-done,*)
-	# do not redirect again
-	;;
-*' --tee '*|*' --va'*)
-	mkdir -p test-results
-	BASE=test-results/$(basename "$0" .sh)
-	(GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
-	 echo $? > $BASE.exit) | tee $BASE.out
-	test "$(cat $BASE.exit)" = 0
-	exit
-	;;
-esac
-
 # Keep the original TERM for say_color
 ORIGINAL_TERM=$TERM
 
@@ -51,9 +35,34 @@
 fi
 GIT_BUILD_DIR="$TEST_DIRECTORY"/..
 
+################################################################
+# It appears that people try to run tests without building...
+"$GIT_BUILD_DIR/git" >/dev/null
+if test $? != 1
+then
+	echo >&2 'error: you do not seem to have built git yet.'
+	exit 1
+fi
+
 . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
 export PERL_PATH SHELL_PATH
 
+# if --tee was passed, write the output not only to the terminal, but
+# additionally to the file test-results/$BASENAME.out, too.
+case "$GIT_TEST_TEE_STARTED, $* " in
+done,*)
+	# do not redirect again
+	;;
+*' --tee '*|*' --va'*)
+	mkdir -p test-results
+	BASE=test-results/$(basename "$0" .sh)
+	(GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
+	 echo $? > $BASE.exit) | tee $BASE.out
+	test "$(cat $BASE.exit)" = 0
+	exit
+	;;
+esac
+
 # For repeatability, reset the environment to known value.
 LANG=C
 LC_ALL=C
@@ -93,6 +102,27 @@
 export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
 export EDITOR
 
+# Add libc MALLOC and MALLOC_PERTURB test
+# only if we are not executing the test with valgrind
+if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null ||
+   test -n "$TEST_NO_MALLOC_CHECK"
+then
+	setup_malloc_check () {
+		: nothing
+	}
+	teardown_malloc_check () {
+		: nothing
+	}
+else
+	setup_malloc_check () {
+		MALLOC_CHECK_=3	MALLOC_PERTURB_=165
+		export MALLOC_CHECK_ MALLOC_PERTURB_
+	}
+	teardown_malloc_check () {
+		unset MALLOC_CHECK_ MALLOC_PERTURB_
+	}
+fi
+
 # Protect ourselves from common misconfiguration to export
 # CDPATH into the environment
 unset CDPATH
@@ -100,12 +130,12 @@
 unset GREP_OPTIONS
 
 case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in
-	1|2|true)
-		echo "* warning: Some tests will not work if GIT_TRACE" \
-			"is set as to trace on STDERR ! *"
-		echo "* warning: Please set GIT_TRACE to something" \
-			"other than 1, 2 or true ! *"
-		;;
+1|2|true)
+	echo "* warning: Some tests will not work if GIT_TRACE" \
+		"is set as to trace on STDERR ! *"
+	echo "* warning: Please set GIT_TRACE to something" \
+		"other than 1, 2 or true ! *"
+	;;
 esac
 
 # Convenience
@@ -172,17 +202,23 @@
 	esac
 done
 
-if test -n "$color"; then
+if test -n "$color"
+then
 	say_color () {
 		(
 		TERM=$ORIGINAL_TERM
 		export TERM
 		case "$1" in
-			error) tput bold; tput setaf 1;; # bold red
-			skip)  tput bold; tput setaf 2;; # bold green
-			pass)  tput setaf 2;;            # green
-			info)  tput setaf 3;;            # brown
-			*) test -n "$quiet" && return;;
+		error)
+			tput bold; tput setaf 1;; # bold red
+		skip)
+			tput bold; tput setaf 2;; # bold green
+		pass)
+			tput setaf 2;;            # green
+		info)
+			tput setaf 3;;            # brown
+		*)
+			test -n "$quiet" && return;;
 		esac
 		shift
 		printf "%s" "$*"
@@ -296,9 +332,12 @@
 
 	if test -z "$immediate" || test $eval_ret = 0 || test -n "$expecting_failure"
 	then
+		setup_malloc_check
 		test_eval_ "$test_cleanup"
+		teardown_malloc_check
 	fi
-	if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"; then
+	if test "$verbose" = "t" && test -n "$HARNESS_ACTIVE"
+	then
 		echo ""
 	fi
 	return "$eval_ret"
@@ -346,7 +385,8 @@
 test_done () {
 	GIT_EXIT_OK=t
 
-	if test -z "$HARNESS_ACTIVE"; then
+	if test -z "$HARNESS_ACTIVE"
+	then
 		test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
 		mkdir -p "$test_results_dir"
 		test_results_path="$test_results_dir/${0%.sh}-$$.counts"
@@ -375,10 +415,18 @@
 	case "$test_failure" in
 	0)
 		# Maybe print SKIP message
+		if test -n "$skip_all" && test $test_count -gt 0
+		then
+			error "Can't use skip_all after running some tests"
+		fi
 		[ -z "$skip_all" ] || skip_all=" # SKIP $skip_all"
 
-		if test $test_external_has_tap -eq 0; then
-			say_color pass "# passed all $msg"
+		if test $test_external_has_tap -eq 0
+		then
+			if test $test_count -gt 0
+			then
+				say_color pass "# passed all $msg"
+			fi
 			say "1..$test_count$skip_all"
 		fi
 
@@ -391,7 +439,8 @@
 		exit 0 ;;
 
 	*)
-		if test $test_external_has_tap -eq 0; then
+		if test $test_external_has_tap -eq 0
+		then
 			say_color error "# failed $test_failure among $msg"
 			say "1..$test_count"
 		fi
@@ -471,22 +520,26 @@
 	PATH=$GIT_VALGRIND/bin:$PATH
 	GIT_EXEC_PATH=$GIT_VALGRIND/bin
 	export GIT_VALGRIND
-elif test -n "$GIT_TEST_INSTALLED" ; then
+elif test -n "$GIT_TEST_INSTALLED"
+then
 	GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  ||
 	error "Cannot run git from $GIT_TEST_INSTALLED."
 	PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH
 	GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH}
 else # normal case, use ../bin-wrappers only unless $with_dashes:
 	git_bin_dir="$GIT_BUILD_DIR/bin-wrappers"
-	if ! test -x "$git_bin_dir/git" ; then
-		if test -z "$with_dashes" ; then
+	if ! test -x "$git_bin_dir/git"
+	then
+		if test -z "$with_dashes"
+		then
 			say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH"
 		fi
 		with_dashes=t
 	fi
 	PATH="$git_bin_dir:$PATH"
 	GIT_EXEC_PATH=$GIT_BUILD_DIR
-	if test -n "$with_dashes" ; then
+	if test -n "$with_dashes"
+	then
 		PATH="$GIT_BUILD_DIR:$PATH"
 	fi
 fi
@@ -521,7 +574,8 @@
 	}
 fi
 
-if ! test -x "$GIT_BUILD_DIR"/test-chmtime; then
+if ! test -x "$GIT_BUILD_DIR"/test-chmtime
+then
 	echo >&2 'You need to build test-chmtime:'
 	echo >&2 'Run "make test-chmtime" in the source (toplevel) directory'
 	exit 1
@@ -544,7 +598,8 @@
 HOME="$TRASH_DIRECTORY"
 export HOME
 
-if test -z "$TEST_NO_CREATE_REPO"; then
+if test -z "$TEST_NO_CREATE_REPO"
+then
 	test_create_repo "$test"
 else
 	mkdir -p "$test"
diff --git a/test-string-list.c b/test-string-list.c
new file mode 100644
index 0000000..4693295
--- /dev/null
+++ b/test-string-list.c
@@ -0,0 +1,123 @@
+#include "cache.h"
+#include "string-list.h"
+
+/*
+ * Parse an argument into a string list.  arg should either be a
+ * ':'-separated list of strings, or "-" to indicate an empty string
+ * list (as opposed to "", which indicates a string list containing a
+ * single empty string).  list->strdup_strings must be set.
+ */
+static void parse_string_list(struct string_list *list, const char *arg)
+{
+	if (!strcmp(arg, "-"))
+		return;
+
+	(void)string_list_split(list, arg, ':', -1);
+}
+
+static void write_list(const struct string_list *list)
+{
+	int i;
+	for (i = 0; i < list->nr; i++)
+		printf("[%d]: \"%s\"\n", i, list->items[i].string);
+}
+
+static void write_list_compact(const struct string_list *list)
+{
+	int i;
+	if (!list->nr)
+		printf("-\n");
+	else {
+		printf("%s", list->items[0].string);
+		for (i = 1; i < list->nr; i++)
+			printf(":%s", list->items[i].string);
+		printf("\n");
+	}
+}
+
+static int prefix_cb(struct string_list_item *item, void *cb_data)
+{
+	const char *prefix = (const char *)cb_data;
+	return !prefixcmp(item->string, prefix);
+}
+
+int main(int argc, char **argv)
+{
+	if (argc == 5 && !strcmp(argv[1], "split")) {
+		struct string_list list = STRING_LIST_INIT_DUP;
+		int i;
+		const char *s = argv[2];
+		int delim = *argv[3];
+		int maxsplit = atoi(argv[4]);
+
+		i = string_list_split(&list, s, delim, maxsplit);
+		printf("%d\n", i);
+		write_list(&list);
+		string_list_clear(&list, 0);
+		return 0;
+	}
+
+	if (argc == 5 && !strcmp(argv[1], "split_in_place")) {
+		struct string_list list = STRING_LIST_INIT_NODUP;
+		int i;
+		char *s = xstrdup(argv[2]);
+		int delim = *argv[3];
+		int maxsplit = atoi(argv[4]);
+
+		i = string_list_split_in_place(&list, s, delim, maxsplit);
+		printf("%d\n", i);
+		write_list(&list);
+		string_list_clear(&list, 0);
+		free(s);
+		return 0;
+	}
+
+	if (argc == 4 && !strcmp(argv[1], "filter")) {
+		/*
+		 * Retain only the items that have the specified prefix.
+		 * Arguments: list|- prefix
+		 */
+		struct string_list list = STRING_LIST_INIT_DUP;
+		const char *prefix = argv[3];
+
+		parse_string_list(&list, argv[2]);
+		filter_string_list(&list, 0, prefix_cb, (void *)prefix);
+		write_list_compact(&list);
+		string_list_clear(&list, 0);
+		return 0;
+	}
+
+	if (argc == 3 && !strcmp(argv[1], "remove_duplicates")) {
+		struct string_list list = STRING_LIST_INIT_DUP;
+
+		parse_string_list(&list, argv[2]);
+		string_list_remove_duplicates(&list, 0);
+		write_list_compact(&list);
+		string_list_clear(&list, 0);
+		return 0;
+	}
+
+	if (argc == 4 && !strcmp(argv[1], "longest_prefix")) {
+		/* arguments: <colon-separated-prefixes>|- <string> */
+		struct string_list prefixes = STRING_LIST_INIT_DUP;
+		int retval;
+		const char *prefix_string = argv[2];
+		const char *string = argv[3];
+		const char *match;
+
+		parse_string_list(&prefixes, prefix_string);
+		match = string_list_longest_prefix(&prefixes, string);
+		if (match) {
+			printf("%s\n", match);
+			retval = 0;
+		}
+		else
+			retval = 1;
+		string_list_clear(&prefixes, 0);
+		return retval;
+	}
+
+	fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
+		argv[1] ? argv[1] : "(there was none)");
+	return 1;
+}
diff --git a/trace.c b/trace.c
index d953416..5ec0e3b 100644
--- a/trace.c
+++ b/trace.c
@@ -62,7 +62,7 @@
 static const char err_msg[] = "Could not trace into fd given by "
 	"GIT_TRACE environment variable";
 
-void trace_vprintf(const char *key, const char *fmt, va_list ap)
+static void trace_vprintf(const char *key, const char *fmt, va_list ap)
 {
 	struct strbuf buf = STRBUF_INIT;
 
diff --git a/transport.c b/transport.c
index 1811b50..9932f40 100644
--- a/transport.c
+++ b/transport.c
@@ -518,8 +518,7 @@
 			       int nr_heads, struct ref **to_fetch)
 {
 	struct git_transport_data *data = transport->data;
-	char **heads = xmalloc(nr_heads * sizeof(*heads));
-	char **origh = xmalloc(nr_heads * sizeof(*origh));
+	struct string_list sought = STRING_LIST_INIT_DUP;
 	const struct ref *refs;
 	char *dest = xstrdup(transport->url);
 	struct fetch_pack_args args;
@@ -538,7 +537,7 @@
 	args.depth = data->options.depth;
 
 	for (i = 0; i < nr_heads; i++)
-		origh[i] = heads[i] = xstrdup(to_fetch[i]->name);
+		string_list_append(&sought, to_fetch[i]->name);
 
 	if (!data->got_remote_heads) {
 		connect_setup(transport, 0, 0);
@@ -548,7 +547,7 @@
 
 	refs = fetch_pack(&args, data->fd, data->conn,
 			  refs_tmp ? refs_tmp : transport->remote_refs,
-			  dest, nr_heads, heads, &transport->pack_lockfile);
+			  dest, &sought, &transport->pack_lockfile);
 	close(data->fd[0]);
 	close(data->fd[1]);
 	if (finish_connect(data->conn))
@@ -558,10 +557,7 @@
 
 	free_refs(refs_tmp);
 
-	for (i = 0; i < nr_heads; i++)
-		free(origh[i]);
-	free(origh);
-	free(heads);
+	string_list_clear(&sought, 0);
 	free(dest);
 	return (refs ? 0 : -1);
 }
diff --git a/transport.h b/transport.h
index b866c12..3b21c4a 100644
--- a/transport.h
+++ b/transport.h
@@ -106,6 +106,7 @@
 #define TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND 256
 
 #define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3)
+#define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x)
 
 /* Returns a transport suitable for the url */
 struct transport *transport_get(struct remote *, const char *);
diff --git a/userdiff.c b/userdiff.c
index 1e7184f..ed958ef 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -14,6 +14,15 @@
 	{ name, NULL, -1, { pattern, REG_EXTENDED | REG_ICASE }, \
 	  word_regex "|[^[:space:]]|[\xc0-\xff][\x80-\xbf]+" }
 static struct userdiff_driver builtin_drivers[] = {
+IPATTERN("ada",
+	 "!^(.*[ \t])?(is new|renames|is separate)([ \t].*)?$\n"
+	 "!^[ \t]*with[ \t].*$\n"
+	 "^[ \t]*((procedure|function)[ \t]+.*)$\n"
+	 "^[ \t]*((package|protected|task)[ \t]+.*)$",
+	 /* -- */
+	 "[a-zA-Z][a-zA-Z0-9_]*"
+	 "|[0-9][-+0-9#_.eE]"
+	 "|=>|\\.\\.|\\*\\*|:=|/=|>=|<=|<<|>>|<>"),
 IPATTERN("fortran",
 	 "!^([C*]|[ \t]*!)\n"
 	 "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n"
diff --git a/wt-status.c b/wt-status.c
index c110cbc..2a9658b 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -100,8 +100,8 @@
 	va_end(ap);
 }
 
-void status_printf_more(struct wt_status *s, const char *color,
-			const char *fmt, ...)
+static void status_printf_more(struct wt_status *s, const char *color,
+			       const char *fmt, ...)
 {
 	va_list ap;
 
@@ -221,7 +221,7 @@
 					 const char *how)
 {
 	const char *c = color(WT_STATUS_HEADER, s);
-	status_printf_ln(s, c, _("%s files:"), what);
+	status_printf_ln(s, c, "%s:", what);
 	if (!advice_status_hints)
 		return;
 	status_printf_ln(s, c, _("  (use \"git %s <file>...\" to include in what will be committed)"), how);
@@ -1008,9 +1008,9 @@
 		wt_status_print_submodule_summary(s, 1);  /* unstaged */
 	}
 	if (s->show_untracked_files) {
-		wt_status_print_other(s, &s->untracked, _("Untracked"), "add");
+		wt_status_print_other(s, &s->untracked, _("Untracked files"), "add");
 		if (s->show_ignored_files)
-			wt_status_print_other(s, &s->ignored, _("Ignored"), "add -f");
+			wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f");
 	} else if (s->commitable)
 		status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
 			advice_status_hints
@@ -1023,23 +1023,31 @@
 			status_printf_ln(s, GIT_COLOR_NORMAL, _("No changes"));
 		else if (s->nowarn)
 			; /* nothing */
-		else if (s->workdir_dirty)
-			printf(_("no changes added to commit%s\n"),
-				advice_status_hints
-				? _(" (use \"git add\" and/or \"git commit -a\")") : "");
-		else if (s->untracked.nr)
-			printf(_("nothing added to commit but untracked files present%s\n"),
-				advice_status_hints
-				? _(" (use \"git add\" to track)") : "");
-		else if (s->is_initial)
-			printf(_("nothing to commit%s\n"), advice_status_hints
-				? _(" (create/copy files and use \"git add\" to track)") : "");
-		else if (!s->show_untracked_files)
-			printf(_("nothing to commit%s\n"), advice_status_hints
-				? _(" (use -u to show untracked files)") : "");
-		else
-			printf(_("nothing to commit%s\n"), advice_status_hints
-				? _(" (working directory clean)") : "");
+		else if (s->workdir_dirty) {
+			if (advice_status_hints)
+				printf(_("no changes added to commit "
+					 "(use \"git add\" and/or \"git commit -a\")\n"));
+			else
+				printf(_("no changes added to commit\n"));
+		} else if (s->untracked.nr) {
+			if (advice_status_hints)
+				printf(_("nothing added to commit but untracked files "
+					 "present (use \"git add\" to track)\n"));
+			else
+				printf(_("nothing added to commit but untracked files present\n"));
+		} else if (s->is_initial) {
+			if (advice_status_hints)
+				printf(_("nothing to commit (create/copy files "
+					 "and use \"git add\" to track)\n"));
+			else
+				printf(_("nothing to commit\n"));
+		} else if (!s->show_untracked_files) {
+			if (advice_status_hints)
+				printf(_("nothing to commit (use -u to show untracked files)\n"));
+			else
+				printf(_("nothing to commit\n"));
+		} else
+			printf(_("nothing to commit, working directory clean\n"));
 	}
 }
 
diff --git a/wt-status.h b/wt-status.h
index f8fc58c..236b41f 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -92,7 +92,5 @@
 	;
 void status_printf(struct wt_status *s, const char *color, const char *fmt, ...)
 	;
-void status_printf_more(struct wt_status *s, const char *color, const char *fmt, ...)
-	__attribute__((format(printf, 3, 4)));
 
 #endif /* STATUS_H */