patch/git patch使用经验

来源:互联网 发布:什么软件可以传真 编辑:程序博客网 时间:2024/04/28 00:34
 生成patch的方法
    1. 使用linux下的diff命令
1.为单个文件生成补丁
  1. $ diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c > patch
-u 显示有差异行的前后几行(上下文), 默认是前后各3行, 这样, patch中带有更多的信息.
-p 显示代码所在的c函数的信息.
 2.为多个文件生成补丁
  1. $ diff -uprN linux-2.6.28.8.orig/net/sunrpc/ linux-2.6.28.8/net/sunrpc/
这条命令对比了linux-2.6.28.8.orig/net/sunrpc/和linux-2.6.28.8/net/sunrpc/两个目录下的所有源码差异.
参数详解:
-r 递归地对比一个目录和它的所有子目录(即整个目录树).
-N 如果某个文件缺少了, 就当作是空文件来对比. 如果不使用本选项, 当diff发现旧代码或者新代码缺少文件时, 只简单的提示缺少文件. 如果使用本选项, 会将新添加的文件全新打印出来作为新增的部分.

3 打patch 
生成的补丁中, 路径信息包含了你的Linux源码根目录的名称, 但其他人的源码根目录可能是其它名字, 所以, 打补丁时, 要进入你的Linux源码根目录, 并且告诉patch工具, 请忽略补丁中的路径的第一级目录(参数-p1).
  1. $ patch -p1 < patch1.diff
diff命令必须在整个Linux源码的根目录的上一级目录中执行.

【注】
       p0表示当前路径,p1表示忽略第一个路径,例如 在 home/share路径下,执行patch,而patch是share/ubuntu/file/1.c 。p1表示忽略share目录。
       如果用git diff生成的patch,使用patch打上时,有所不同,还需要做测试

4 示例
给修改过的内核生成patch,然后用生成的patch给未修改过的内核打补丁
其中,目录linux-2.6.31.3为未修改过的内核,目录linux-2.6.31.3_1为修改过的内核
  1. $ diff -uparN linux-2.6.31.3 linux-2.6.31.3_1/ > mypatch
  2. $ cd linux-2.6.31.3
  3. $ patch -p1 < mypatch
【注】:
         1. 用diff工具不能对两个独立的文件同时生成一个patch,例如: diff 1.c 2.c > file.diff
          该命令会将2.c当作1.c的差异。
          2. 已经打过的patch,用同样的命令,则会还原patch,若要严格指定打or还原patch
        严格指定打patch        
  1.  # patch -Np0 < foo.patch
        严格指定还原patch     
  1.  # patch -Rp0 < foo.patch


【2】 git 生成patch和使用patch
方式 1:
       使用git diff命令
  1. git diff > patch
  2. git diff --cached > patch
  3. git diff branchname --cached > patch
打patch
  1. git apply patch
git apply 是一个事务性操作的命令,也就是说,要么所有补丁都打上去,要么全部放弃
用以下命令检查patch是否可以顺利打上
  1. git apply --check <patch>

方式2
  git format-patch 命令
  1. 1)两个节点之间的提交: git format-patch 节点A 节点B
  2. 2)单个节点: git format-patch -1 节点A (-n就表示要生成几个节点的提交)
  3. 3)最近一次提交节点的patch git format-patch HEAD^ 依次类推…
使用git format-patch命令生成的patch文件,包含了提交的附加信息:比如作者,时间等
打patch
  1. git am <PATCH>
再次基础上使用git am命令即可将此补丁应用到当前分支。注意应用完之后,你会发现当前分支多了一次提交记录,并且有完整的信息,而不是简单的修改文件。在对比一下,git diff 和git format-patch生成的patch一个重要不同之处,实际使用中会发现git diff一次只会生成一个patch文件,不管差别了多少个提交,都是一个;而git format-patch是根据提交的节点来的,一个节点一个patch。

 补充小技巧:  如果有额外信息需要补充,但又不想放在提交消息中说明以免搞乱了提交说明。可以编辑这些补丁文件,在第一个“---” 行之前添加说明即可。这样的信息能阅读,但在执行完git am命令之后该节点的提交信息不回包含上述信息

  1. 本地代码与服务器代码有冲突,导致代码无法提交入库
  2.       使用git format-patch -1 (-1是指将上一笔,也可以-1 + commit id) 将提交做成patch
  3.       使用git reset 将本地代码回退到之前的版本。
  4.       重新git pull到最新代码
  5.       使用git am + patch 将之前提交重新合入,此时使用git log可以看到提交
  6.       repo upload .重新提交


参考: 
git am PATCH 失败的处理方法
http://blog.csdn.net/sunnylgz/article/details/7660638

git 生成patch和使用patch
http://blog.csdn.net/maybe_windleave/article/details/8703778

原创粉丝点击