以前一直用 SVN 图形界面,只会使用页面 update, commit ,branch 等功能,前两天为了打一个docker 镜像,在centos 上安装了SVN ,发现命令中有一个 patch,不明所以,因此记录一下。
定义patch 中文意思是补丁,顾名思义在版本管理系统中就是给系统的代码打补丁。公司里面用的比较少,因为大家一个团队使用一个SVN 地址提交代码,但是在全世界程序员参加的开源项目使用这种方式就不行了,需要有专门人来做代码 review 和 merge。每个人 fork 一个分支,开发完之后生成一个 patch 文件给原项目人员,由他们审查之后决定要不要合并到主干代码中(GitHub 里叫 Pull Request)
放一张流程图:
类 Unix 系统中都会自带 patch 和 diff 程序,可以使用这两个来演示一下补丁的使用。
我们现在有两个文件(SVN 系统中是本地跟远程文件diff,实际也是两个文件)file1, file2,他们的文件内容分别如下:
$ cat file1
this is file1
nothing more
line 3
$ cat file2
this is file2
nothing more
使用 diff 比较两个文件:
$ diff -u file1 file2
--- file1 2018-09-07 10:57:28.853583937 0800
file2 2018-09-07 10:57:06.062578590 0800
@@ -1,3 1,2 @@
-this is file1
this is file2
nothing more
-line 3
这就是 patch 文件的格式,可以看到是使用特殊的符号来标识每行内容的增减,修改,最开始是文件的时间戳信息。我们创建一个 file-diff.patch文件,然后就可以用patch 程序来打上补丁。
$ diff -u file1 file2 > file-diff.patch
$ patch file1 file-diff.patch
patching file file1
$ cat file1
this is file2
nothing more
如果你同时修改了file1,patch 和file1 内容就可能产生冲突,这回生成file1.rej文件,这就需要你自己手动去解决冲突,合并代码了。
,