diff

我们先help看下diff的介绍

Usage: diff [OPTION]... FILES
Compare FILES line by line.
Mandatory arguments to long options are mandatory for short options too.
--normal                  output a normal diff (the default)
-q, --brief                   report only when files differ
-s, --report-identical-files  report when two files are the same
-c, -C NUM, --context[=NUM]   output NUM (default 3) lines of copied context
-u, -U NUM, --unified[=NUM]   output NUM (default 3) lines of unified context
-e, --ed                      output an ed script
-n, --rcs                     output an RCS format diff
-y, --side-by-side            output in two columns
-W, --width=NUM               output at most NUM (default 130) print columns
--left-column             output only the left column of common lines
--suppress-common-lines   do not output common lines
-p, --show-c-function         show which C function each change is in
-F, --show-function-line=RE   show the most recent line matching RE
--label LABEL             use LABEL instead of file name and timestamp
(can be repeated)
-t, --expand-tabs             expand tabs to spaces in output
-T, --initial-tab             make tabs line up by prepending a tab
--tabsize=NUM             tab stops every NUM (default 8) print columns
--suppress-blank-empty    suppress space or tab before empty output lines
-l, --paginate                pass output through 'pr' to paginate it
-r, --recursive                 recursively compare any subdirectories found
--no-dereference            don't follow symbolic links
-N, --new-file                  treat absent files as empty
--unidirectional-new-file   treat absent first files as empty
--ignore-file-name-case     ignore case when comparing file names
--no-ignore-file-name-case  consider case when comparing file names
-x, --exclude=PAT               exclude files that match PAT
-X, --exclude-from=FILE         exclude files that match any pattern in FILE
-S, --starting-file=FILE        start with FILE when comparing directories
--from-file=FILE1           compare FILE1 to all operands;
FILE1 can be a directory
--to-file=FILE2             compare all operands to FILE2;
FILE2 can be a directory
-i, --ignore-case               ignore case differences in file contents
-E, --ignore-tab-expansion      ignore changes due to tab expansion
-Z, --ignore-trailing-space     ignore white space at line end
-b, --ignore-space-change       ignore changes in the amount of white space
-w, --ignore-all-space          ignore all white space
-B, --ignore-blank-lines        ignore changes where lines are all blank
-I, --ignore-matching-lines=RE  ignore changes where all lines match RE
-a, --text                      treat all files as text
--strip-trailing-cr         strip trailing carriage return on input
-D, --ifdef=NAME                output merged file with '#ifdef NAME' diffs
--GTYPE-group-format=GFMT   format GTYPE input groups with GFMT
--line-format=LFMT          format all input lines with LFMT
--LTYPE-line-format=LFMT    format LTYPE input lines with LFMT
These format options provide fine-grained control over the output
of diff, generalizing -D/--ifdef.
LTYPE is 'old', 'new', or 'unchanged'.  GTYPE is LTYPE or 'changed'.
GFMT (only) may contain:
%<  lines from FILE1
%>  lines from FILE2
%=  lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER  printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F  first line number
L  last line number
N  number of lines = L-F+1
E  F-1
M  L+1
%(A=B?T:E)  if A equals B then T else E
LFMT (only) may contain:
%L  contents of line
%l  contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n  printf-style spec for input line number
Both GFMT and LFMT may contain:
%%  %
%c'C'  the single character C
%c'\OOO'  the character with octal code OOO
C    the character C (other characters represent themselves)
-d, --minimal            try hard to find a smaller set of changes
--horizon-lines=NUM  keep NUM lines of the common prefix and suffix
--speed-large-files  assume large files and many scattered small changes
--color[=WHEN]       colorize the output; WHEN can be 'never', 'always',
or 'auto' (the default)
--palette=PALETTE    the colors to use when --color is active; PALETTE is
a colon-separated list of terminfo capabilities
  --help               display this help and exit

-v, --version            output version information and exit
FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'.
If --from-file or --to-file is given, there are no restrictions on FILE(s).
If a FILE is '-', read standard input.
Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.

