使用SVN、Git生成和应用patch的命令

    SVN和Git两种版本控制系统生成和应用patch的区别。

一、SVN:

1、在指定版本间生成patch:

svn diff -r 421:438 > r421_438.patch        //是r421以后当前目录的所有修改,不包括r421修改
diff -r 421:422    是r422的当前目录的所有修改。
diff -c 422    跟上一行一样,表示r422的changes。

2、svn应用patch:

  p1:数字1表示文件深度,即目录,需要根据patch文件中修改路径+当前所在目录确定的.

  例如:项目TestAndroid的源码目录:..../TestAndroid/test/media/...

  test.patch文件中路径:--- a/media/....
  其中a不是有效路径,下述为根据当前所在目录不同,对应的命令参数
  当当前所在目录为test/时,patch -p1 ......
  当当前所在目录为media/时,patch -p0 ......

二、Git:

1、生成patch

(1)两个commit间的修改(包含两个commit)【此时-o 后面是生成patch文件夹名,此时所有patch均在该目录下】

  git format-patch <r1>..<r2>
  如:
  git format-patch d77aaac74845435744c49ae65511d9e1be79ed5c 046ee8f8423302f5070ca81b4e246516e919cd7a -o patchDir

(2)单个commit
    git format-patch -1 <r1>
    git format-patch -n <r1>    【从节点r1向前的n个节点的提交(包括r1)】    

(3)从某commit以来的修改(不包含该commit)【记住:此时并非生成一个patch文件;而是每个提交都会生成一个patch文件】
    git format-patch <r1>

2、检查及应用patch

(1)把生成的patch文件拷贝到目标git目录下
(2)检查patch文件
      git apply --stat 0001-minor-fix.patch
(3)查看是否能应用成功
      git apply --check 0001-minor-fix.patch
(4)应用patch
      git apply 0001-minor-fix.patch    【仅应用,并未提交;查看状态显示为 M】
(5)另一方法:【应用并提交,不建议使用】
      git am -s < 0001-minor-fix.patch      【使用-s在提交记录中会出现Signed-off-by信息,签名信息】
      或   git am < 0001-minor-fix.patch    【根据具体情况而定】

3、原文参考:http://www.linuxidc.com/Linux/2014-09/106323.htm

4、关于git中patch的一点思考:

(1)在本地Git Bash中自测,git patch 针对某个目录或文件的使用?

  上述情况不合理,patch不可能去针对某个目录或文件;因为:修改一个bug时可能会涉及多个文件,这样生成patch是按照某次提交来生成的,这样才有意义,才是完成的。
  若仅针对某个文件生成patch,这很有可能不是一次完整的提交,也没实际意义!

猜你喜欢

转载自www.cnblogs.com/sparrowlhl/p/11283943.html