git diff与patch命令的配合使用

在Linux下,diff与patch命令配合使用可以进行简单的代码维护工作。


例如有以下2个文件,分别代表修改前与修改后的内容,本文假设本地代码包的路径为:/home/sw-kunlun,此文件在代码包中的路径为package/app/Test/test.txt。
注:本文中所有命令都是在代码包根目录下(/home/sw-kunlun)运行。


服务器修改前:
This is the first line!
This is the second line!
This is the third line!
This is the fourth line!
This is the fifth line!
This is the sixth line!
This is the seventh line!
This is the eighth line!
This is the ninth line!
This is the tenth line!
This is the end~


本地修改后:
This is the first line!
This is the 2 line!
This is the third line!
This is the fourth line!
This is the fifth line!
This is the sixth line!
This is the eighth line!
This is the ninth line!
This is the tenth line!
This is the 11 line!
This is the end~


[A] git diff
git diff命令用于比较代码库中当前文件与服务器代码之间的代码差异,可以用于制作patch文件。但此命令参数众多、格式多样,所以在此仅介绍较常用的格式。


A.1 使用git diff命令
命令:
git diff package/app/Test/test.txt
返回:
diff --git a/package/app/Test/test.txt b/package/app/Test/test.txt
index fc5b2e4..63e3519 100644
--- a/package/app/Test/test.txt
+++ b/package/app/Test/test.txt
@@ -1,12 +1,12 @@
 This is the first line!
-This is the second line!
+This is the 2 line!
 This is the third line!
 This is the fourth line!
 This is the fifth line!
 This is the sixth line!
-This is the seventh line!
 This is the eighth line!
 This is the ninth line!
 This is the tenth line!
+This is the 11 line!
 This is the end~


注:此为git命令,如果当前Linux系统未安装git,则无法使用此格式。
返回内容中符号与数字的含义分述如下:
第1行标明了源文件与新文件的路径,系统会自动添加a、b用来标识源文件与新文件,而实际上并不存在a、b目录。
第2行为index索引信息,不影响正文内容,所以无需理会。
第3、4行为文件路径的描述,--- 之后的代表源文件,+++ 之后的代表新文件,系统同样自动添加了a、b目录。
第5行@@之间的部分,- 之后的数字代表源文件的行号范围(本例中为-1,12,表示:源文件中从第1行开始的共12行内容),+ 之后的数字代表新文件的行号范围(本例中为+1,12,表示:新文件中从第1行开始的共12行内容)。余下的正文部分中,- 之后的行代表源文件的内容,亦即需要删除的内容;+ 之后的行代表新文件的内容,亦即需要添加的内容;不含有符号的各行代表没有变化,只是引用的上下文。


A.2 生成patch文件
要想生成patch文件,只需将git diff命令的返回内容重定向到一个文本文件中即可。
例如:
1. git diff package/app/Test/test.txt > test.patch
注:上述命令将文件作为参数进行比较,适用于修改单个文件的情况。
2. git diff package/app/Test > test.patch
注:上述命令将目录作为参数进行比较,适用于修改同一目录下多个文件的情况。
3. git diff package/app/Test/test.txt package/app/Test1 package/app/Test2 > test.patch
注:上述命令是添加多个参数的情况,可以同时指定多个路径。




[B] patch
patch命令可以利用git diff命令生成的patch文件进行文件的更新。
注:如果只返回patching file ***,则代表更新成功;如果还提示Hunk #1 FAILED at *,则表示更新失败,原因可能是文件已进行其他修改,此时就需要根据提示出错的行号手动更新了。


B.1 使用patch
通过此格式生成的patch文件中会包含文件路径,所以无需指定文件路径的参数,但是要指定剥离的文件路径层级。
命令:
patch -p1 < test.patch
注:参数-p(或--strip=<剥离层级>)表示欲剥离几层路径名称。本例patch文件中标示的路径为:b/package/app/Test/test.txt,所以当test.patch文件位于/home/sw-kunlun路径下,亦即位于代码包的根目录时,则需要剥离1层文件路径,使其忽略第1层路径b,以使路径变为package/app/Test/test.txt,所以用-p1。
如果将test.patch文件移动到/home/sw-kunlun/package目录下,则需要剥离2层路径,以使路径变为app/Test/test.txt,亦即忽略package路径,所以要将参数改为-p2。以此类推。


B.2 撤销patch
如果运行patch之后,却发现此patch修改的部分有误,需要还原修改前的文件;或者由于其他原因,需要获取修改前的文件状态。在没有改动的前提下,源文件是可以无损还原的。
命令:
patch -p1 -R < test.patch
注:撤销patch其实很简单,只需要在打patch的命令上添加-R的参数即可。不过前提是:源文件与patch文件没有其他修改,而且源文件与patch文件的相对路径未发生变化。如果相对路径发生变化,需要适当调整-p参数的路径剥离层级。




总结:上述git diff与patch命令不但可以在Linux操作系统下使用,在Windows下也可以。只要在Windows下安装Git的客户端:Git-1.7.4-preview,就可以在Git Bash命令行下使用了。
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值