Files
git-mirror/Documentation/git-diff-pairs.adoc
Justin Tobler 5bd10b2adc builtin: introduce diff-pairs command
Through git-diff(1), a single diff can be generated from a pair of blob
revisions directly. Unfortunately, there is not a mechanism to compute
batches of specific file pair diffs in a single process. Such a feature
is particularly useful on the server-side where diffing between a large
set of changes is not feasible all at once due to timeout concerns.

To facilitate this, introduce git-diff-pairs(1) which acts as a backend
passing its NUL-terminated raw diff format input from stdin through diff
machinery to produce various forms of output such as patch or raw.

The raw format was originally designed as an interchange format and
represents the contents of the diff_queued_diff list making it possible
to break the diff pipeline into separate stages. For example,
git-diff-tree(1) can be used as a frontend to compute file pairs to
queue and feed its raw output to git-diff-pairs(1) to compute patches.
With this, batches of diffs can be progressively generated without
having to recompute renames or retrieve object context. Something like
the following:

	git diff-tree -r -z -M $old $new |
	git diff-pairs -p -z

should generate the same output as `git diff-tree -p -M`. Furthermore,
each line of raw diff formatted input can also be individually fed to a
separate git-diff-pairs(1) process and still produce the same output.

Based-on-patch-by: Jeff King <peff@peff.net>
Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-03-03 08:17:47 -08:00

57 lines
1.7 KiB
Plaintext

git-diff-pairs(1)
=================
NAME
----
git-diff-pairs - Compare the content and mode of provided blob pairs
SYNOPSIS
--------
[synopsis]
git diff-pairs -z [<diff-options>]
DESCRIPTION
-----------
Show changes for file pairs provided on stdin. Input for this command must be
in the NUL-terminated raw output format as generated by commands such as `git
diff-tree -z -r --raw`. By default, the outputted diffs are computed and shown
in the patch format when stdin closes.
Usage of this command enables the traditional diff pipeline to be broken up
into separate stages where `diff-pairs` acts as the output phase. Other
commands, such as `diff-tree`, may serve as a frontend to compute the raw
diff format used as input.
Instead of computing diffs via `git diff-tree -p -M` in one step, `diff-tree`
can compute the file pairs and rename information without the blob diffs. This
output can be fed to `diff-pairs` to generate the underlying blob diffs as done
in the following example:
-----------------------------
git diff-tree -z -r -M $a $b |
git diff-pairs -z
-----------------------------
Computing the tree diff upfront with rename information allows patch output
from `diff-pairs` to be progressively computed over the course of potentially
multiple invocations.
Pathspecs are not currently supported by `diff-pairs`. Pathspec limiting should
be performed by the upstream command generating the raw diffs used as input.
Tree objects are not currently supported as input and are rejected.
Abbreviated object IDs in the `diff-pairs` input are not supported. Outputted
object IDs can be abbreviated using the `--abbrev` option.
OPTIONS
-------
include::diff-options.adoc[]
include::diff-generate-patch.adoc[]
GIT
---
Part of the linkgit:git[1] suite