Git生成patch和合并patch
git patch 可以将项目中的一些 commit 提取出来,生成 .patch 文件。其他分支或其他项目可以合并这些 .patch 文件,并生成与原 commit 一致的提交记录。
git patch 对于解决在错误的分支上开发了新功能特别有效。
生成 patch
使用 git format-patch
命令生成所需要的 patch。
选择超前于 Master 分支的所有提交:
|
|
选择某个提交之后的所有提交(不包括该次提交 35ec56
):
|
|
选择某两个提交之间的所有提交(不包括提交 35ec56
,但包括 c388c0
):
|
|
选择某个提交之前的n次提交(包括该次提交 35ec56
):
|
|
选择单个提交(将 n 指定为 1):
|
|
命令执行后,每个 commit 会生成为一个 .patch 文件,文件带有编号,编号顺序为 commit 的顺序。
合并 patch
显示 patch 的文件改动状态:
|
|
检查 patch 是否正常执行,大概相当于 dry-run。该命令能够检查出 patch 合并时一些常见的问题,比如 patch 中对文件进行了修改但文件不存在,patch 中创建文件但项目中已存在同名的文件。
|
|
合并 patch。在合并过程中 Git 如果检测到冲突,会报错并停止合并接下来的 patch,不会自动回滚,冲突处理参见下一节。
|
|
冲突处理
下面是一个遇到冲突的例子:
|
|
可以看出,在编号为 0004 的 patch 执行时,Git 在当前项目中无法找到 aaa.txt 文件。
解决冲突的方式,一种是简单粗暴的使用 git am —abort
命令,中断合并 patch,并会滚到合并 patch 之前的版本;
另一种是手动合并该 patch,并对冲突的文件手动修改,再继续 am 命令。这种处理方式不会对 commit 记录造成影响,重点介绍该方法。
首先,手动合并该 patch。对于没有冲突的文件,会自动更新(不会自动加入缓冲区);对于有冲突的文件,会生成一个 .rej 冲突参考文件。
|
|
.rej 文件中包含了冲突文件的 diff 信息,参考该 .rej 文件对冲突的文件进行修改,.rej 文件参考完之后可以删除。
修改好冲突的文件之后,把冲突的文件和之前更新的文件加入缓冲区:
|
|
告诉 Git 冲突已解决,继续合并 patch
|
|
执行时,会根据缓冲区中对文件的修改,生成本次冲突 patch(0004)的 commit。