前言
Git patch是一种描述文件,它记录了一系列的文件变更(如新增、修改、删除)以及变更的具体内容。通过使用patch文件,可以将这些变更应用到其他代码库中,从而实现代码的同步和更新。
Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。
.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。
.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
生成
创建patch和diff
从某次提交(含)之前的几次提交创建Patch文件:
git format-patch <commit_sha1_id> -n
这个命令会从指定的提交开始往前数,生成指定数量的Patch文件。-n 参数表示生成的Patch文件数量,从指定提交开始往前数。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 -2
这个命令将生成从提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 开始往前数的两个Patch文件。
创建某个提交的Patch文件:
git format-patch <commit_sha1_id> -1
这个命令会生成指定提交的Patch文件。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 -1
这个命令将生成提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 对应的Patch文件。
创建某两次提交之间的所有Patch:
git format-patch <commit_sha1_id1>..<commit_sha1_id2>
这个命令会生成指定两次提交之间的所有Patch文件。
示例:
git format-patch 2a2fb4539925bfa4a141fe492d9828d030f7c8a8..89aebfcc73bdac8054be1a242598610d8ed5f3c8
这个命令将生成从提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 到提交 89aebfcc73bdac8054be1a242598610d8ed5f3c8 之间的所有Patch文件。
创建Diff文件的常用方法:
使用 git diff 命令可以生成Diff文件。
git diff <commit_sha1_id1> <commit_sha1_id2> > <diff_file_name>
这个命令会生成两次提交之间的所有差异,并将其保存到指定的Diff文件中。
示例:
git diff 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 89aebfcc73bdac8054be1a242598610d8ed5f3c8 > patch.diff
这个命令将生成提交 2a2fb4539925bfa4a141fe492d9828d030f7c8a8 和 89aebfcc73bdac8054be1a242598610d8ed5f3c8 之间的所有差异,并保存到名为 patch.diff 的文件中。
使用Patch文件
现在有一个【0001-.patch】文件,需要把它应用到项目里面。
1.先把文件放在项目里面(随便找一个位置都可以,但是也不要太搞了,记住文件的位置绝对路径)
2.使用这个文件
git apply xxx.patch
比如
git apply D:\Android\AndroidProject\FormalProject\xxx\xxxxxxx-ad\xxxxxx\\debug\0001-.patch
这里面我把这个文件放在我的debug文件目录下面了,这个都随便放的,但是要记得位置就好了
要是没啥问题的话,这一步之后其实就完事了,代码就合并了,但是我们遇到了代码冲突问题
比如
D:\Android\AndroidProject\FormalProject\xxxx\xxx-ad>git apply D:\Android\AndroidProject\FormalProject\xxxx\xxx-ad\qqqqq\eeee\debug\0001-.patch
error: patch failed: xxxx/src/main/java/com/wer/xxxx/work/newwork/MyActivity.java:35
error: xxxx/src/main/java/com/southgnss/xxxx/work/newwork/MyActivity.java: patch does not apply
error: patch failed: xxxx/src/main/res/layout/fragment_sample.xml:56
error: xxxx/src/main/res/layout/fragment_sample.xml: patch does not apply
通过这个错误可以看出,有两个地方存在了冲突,需要解决这两个冲突才可以合并下去。
解决冲突
首先我们先把不冲突的文件合并
git apply --reject xxx.patch
比如
D:\Android\AndroidProject\FormalProject\xxx\xxxxx-ad>git apply --reject D:\Android\AndroidProject\FormalProject\xxx\xxxxx-ad\xxx\qqq\debug\0001-.patch
经过这个之后,现在不冲突的代码已经被合并了,但是冲突的代码还在,冲突的代码会生成【.rej】文件,这个文件去哪里找呢?
就在同名文件下面
比如
上面我们有两个文件冲突,其中一个文件是【MyActivity】这个文件冲突,在执行了【git apply --reject】之后,找到这个文件【MyActivity】所在的文件夹,此时在这个文件下面会有一个同名文件【MyActivity.java.rej】。
打开这个文件然后对照【MyActivity】文件进行冲突的解决。
当所有冲突文件解决之后,就可以删除【.rej】文件了,然后把之前的那个【0001-.patch】文件也可以删除了
最后再检查一下代码,没问题了就可以正常的使用git提交代码了