有时候我们在本地修改了代码之后,无法发布到正式环境。所以我们需要想办法把修改过的地方保存下来,这样当需要展示修改后的代码时,我们可以复现,而不需要把所有代码都保存。
#第一步 : 将差异的地方保存到xxx.patch文件
git diff > xxx.patch
#当子模块也有差异需要保存的时候,使用
git diff --submodule=diff > xxx.patch
#第二步 : 在 .patch 文件的目录下将差异的地方复现
git apply /path/to/xxx.patch
#一般保险一些使用下面的三步走
#1.先检查patch文件
git apply --stat xxx.patch
#2.检查能否应用成功
git apply --check xxx.patch
#3.打补丁
git am --signoff < xxx.patch
知道怎么查找关键的地方是否在git diff 里面
直接搜索 "diff --git",编译器里直接搜索到有差异的地方
知道怎么在git diff 选择性的保存差异点,而非所有的差异都保存
先git diff 查看都有哪些,然后如果是有一些 "diff --git"的内容不希望加入到diff里面,因为太冗余,所以就git checkout 那个文件或者文件夹,这样再次git diff的时候就不会有了;但是git checkout之后,这个文件或者文件夹就会恢复原样
能检測出现的问题有下面几种样例:
1. error: cannot apply binary patch to 'xxx' without full index line
xxx通常会是bin/png/gif等等二进制文件 详细的原因就是patch中有指明要打上xxx文件,可是这个文件并不包括在这个patch中,不过有一个名字存在当中。遇到这个问题要重视。
2. error: core/java/android/provider/Settings.java: patch does not apply
出现这样的通常会是补丁冲突,这样的通常是强制打上补丁(使用--reject)后依据产生的*.rej文件来手动解决冲突。
3. warning: core/java/android/view/View.java has type 100644, expected 100755
出现这样的警告通常是文件内没有冲突,可是文件的权限发生变动。一般没有影响。
第二步强制打补丁
$ git apply --reject xxx.patch
运行了这一步后会产生什么样的结果,我对第一步的冲突来相应说明。
1.这样的问题通常是制作补丁的开发者没有将二进制文件制作到patch中云,对于这样的情况不会有不论什么的提示,由于patch中源资源文件都没有,Git也没有什么招术来解决。最好的方法是联系补丁提供者。
2.这样的情况是因为git apply是对照补丁中前后几行代码,假设没有出如今目标文件里,那么这就是冲突。这个是比較常常出现的,对于这样的情况会生成*.rej文件,能够find ./ -name *.rej找到这些冲突的补丁,手动打上就好。
3.能够考虑忽略。
git am -3 -k后假设有冲突,不要运行git checkout。假设不愿意改动冲突文件,佯装改动一下,加入进去才干进行下一步。
git --git-dir=../other_proj_dir/.git format-patch -k -1 --stdout xxxxxxxxxxxxxxxxxx | git am -3 -k
git am相同有--reject选项,加入这个选项能够将能打上的补丁先打上,冲突的文件生成*.rej文件。