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。
步骤
- 用
git apply --check commit.patch检查patch是否可用(可以适当添加--verbose参数) git am commit.patch应用patch,如果没有冲突则打补丁成功,自动commit- 如果有冲突,则冲突的patch文件不会生效,并且git会处于冲突状态,可以选择git am --abort、git am --continue/resolved
- 如果选择继续打补丁,在执行
git am --continue之前需要先手动把失败的补丁打上,git apply --reject failed.patch,指定失败的补丁文件强制打上,并且手动把rej文件解决掉,把所有修改add到暂存区中,之后执行git am --continue就可以解决冲突了。



浙公网安备 33010602011771号