git diff文件、patch文件的使用方法

git diff的结果不仅可以输出到屏幕让人看,还可以通过git apply来应用修改。

git diff的使用方法

examples
基础用法:git diff 对比基准 新提交

$ git diff            (1)
$ git diff --cached   (2) #或者git diff --cached HEAD
$ git diff HEAD       (3)
$ git diff AUTO_MERGE (4)

(1)工作区中还没暂存,暂存区中的代码当成已经生效。相当于git diff staged not-yet-staged(伪代码,用于说明,不可执行)

(2)对比暂存区与上一个提交,即暂存区的修改(已经add但还没commit的); git commit不带-a选项会提交的修改. 相当于git diff commit(HEAD) staged

(3)对比工作区(包括暂存区)与上一次提交,即未提交的修改(包括没有add的和已经add但还没commit的);git commit -a会提交的修改. 相当于git diff commit(HEAD) not-yet-commit

HEAD代表最新提交

(4)第四个不常用,还不清楚,这里放原文: Changes in the working tree you’ve made to resolve textual conflicts so far.

比较提交
$ git diff branch_name (1)
$ git diff HEAD -- ./test (2)
$ git diff HEAD^ HEAD (3)
(1)对比当前分支与branch_name分支,当前分支包括工作区的内容(暂存和未暂存的)和已经提交的内容。相当于git diff branch_name current_branch

(2)与(1)相同,但是只比较其中的./test文件

(3)对比上个上个提交和上上个提交,即上个提交的修改,与git show显示的修改相同。

在commit后面加一个^表示该提交的上一个提交,加两个表示上上个提交,以此类推
Git HEAD^ vs Git HEAD~ vs Git HEAD{@}
^可以看作是^1的意思,表示父节点1,根据不同的分支可能会有多个父节点,如果只有一个父节点那就是父节点,^2不存在
HEAD^^等价于HEAD^1^1
^1~1没有区别,^^^~~~~3三者等价


HEAD@{n},这个表示方式主要是在reflog里面用的

比较分支
$ git diff topic master (1)
$ git diff topic..master (2)
$ git diff topic...master (3)
(1)比较master在topic基础上的修改。

(2)和(1)一样

(3)还没理解,附上原文: Changes that occurred on the master branch since when the topic branch was started off it.

Limiting the diff output
$ git diff --diff-filter=MRC (1)
$ git diff --name-status (2)
$ git diff arch/i386 include/asm-i386 (3)
(1)过滤特定形式的修改,Modification(修改文件),Rename,Copy,Addition(新增文件),Deletion(删除文件).

(2)只显示文件名和对文件进行的修改操作,修改操作见(1)

(3)没看懂,放原文:Limit diff output to named subtrees.

下面两个也没用过,就保留原文吧
Munging the diff output
$ git diff --find-copies-harder -B -C (1)
$ git diff -R (2)
(1)Spend extra cycles to find renames, copies and complete rewrites (very expensive).

(2)Output diff in reverse.

生成diff文件

git diff --binary 参数 > commit.diff

不加--binary不知道行不行

diff文件的使用

应用修改,但是如果有冲突则失败
git apply commit.diff
不应用修改,检查dif文件是否有冲突
git apply --check --verbose commit.diff
强制应用修改,冲突文件生成为对应的path/file.rej文件,rej文件记录了行数、修改以及该修改附近的代码(用于定位修改,冲突就是因为定位不到)
git apply --reject commit.diff
应用修改之后,会直接对文件进行修改,不会自动存放到暂存区,也不会自动提交。冲突的部分不会被修改,需要手动将rej文件里面的修改搬到对应的文件中去,相当于解冲突。解冲突之后,正常add正常commit即可。

生成patch文件

生成指定所有commmit的patch(与diff文件相似)
git format-patch -M master
生成从提交commit_id开始往前n个提交,-1则只生成commit_id的patch
git format-patch commit_id -n

patch文件的使用

git apply

使用方式与diff文件相同

git am打patch

与单纯git apply的区别就是git am会自动生成一个patch提交,且am只能打patch,diff文件不能am。
步骤

  1. git apply --check commit.patch检查patch是否可用(可以适当添加--verbose参数)
  2. git am commit.patch应用patch,如果没有冲突则打补丁成功,自动commit
  3. 如果有冲突,则冲突的patch文件不会生效,并且git会处于冲突状态,可以选择git am --abort、git am --continue/resolved
  4. 如果选择继续打补丁,在执行git am --continue之前需要先手动把失败的补丁打上,git apply --reject failed.patch,指定失败的补丁文件强制打上,并且手动把rej文件解决掉,把所有修改add到暂存区中,之后执行git am --continue就可以解决冲突了。
posted @ 2025-06-05 04:07  三月妻三月七  阅读(943)  评论(0)    收藏  举报