命令格式 diff [选项] old_file new_file 以上old_file 和new_file可以是文件,也可以是文件夹。 常用选项 选项 说明 -r 递归比较各子目录下的文件 -N 将不存在的文件当作空文件 -u 默认输出每个修改前后的3行,也可以用-uX来指定输出更多上下文。 -B 忽略对空行的比较 -w 忽略所有空格和制表符。例如,if ( a == b ) 与 if(a==b) 相等。

生成补丁的命令 diff -Nur src src_new >src.patch

patch的使用

先help看看patch的介绍

Usage: patch [OPTION]... [ORIGFILE [PATCHFILE]]
Input options:
-p NUM  --strip=NUM  Strip NUM leading components from file names.
-F LINES  --fuzz LINES  Set the fuzz factor to LINES for inexact matching.
-l  --ignore-whitespace  Ignore white space changes between patch and input.
-c  --context  Interpret the patch as a context difference.
-e  --ed  Interpret the patch as an ed script.
-n  --normal  Interpret the patch as a normal difference.
-u  --unified  Interpret the patch as a unified difference.
-N  --forward  Ignore patches that appear to be reversed or already applied.
-R  --reverse  Assume patches were created with old and new files swapped.
-i PATCHFILE  --input=PATCHFILE  Read patch from PATCHFILE instead of stdin.
Output options:
-o FILE  --output=FILE  Output patched files to FILE.
-r FILE  --reject-file=FILE  Output rejects to FILE.
-D NAME  --ifdef=NAME  Make merged if-then-else output using NAME.
--merge  Merge using conflict markers instead of creating reject files.
-E  --remove-empty-files  Remove output files that are empty after patching.
-Z  --set-utc  Set times of patched files, assuming diff uses UTC (GMT).
-T  --set-time  Likewise, assuming local time.
--quoting-style=WORD   output file names using quoting style WORD.
Valid WORDs are: literal, shell, shell-always, c, escape.
Default is taken from QUOTING_STYLE env variable, or 'shell' if unset.
Backup and version control options:
-b  --backup  Back up the original contents of each file.
--backup-if-mismatch  Back up if the patch does not match exactly.
--no-backup-if-mismatch  Back up mismatches only if otherwise requested.
-V STYLE  --version-control=STYLE  Use STYLE version control.
STYLE is either 'simple', 'numbered', or 'existing'.
-B PREFIX  --prefix=PREFIX  Prepend PREFIX to backup file names.
-Y PREFIX  --basename-prefix=PREFIX  Prepend PREFIX to backup file basenames.
-z SUFFIX  --suffix=SUFFIX  Append SUFFIX to backup file names.
-g NUM  --get=NUM  Get files from RCS etc. if positive; ask if negative.
Miscellaneous options:
-t  --batch  Ask no questions; skip bad-Prereq patches; assume reversed.
-f  --force  Like -t, but ignore bad-Prereq patches, and assume unreversed.
-s  --quiet  --silent  Work silently unless an error occurs.
--verbose  Output extra information about the work being done.
--dry-run  Do not actually change any files; just print what would happen.
--posix  Conform to the POSIX standard.
-d DIR  --directory=DIR  Change the working directory to DIR first.
--reject-format=FORMAT  Create 'context' or 'unified' rejects.
--binary  Read and write data in binary mode.
--read-only=BEHAVIOR  How to handle read-only input files: 'ignore' that they
are read-only, 'warn' (default), or 'fail'.
-v  --version  Output version info.
--help  Output this help.

获取补丁文件后 打补丁的命令

patch -pn < 补丁文件 如果已经打过补丁,会有如下提示 patching file src/a/b/c/d/file Reversed (or previously applied) patch detected! Assume -R? [n] 选择y会还原

还原的命令

patch -Rpn < 补丁文件

p0表示不跳过任何目录以当前目录为基准。即从当前目录中查找src/a/b/c/d/file.

p1表示忽略当前目录的下一级目录,依此类推 不使用p参数 时候,patch命令会忽略所有斜杠,直接使用文件。直接在需要打补丁的文件目录下就可以不用待p参数直接 patch < 补丁文件即可

做个笔记防止后面又忘记了。