Git Patch
Git patch的作用可以允许你将修改保存为一个标准的差异文件----patch文件,其他人拿到这个差异文件可以将你的修改其应用到项目里。
典型的使用场景:目标项目或者客户的project跟你不在同一个网络或者条件不允许在线提交代码到目标远程仓库;这时你就可以将需要提交的修改摘录成patch文件发送给project的管理员,管理员通过应用patch将您的修改合入project。
生成patch文件
两种生成patch的方式:
git diff生成的UNIX标准补丁.diff文件,另外一种是git format-patch生成的Git专用.patch 文件。
从方式就可以看出来:
.diff文件与.patch文件的区别就是diff生成的差异文件不附带commit相关的作者、message等信息,只记录差异。
这里仅介绍git format-patch标准的git patch文件生成和应用
常用的生成从当前commit往前n个commit
//生成从当前commit往前x个commit的patch文件
git format-patch -x
//默认有几个commit就会生成几个.patch文件,并且默认文件名从最早提交的commit 0001编号
//生成从指定commit_id(包含该commit) 往前x个commit的patch文件
git format-patch commit_id -x
//单独生成某个commit的patch
git format-patch commit_id -1
//当然也可以将所有commit的差异合并到一个patch文件,方便使用
git format-patch -x --stdout > patch-name.patch
//生成两个commit之间的所有commit的patch文件(不包含start_commit):
git format-patch start_commit_Id..end_commit_Id
应用patch文件
//检查patch文件
git apply --stat xxx.patch
//检查能否应用成功
git apply --check xxxx.patch
上图可见当前0001-third-commit.patch应用有提示error,因为当前处于4th-commit,应用patch发现已经有third-commit有冲突
//使用git am xxx.patch可以应用指定patch文件
//使用模式匹配git am *.patch会自动根据编号依次应用所有的patch文件(所以生成patch的编号自动安装提交先后生成)
git am *.patch
//使用git apply 命令也可以应用patch(多用于.diff文件)但是相比于am命令不会将commit信息加入
应用冲突解决
//git am出现冲突会报出错提示,然后整个停下来
//提示你查看应用失败的patch内容,可以根据提示修改冲突然后
如上图的commit状态,回退到 1th commit,然后添加一行"i am last line."再应用摘下来的2th & 3th commit patch文件.
//am 应用patch有冲突,则会提示命令用于查看冲突具体
git am --show-current-patch
//以及用于跳过、继续或者终止am命令
git am --continue
git am --skip
git am --abort
//使用git am -3 xxx.patch可以在发生冲突时使用git mergetool调用冲突合并工具解决冲突
git am -3 *.patch
git mergetool