【Android】Git Patch生成的文件怎么合并到项目里面和遇到的一些问题

时间:2024-06-10 07:36:23
前言

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提交代码了