git-diff-files
files - Compares files in the working tree and the index
概要
[verse]
'git diff-files' [-q] [-0 | -1 | -2 | -3 | -c | --cc] [<common-diff-options>] [<path>...]描述
比较工作树和索引中的文件。当指定路径时,仅比较那些命名的路径。否则比较索引中的所有条目。输出格式与 'git diff-index' 和 'git diff-tree' 相同。 When paths are specified, compares only those named paths. Otherwise all entries in the index are compared. The output format is the same as for 'git diff-index' and 'git diff-tree'.
选项
-p
-u
--patch
生成补丁(参见 <<generate_patch_text_with_p>>)。 ifdef::git-diff[] This is the default. endif::git-diff[]
-s
--no-patch
抑制 diff 机制的所有输出。 对于类似 git show 这样默认显示补丁的命令,
可用于抑制输出,或取消别名中命令行上先前的 `--patch`、`--stat` 等选项的效果。
endif::git-format-patch[]
ifdef::git-log[]
-m
以默认格式显示合并提交的 diff。 This is similar to --diff-merges=on, except -m will produce no output unless -p is given as well.
-c
为合并提交生成组合 diff 输出。 Shortcut for --diff-merges=combined -p.
--cc
为合并提交生成密集组合 diff 输出。 Shortcut for --diff-merges=dense-combined -p.
--dd
对合并和常规提交都生成相对于第一个父级的 diff。
Shortcut for `--diff-merges=first-parent -p`.
--remerge-diff
为合并提交生成重新合并 diff 输出。 Shortcut for --diff-merges=remerge -p.
--no-diff-merges
--diff-merges=off 的同义词。
--diff-merges=<format>
指定用于合并提交的 diff 格式。 Default is {diff-merges-default} unless --first-parent is in use, in which case first-parent is the default. + The following formats are supported:
+
--max-depth=0 -- foo:foo--max-depth=1 -- foo:foo/bar--max-depth=1 -- foo/bar:foo/bar/baz--max-depth=1 -- foo foo/bar:foo/bar/baz
and the actual merge commit.
The output emitted when this option is used is subject to change, and so is its interaction with other options (unless explicitly documented).
--combined-all-paths:: Cause combined diffs (used for merge commits) to list the name of the file from all parents. It thus only has effect when --diff-merges=[dense-]combined is in use, and is likely only useful if filename changes are detected (i.e. when either rename or copy detection have been requested). endif::git-log[]
-U<n>:: --unified=<n>:: 生成具有 <n> 行上下文的差异。上下文 行数默认为 diff.context,如果未设置配置变量 则为 3。
ifndef::git-format-patch[] Implies --patch. endif::git-format-patch[]
--output=<file>:: 输出到特定文件而非 stdout。
--output-indicator-new=<char>:: --output-indicator-old=<char>:: --output-indicator-context=<char>:: 指定在生成的补丁中用于指示新、旧或上下文行的字符。 lines in the generated patch. Normally they are +, - and ' ' respectively.
ifndef::git-format-patch[] --raw:: ifndef::git-log[] 以原始格式生成 diff。 ifdef::git-diff-core[] This is the default. endif::git-diff-core[] endif::git-log[] ifdef::git-log[] For each commit, show a summary of changes using the raw diff format. See the "RAW OUTPUT FORMAT" section of git-diff(1). This is different from showing the log itself in raw format, which you can achieve with --format=raw. endif::git-log[] endif::git-format-patch[]
ifndef::git-format-patch[] --patch-with-raw:: -p --raw 的同义词。 endif::git-format-patch[]
ifdef::git-log[] -t:: 在 diff 输出中显示树对象。 endif::git-log[]
--indent-heuristic:: 启用将 diff 块边界移动以使补丁更易读的启发式方法。这是默认值。
--no-indent-heuristic:: 禁用缩进启发式。
--minimal:: 花费额外时间以确保产生尽可能小的 diff。
--patience:: 使用 "patience diff" 算法生成 diff。
--histogram:: 使用 "histogram diff" 算法生成 diff。
--anchored=<text>:: 使用 "anchored diff" 算法生成 diff。 + This option may be specified more than once. + If a line exists in both the source and destination, exists only once, and starts with <text>, this algorithm attempts to prevent it from appearing as a deletion or addition in the output. It uses the "patience diff" algorithm internally.
--diff-algorithm=(patience|minimal|histogram|myers):: 选择 diff 算法。变体如下: The variants are as follows:
low-occurrence common elements".
For instance, if you configured the diff.algorithm variable to a non-default value and want to use the default one, then you have to use --diff-algorithm=default option.
--stat[=<width>[,<name-width>[,<count>]]]:: 生成 diffstat。 By default, as much space as necessary will be used for the filename part, and the rest for the graph part. Maximum width defaults to terminal width, or 80 columns if not connected to a terminal, and can be overridden by <width>. The width of the filename part can be limited by giving another width <name-width> after a comma or by setting diff.statNameWidth=<name-width>. The width of the graph part can be limited by using --stat-graph-width=<graph-width> or by setting diff.statGraphWidth=<graph-width>. Using --stat or --stat-graph-width affects all commands generating a stat graph, while setting diff.statNameWidth or diff.statGraphWidth does not affect git format-patch. By giving a third parameter <count>, you can limit the output to the first <count> lines, followed by ... if there are more. + These parameters can also be set individually with --stat-width=<width>, --stat-name-width=<name-width> and --stat-count=<count>.
--compact-summary:: 在 diffstat 中输出扩展头信息的压缩摘要, as file creations or deletions ("new" or "gone", optionally +l if it's a symlink) and mode changes (+x or -x for adding or removing executable bit respectively) in diffstat. The information is put between the filename part and the graph part. Implies --stat.
--numstat:: 类似于 --stat,但以十进制表示法显示添加和删除的行数, deleted lines in decimal notation and pathname without abbreviation, to make it more machine friendly. For binary files, outputs two - instead of saying 0 0.
--shortstat:: 仅输出 --stat 格式的最后一行,包含修改文件总数 number of modified files, as well as number of added and deleted lines.
-X [<param>,...]:: --dirstat[=<param>,...]:: 输出每个子目录的相对更改量分布。 sub-directory. The behavior of --dirstat can be customized by passing it a comma separated list of parameters. The defaults are controlled by the diff.dirstat configuration variable (see git-config(1)). The following parameters are available:
are not shown in the output.
Example: The following will count changed files, while ignoring directories with less than 10% of the total amount of changed files, and accumulating child directory counts in the parent directories: --dirstat=files,10,cumulative.
--cumulative:: --dirstat=cumulative 的同义词。
--dirstat-by-file[=<param>,...]:: --dirstat=files,<param>,... 的同义词。
--summary:: 输出扩展头信息(如创建、重命名和模式更改)的压缩摘要。 such as creations, renames and mode changes.
ifndef::git-format-patch[] --patch-with-stat:: -p --stat 的同义词。 endif::git-format-patch[]
ifndef::git-format-patch[]
-z:: ifdef::git-log[] Separate the commits with __NUL__s instead of newlines. + Also, when --raw or --numstat has been given, do not munge pathnames and use __NUL__s as output field terminators. endif::git-log[] ifndef::git-log[] When --raw, --numstat, --name-only or --name-status has been given, do not munge pathnames and use NULs as output field terminators. endif::git-log[] + Without this option, pathnames with "unusual" characters are quoted as explained for the configuration variable core.quotePath (see git-config(1)).
--name-only:: Show only the name of each changed file in the post-image tree. The file names are often encoded in UTF-8. For more information see the discussion about encoding in the git-log(1) manual page.
--name-status:: Show only the name(s) and status of each changed file. See the description of the --diff-filter option on what the status letters mean. Just like --name-only the file names are often encoded in UTF-8.
--submodule[=<format>]:: Specify how differences in submodules are shown. When specifying --submodule=short the short format is used. This format just shows the names of the commits at the beginning and end of the range. When --submodule or --submodule=log is specified, the log format is used. This format lists the commits in the range like git-submodule(1) summary does. When --submodule=diff is specified, the diff format is used. This format shows an inline diff of the changes in the submodule contents between the commit range. Defaults to diff.submodule or the short format if the config option 则为 0。
--color[=<when>]:: Show colored diff. --color (i.e. without =<when>) is the same as --color=always. <when> can be one of always, never, or auto. ifdef::git-diff[] It can be changed by the color.ui and color.diff configuration settings. endif::git-diff[]
--no-color:: Turn off colored diff. ifdef::git-diff[] This can be used to override configuration settings. endif::git-diff[] It is the same as --color=never.
--color-moved[=<mode>]:: Moved lines of code are colored differently. ifdef::git-diff[] It can be changed by the diff.colorMoved configuration setting. endif::git-diff[] The <mode> defaults to no if the option is not given and to zebra if the option with no mode is given. The mode must be one of:
dimmed_zebra is a deprecated synonym.
--no-color-moved:: 关闭移动检测. This can be used to override configuration settings. It is the same as --color-moved=no.
--color-moved-ws=<mode>,...:: This configures how whitespace is ignored when performing the move detection for --color-moved. ifdef::git-diff[] It can be set by the diff.colorMovedWS configuration setting. endif::git-diff[] These modes can be given as a comma separated list:
other modes.
--no-color-moved-ws:: Do not ignore whitespace when performing move detection. This can be used to override configuration settings. It is the same as --color-moved-ws=no.
--word-diff[=<mode>]:: By default, words are delimited by whitespace; see --word-diff-regex below. The <mode> defaults to plain, and must be one of:
Disable word diff again.
Note that despite the name of the first mode, color is used to highlight the changed parts in all modes if enabled.
--word-diff-regex=<regex>:: Use <regex> to decide what a word is, instead of considering runs of non-whitespace to be a word. Also implies --word-diff unless it was already enabled. + Every non-overlapping match of the <regex> is considered a word. Anything between these matches is considered whitespace and ignored(!) for the purposes of finding differences. You may want to append |[^[:space:]] to your regular expression to make sure that it matches all non-whitespace characters. A match that contains a newline is silently truncated(!) at the newline. + For example, --word-diff-regex=. will treat each character as a word and, correspondingly, show differences character by character. + The regex can also be set via a diff driver or configuration option, see gitattributes(5) or git-config(1). Giving it explicitly overrides any diff driver or configuration setting. Diff drivers override configuration settings.
--color-words[=<regex>]:: Equivalent to --word-diff=color plus (if a regex was specified) --word-diff-regex=<regex>. endif::git-format-patch[]
--no-renames:: 关闭重命名检测, even when the configuration file gives the default to do so.
--rename-empty:: --no-rename-empty:: Whether to use empty blobs as rename source.
ifndef::git-format-patch[] --check:: 如果更改引入冲突标记或空白错误则警告。 What are considered whitespace errors is controlled by core.whitespace configuration. By default, trailing whitespaces (including lines that consist solely of whitespaces) and a space character that is immediately followed by a tab character inside the initial indent of the line are considered whitespace errors. Exits with non-zero status if problems are found. Not compatible with --exit-code.
--ws-error-highlight=<kind>:: Highlight whitespace errors in the context, old or new lines of the diff. Multiple values are separated by comma, none resets previous values, default reset the list to new and all is a shorthand for old,new,context. When this option is not given, and the configuration variable diff.wsErrorHighlight is not set, only whitespace errors in new lines are highlighted. The whitespace errors are colored with color.diff.whitespace.
endif::git-format-patch[]
--full-index:: Instead of the first handful of characters, show the full pre- and post-image blob object names on the "index" line when generating patch format output.
--binary:: In addition to --full-index, output a binary diff that can be applied with git-apply. ifndef::git-format-patch[] Implies --patch. endif::git-format-patch[]
--abbrev[=<n>]:: Instead of showing the full 40-byte hexadecimal object name in diff-raw format output and diff-tree header lines, show the shortest prefix that is at least <n> hexdigits long that uniquely refers the object. In diff-patch output format, --full-index takes higher precedence, i.e. if --full-index is specified, full blob names will be shown regardless of --abbrev. Non default number of digits can be specified with --abbrev=<n>.
-B[<n>][/<m>]:: --break-rewrites[=[<n>][/<m>]]:: Break complete rewrite changes into pairs of delete and create. This serves two purposes: + It affects the way a change that amounts to a total rewrite of a file not as a series of deletion and insertion mixed together with a very few lines that happen to match textually as the context, but as a single deletion of everything old followed by a single insertion of everything new, and the number <m> controls this aspect of the -B option (defaults to 60%). -B/70% specifies that less than 30% of the original should remain in the result for Git to consider it a total rewrite (i.e. otherwise the resulting patch will be a series of deletion and insertion mixed together with context lines). + When used with -M, a totally-rewritten file is also considered as the source of a rename (usually -M only considers a file that disappeared as the source of a rename), and the number <n> controls this aspect of the -B option (defaults to 50%). -B20% specifies that a change with addition and deletion compared to 20% or more of the file's size are eligible for being picked up as a possible source of a rename to another file.
-M[<n>]:: --find-renames[=<n>]:: ifndef::git-log[] 检测重命名。 endif::git-log[] ifdef::git-log[] If generating diffs, detect and report renames for each For following files across renames while traversing history, see --follow. endif::git-log[] If <n> is specified, it is a threshold on the similarity index (i.e. amount of addition/deletions compared to the file's size). For example, -M90% means Git should consider a delete/add pair to be a rename if more than 90% of the file hasn't changed. Without a % sign, the number is to be read as a fraction, with a decimal point before it. I.e., -M5 becomes 0.5, and is thus the same as -M50%. Similarly, -M05 is the same as -M5%. To limit detection to exact renames, use -M100%. The default similarity index is 50%.
-C[<n>]:: --find-copies[=<n>]:: 检测副本以及重命名。 See also --find-copies-harder. If <n> is specified, it has the same meaning as for -M<n>.
--find-copies-harder:: For performance reasons, by default, -C option finds copies only if the original file of the copy was modified in the same changeset. This flag makes the command inspect unmodified files as candidates for the source of copy. This is a very expensive operation for large projects, so use it with caution. Giving more than one -C option has the same effect.
-D:: --irreversible-delete:: Omit the preimage for deletes, i.e. print only the header but not the diff between the preimage and /dev/null. The resulting patch is not meant to be applied with patch or git apply; this is solely for people who want to just concentrate on reviewing the text after the change. In addition, the output obviously lacks enough information to apply such a patch in reverse, even manually, hence the name of the option. + When used together with -B, omit also the preimage in the deletion part of a delete/create pair.
-l<num>:: The -M and -C options involve some preliminary steps that can detect subsets of renames/copies cheaply, followed by an exhaustive fallback portion that compares all remaining unpaired destinations to all relevant sources. (For renames, only remaining unpaired sources are relevant; for copies, all original sources are relevant.) For N sources and destinations, this exhaustive check is O(N^2). This option prevents the exhaustive portion of rename/copy detection from running if the number of source/destination files involved exceeds the specified number. Defaults to diff.renameLimit. Note that a value of 0 is treated as unlimited.
ifndef::git-format-patch[] --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]:: Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...) changed (T), are Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing is selected. + Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths. + Note that not all diffs can feature all types. For instance, copied and renamed entries cannot appear if detection for those types is disabled.
-S<string>:: Look for differences that change the number of occurrences of the specified <string> (i.e. addition/deletion) in a file. Intended for the scripter's use. + It is useful when you're looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block. + Binary files are searched as well.
-G<regex>:: Look for differences whose patch text contains added/removed lines that match <regex>. + To illustrate the difference between -S<regex> --pickaxe-regex and -G<regex>, consider a commit with the following diff in the same file:
- hit = frotz(nitfol, mf2.ptr, 1, 0);
While git log -G"frotz\(nitfol" will show this commit, git log -S"frotz\(nitfol" --pickaxe-regex will not (because the number of occurrences of that string did not change). + Unless --text is supplied patches of binary files without a textconv filter will 被忽略。 + See the 'pickaxe' entry in gitdiffcore(7) for more information.
--find-object=<object-id>:: Look for differences that change the number of occurrences of the specified object. Similar to -S, just the argument is different in that it doesn't search for a specific string but for a specific object id. + The object can be a blob or a submodule It implies the -t option in git-log to also find trees.
--pickaxe-all:: When -S or -G finds a change, show all the changes in that changeset, not just the files that contain the change in <string>.
--pickaxe-regex:: Treat the <string> given to -S as an extended POSIX regular expression to match.
endif::git-format-patch[]
-O<orderfile>:: 控制文件在输出中出现的顺序。 This overrides the diff.orderFile configuration variable (see git-config(1)). To cancel diff.orderFile, use -O/dev/null. + The output order is determined by the order of glob patterns in <orderfile>. All files with pathnames that match the first pattern are output first, all files with pathnames that match the second pattern (but not the first) are output next, and so on. All files with pathnames that do not match any pattern are output last, as if there was an implicit match-all pattern at the end of the file. If multiple pathnames have the same rank (they match the same pattern but no earlier patterns), their output order relative to each other is the normal order. + <orderfile> is parsed as follows:
- Each other line contains a single pattern.
Patterns have the same syntax and semantics as patterns used for fnmatch(3) without the FNM_PATHNAME flag, except a pathname also matches a pattern if removing any number of the final pathname components matches the pattern. For example, the pattern "foo*bar" matches "fooasdfbar" and "foo/bar/baz/asdf" but not "foobarx".
--skip-to=<file>:: --rotate-to=<file>:: Discard the files before the named <file> from the output (i.e. 'skip to'), or move them to the end of the output (i.e. 'rotate to'). These options were invented primarily for the use of the git difftool command, and may not be very useful otherwise.
ifndef::git-format-patch[] -R:: 交换两个输入; that is, show differences from index or on-disk file to tree contents. endif::git-format-patch[]
--relative[=<path>]:: --no-relative:: When run from a subdirectory of the project, it can be told to exclude changes outside the directory and show pathnames relative to it with this option. When you are not in a subdirectory (e.g. in a bare repository), you can name which subdirectory to make the output relative to by giving a <path> as an argument. --no-relative can be used to countermand both diff.relative config option and previous --relative.
-a:: --text:: 将所有文件视为文本。
--ignore-cr-at-eol:: 比较时忽略行尾的回车符。
--ignore-space-at-eol:: 忽略行尾空白的变化。
-b:: --ignore-space-change:: 忽略空白量的变化。 This ignores whitespace at line end, and considers all other sequences of one or more whitespace characters to be equivalent.
-w:: --ignore-all-space:: 比较行时忽略空白。 This ignores differences even if one line has whitespace where the other line has none.
--ignore-blank-lines:: 忽略所有行都为空白的更改。
-I<regex>:: --ignore-matching-lines=<regex>:: Ignore changes whose all lines match <regex>. This option may be specified more than once.
--inter-hunk-context=<number>:: 显示差异块之间的上下文,最多指定 <number> 行,从而融合彼此接近的块。 默认为 diff.interHunkContext,如果未设置配置选项 则为 0。
-W:: --function-context:: Show whole function as context lines for each change. The function names are determined in the same way as git diff works out patch hunk headers (see "Defining a custom hunk-header" in gitattributes(5)).
ifndef::git-format-patch[] ifndef::git-log[] --exit-code:: 使程序以类似于 diff(1) 的代码退出。 That is, it exits with 1 if there were differences and 0 means no differences.
--quiet:: 禁用程序的所有输出。隐含 --exit-code。 Implies --exit-code. Disables execution of external diff helpers whose exit code is not trusted, i.e. their respective configuration option diff.trustExitCode or ++diff.++<driver>++.trustExitCode++ or environment variable GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE is false. endif::git-log[] endif::git-format-patch[]
--ext-diff:: 允许执行外部 diff 辅助程序。 If you set an external diff driver with gitattributes(5), you need to use this option with git-log(1) and friends.
--no-ext-diff:: 不允许外部 diff 驱动程序。
--textconv:: --no-textconv:: Allow (or disallow) external text conversion filters to be run when comparing binary files. See gitattributes(5) for details. Because textconv filters are typically a one-way conversion, the resulting diff is suitable for human consumption, but cannot be applied. For this reason, textconv filters are enabled by default only for git-diff(1) and git-log(1), but not for git-format-patch(1) or diff plumbing commands.
--ignore-submodules[=(none|untracked|dirty|all)]:: Ignore changes to submodules in the diff generation. all is the default. Using none will consider the submodule modified when it either contains untracked or modified files or its HEAD differs from the commit recorded in the superproject and can be used to override any settings of the ignore option in git-config(1) or gitmodules(5). When untracked is used submodules are not considered dirty when they only contain untracked content (but they are still scanned for modified content). Using dirty ignores all changes to the work tree of submodules, only changes to the commits stored in the superproject are shown (this was the behavior until 1.7.0). Using all hides all changes to submodules.
--src-prefix=<prefix>:: Show the given source <prefix> instead of "a/".
--dst-prefix=<prefix>:: Show the given destination <prefix> instead of "b/".
--no-prefix:: Do not show any source or destination prefix.
--default-prefix:: ifdef::git-format-patch[] Use the default source and destination prefixes ("a/" and "b/"). This overrides configuration variables such as format.noprefix, diff.srcPrefix, diff.dstPrefix, and diff.mnemonicPrefix (see git-config(1)). endif::git-format-patch[] ifndef::git-format-patch[] Use the default source and destination prefixes ("a/" and "b/"). This overrides configuration variables such as diff.noprefix, diff.srcPrefix, diff.dstPrefix, and diff.mnemonicPrefix (see git-config(1)). endif::git-format-patch[]
--line-prefix=<prefix>:: Prepend an additional <prefix> to every line of output.
--ita-invisible-in-index:: By default entries added by git add -N appear as an existing empty file in git diff and a new file in git diff --cached. This option makes the entry appear as a new file in git diff and non-existent in git diff --cached. This option could be reverted with --ita-visible-in-index. Both options are experimental and could be removed in future.
--max-depth=<depth>:: For each pathspec given on command line, descend at most <depth> levels of directories. A value of -1 means no limit. Cannot be combined with wildcards in the pathspec. Given a tree containing foo/bar/baz, the following list shows the matches generated by each set of options:
- --max-depth=2 -- foo: foo/bar/baz
If no pathspec is given, the depth is measured as if all top-level entries were Note that this is different than measuring from the root, in that --max-depth=0 would still return foo. This allows you to still limit depth while asking for a subset of the top-level entries. + Note that this option is only supported for diffs between tree objects, not against the index or working tree.
For more detailed explanation on these common options, see also gitdiffcore(7).
-1 --base:: -2 --ours:: -3 --theirs:: -0:: Diff against the "base" version, "our branch", or "their branch" respectively. With these options, diffs for merged entries are not shown. + The default is to diff against our branch (-2) and the cleanly resolved paths. The option -0 can be given to omit diff output for unmerged entries and just show "Unmerged".
-c:: --cc:: This compares stage 2 (our branch), stage 3 (their branch), and the working tree file and outputs a combined diff, similar to the way 'diff-tree' shows a merge commit with these flags.
-q:: 即使文件不存在也保持沉默
原始输出格式
git-diff-index、git-diff-tree、git-diff-files 和 git diff --raw 的原始输出格式非常相似。
这些命令都比较两组东西;比较的内容不同:
git-diff-index <tree-ish>:: compares the <tree-ish> and the files on the filesystem.
git-diff-index --cached <tree-ish>:: compares the <tree-ish> and the 查看差异。
git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]:: compares the trees named by the two arguments.
git-diff-files [<pattern>...]:: compares the index and the files on the filesystem.
所有命令为每个更改的文件打印一行输出, 除了 git diff-files 在未合并文件的情况下,会同时打印"未合并"和"原地编辑"行。
输出行格式如下:
in-place edit :100644 100644 bcd1234 0123456 M file0
copy-edit :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit :100644 100644 abcd123 1234567 R86 file1 file3
create :000000 100644 0000000 1234567 A file4
delete :100644 000000 1234567 0000000 D file5
## unmerged :000000 000000 0000000 0000000 U file6
即,从左到右:
1. a colon.
1. mode for "src"; 000000 if creation, or if "src" is from the index and is unmerged.
1. a space.
1. mode for "dst"; 000000 if deletion, or if "dst" is from the index and is unmerged.
1. a space.
1. sha1 for "src"; 0\{40\} if creation, or if "src" is from the index and is unmerged.
1. a space.
1. sha1 for "dst"; 0\{40\} if deletion, if "dst" is from the index and is unmerged, or if "dst" is from the work tree and is out of sync with the 查看差异。
1. a space.
1. status, followed by optional "score" number.
1. a tab or a NUL when `-z` option is used.
1. path for "src"
1. a tab or a NUL when `-z` option is used; only exists for C or R.
1. path for "dst"; only exists for C or R.
1. an LF or a NUL when `-z` option is used, to terminate the record.
可能的状态字母为:
- `A`: 添加文件
- `C`: 将文件复制到新文件
- `D`: 删除文件
- `M`: 修改文件的内容或模式
- `R`: 重命名文件
- `T`: 更改文件类型(常规文件、符号链接或子模块)
- `U`: 文件未合并(在提交之前必须完成合并)
- `X`: "未知"更改类型(很可能是错误,请报告)
状态字母 `C` 和 `R` 后面始终跟一个分数(表示移动或复制的源和目标之间的相似度百分比)。
状态字母 `M` 后面可能跟一个分数(表示文件重写的不相似度百分比)。
The sha1 for "dst" is shown as all 0's if a file on the filesystem
is out of sync with the 查看差异。
Example::100644 100644 5be4a4a 0000000 M file.c
不使用 -z 选项时,包含"非常规"字符的路径名按照配置变量 core.quotePath 的说明进行引用 按照配置变量 core.quotePath 的说明进行引用 (see git-config(1)). 使用 -z 时,文件名按原样输出,行以 NUL 字节终止。
合并的 diff 格式
git-diff-tree, git-diff-files and git-diff --raw can take -c or --cc option to generate diff output also for merge commits. The output differs from the format described above in the following way:
- there is a colon for each parent
- there are more "src" modes and "src" sha1
- status is concatenated status characters for each parent
- no optional "score" number
- tab-separated pathname(s) of the file
For -c and --cc, only the destination or final path is shown even if the file was renamed on any side of history. With --combined-all-paths, the name of the path in each parent is shown followed by the name of the path in the merge
Examples for -c and --cc without --combined-all-paths:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
## ::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
Examples when `--combined-all-paths` added to either `-c` or `--cc`:::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c ::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
Note that 'combined diff' lists only files which were modified from all parents.
[[generate_patch_text_with_p]]
使用 -p 生成补丁文本
Running git-diff(1), git-log(1), git-show(1), git-diff-index(1), git-diff-tree(1), or git-diff-files(1) with the -p option produces patch text. You can customize the creation of patch text via the GIT_EXTERNAL_DIFF and the GIT_DIFF_OPTS environment variables (see git(1)), and the diff attribute (see gitattributes(5)).
What the -p option produces is slightly different from the traditional diff format:
It is preceded by a "git diff" header that looks like this:
diff --git a/file1 b/file2
The a/ and b/ filenames are the same unless rename/copy is involved. Especially, even for a creation or a deletion, /dev/null is not used in place of the a/ or b/ filenames. + When a rename/copy is involved, file1 and file2 show the name of the source file of the rename/copy and the name of the file that the rename/copy produces, respectively.
- It is followed by one or more extended header lines:
[synopsis] old mode <mode> new mode <mode> deleted file mode <mode> new file mode <mode> copy from <path> copy to <path> rename from <path> rename to <path> similarity index <number> dissimilarity index <number> index <hash>..<hash> <mode> + File modes <mode> are printed as 6-digit octal numbers including the file type and file permission bits. + Path names in extended headers do not include the a/ and b/ prefixes. + The similarity index is the percentage of unchanged lines, and the dissimilarity index is the percentage of changed lines. It is a rounded down integer, followed by a percent sign. The similarity index value of 100% is thus reserved for two equal files, while 100% dissimilarity means that no line from the old file made it into the new one. + The index line includes the blob object names before and after the change. The <mode> is included if the file mode does not change; otherwise, separate lines indicate the old and the new mode.
Pathnames with "unusual" characters are quoted as explained for the configuration variable
core.quotePath(see git-config(1)).All the
file1files in the output refer to files before the commit, and all thefile2files refer to files after the It is incorrect to apply each change to each file sequentially. For example, this patch will swap a and b:diff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a
Hunk headers mention the name of the function to which the hunk applies. See "Defining a custom hunk-header" in gitattributes(5) for details of how to tailor this to specific languages.
组合 diff 格式
Any diff-generating command can take the -c or --cc option to produce a 'combined diff' when showing a merge. This is the default format when showing merges with git-diff(1) or git-show(1). Note also that you can give suitable --diff-merges option to any of these commands to force generation of diffs in a specific format.
A "combined diff" format looks like this:
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
}
- static void describe(char *arg)
-static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
{
+ unsigned char sha1[20];
+ struct commit *cmit;
struct commit_list *list;
static int initialized = 0;
struct commit_name *n;
+ if (get_sha1(arg, sha1) < 0)
+ usage(describe_usage);
+ cmit = lookup_commit_reference(sha1);
+ if (!cmit)
+ usage(describe_usage);
+
if (!initialized) {
initialized = 1;
## for_each_ref(get_name);
1. It is preceded by a "git diff" header, that looks like
this (when the `-c` option is used):
diff --combined file
+
or like this (when the `--cc` option is used):
diff --cc file
2. It is followed by one or more extended header lines
(this example shows a merge with two parents):
+
[synopsis]
index <hash>,<hash>..<hash>
mode <mode>,<mode>..<mode>
new file mode <mode>
deleted file mode <mode>,<mode>
+
The `mode <mode>,<mode>..<mode>` line appears only if at least one of
the <mode> is different from the rest. Extended headers with
information about detected content movement (renames and
copying detection) are designed to work with the diff of two
`<tree-ish>` and are not used by combined diff format.
3. It is followed by a two-line from-file/to-file header:
--- a/file
+++ b/file
+
Similar to the two-line header for the traditional 'unified' diff
format, `/dev/null` is used to signal created or deleted
files.
+
However, if the --combined-all-paths option is provided, instead of a
two-line from-file/to-file, you get an N+1 line from-file/to-file header,
where N is the number of parents in the merge commit:
--- a/file
--- a/file
--- a/file
+++ b/file
+
This extended format can be useful if rename or copy detection is
active, to allow you to see the original name of the file in different
parents.
4. Chunk header format is modified to prevent people from
accidentally feeding it to `patch -p1`. Combined diff format
was created for review of merge commit changes, and was not
meant to be applied. The change is similar to the change in the
extended 'index' header:
@@@ <from-file-range> <from-file-range> <to-file-range> @@@
+
There are (number of parents + 1) `@` characters in the chunk
header for combined diff format.
Unlike the traditional 'unified' diff format, which shows two
files A and B with a single column that has `-` (minus --
appears in A but removed in B), `+` (plus -- missing in A but
added to B), or `" "` (space -- unchanged) prefix, this format
compares two or more files file1, file2,... with one file X, and
shows how X differs from each of fileN. One column for each of
fileN is prepended to the output line to note how X's line is
different from it.
A `-` character in the column N means that the line appears in
fileN but it does not appear in the result. A `+` character
in the column N means that the line appears in the result,
and fileN does not have that line (in other words, the line was
added, from the point of view of that parent).
In the above example output, the function signature was changed
from both files (hence two `-` removals from both file1 and
file2, plus `++` to mean one line that was added does not appear
in either file1 or file2). Also, eight other lines are the same
from file1 but do not appear in file2 (hence prefixed with `+`).
When shown by `git diff-tree -c`, it compares the parents of a
merge commit with the merge result (i.e. file1..fileN are the
parents). When shown by `git diff-files -c`, it compares the
two unresolved merge parents with the working tree file
(i.e. file1 is stage 2 aka "our version", file2 is stage 3 aka
"their version").
## 其他 diff 格式
The `--summary` option describes newly added, deleted, renamed and
copied files. The `--stat` option adds `diffstat`(1) graph to the
output. These options can be combined with other options, such as
`-p`, and are meant for human consumption.
When showing a change that involves a rename or a copy, `--stat` output
formats the pathnames compactly by combining common prefix and suffix of
the pathnames. For example, a change that moves `arch/i386/Makefile` to
`arch/x86/Makefile` while modifying 4 lines will be shown like this:arch/{i386 => x86}/Makefile | 4 +--
The --numstat option gives the diffstat(1) information but is designed for easier machine consumption. An entry in --numstat output looks like this:
1 2 README
## 3 1 arch/{i386 => x86}/Makefile
That is, from left to right:
1. the number of added lines;
1. a tab;
1. the number of deleted lines;
1. a tab;
1. pathname (possibly with rename/copy information);
1. a newline.
When `-z` output option is in effect, the output is formatted this way:1 2 README NUL
3 1 NUL arch/i386/Makefile NUL arch/x86/Makefile NUL
That is:
- the number of added lines;
- a tab;
- the number of deleted lines;
- a tab;
- a NUL (only exists if renamed/copied);
- pathname in preimage;
- a NUL (only exists if renamed/copied);
- pathname in postimage (only exists if renamed/copied);
- a NUL.
The extra NUL before the preimage path in renamed case is to allow scripts that read the output to tell if the current record being read is a single-path record or a rename/copy record without reading ahead. After reading added and deleted lines, reading up to NUL would yield the pathname, but if that is NUL, the record will show two paths.
Git
git(1) 套件的一部分
