本文转载自:http://blog.csdn.net/xzongyuan/article/details/9425739

git format-patch相对于git diff更便于操作,是更新的打包方式,应该采取这种打包方式。git diff打包的patch只能使用git apply处理。而git format-patch的补丁,可以应当使用git am命令。

基本用法

git format-patch xxxx.patch

第一种

format-patch可以基于分支进行打包,也可以基于上几次更新内容打包。

基于上几次内容打包

git format-patch HEAD^  有几个^就会打几个patch,从最近一次打起

git format-patch HEAD^^ 最近的二个patch内容

以下代码作用同上

git format-patch -1

git format-patch -2

git format-patch -1 -4    //可以打包版本2,3的patch。但是发现有时候会把最近4个包都打包出来,具体原因未知。

参考:http://leave001.blog.163.com/blog/static/16269129320126944238969/

关于分支,可以参考:http://www.cnblogs.com/y041039/articles/2411600.html

第二种

git format-patch -M origin/master

format-patch 命令依次创建补丁文件,并输出文件名。上面的 -M 选项允许 Git 检查是
否有对文件重命名的提交。我们来看看补丁文件的内容:

  1. $ cat 0001-add-limit-to-log-function.patch
  2. From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 17 00:00:00 2001
  3. From: Jessica Smith <jessica@example.com>
  4. Date: Sun, 6 Apr 2008 10:17:23 -0700
  5. Subject: [PATCH 1/2] add limit to log function
  6. Limit log functionality to the first 20
  7. ---
  8. lib/simplegit.rb |
  9. 2 +-
  10. 1 files changed, 1 insertions(+), 1 deletions(-)
  11. diff --git a/lib/simplegit.rb b/lib/simplegit.rb
  12. index 76f47bc..f9815f1 100644
  13. --- a/lib/simplegit.rb
  14. +++ b/lib/simplegit.rb
  15. @@ -14,7 +14,7 @@ class SimpleGit
  16. end
  17. def log(treeish = 'master')
  18. -
  19. +
  20. command("git log #{treeish}")
  21. command("git log -n 20 #{treeish}")
  22. end
  23. def ls_tree(treeish = 'master')
  24. --
  25. 1.6.2.rc1.20.g8c5b.dirty

如果有额外信息需要补充,但又不想放在提交消息中说明,可以编辑这些补丁文件,
在第一个 --- 行之前添加说明,但不要修改下面的补丁正文,比如例子中的 Limit log
functionality to the first 20 部分。这样,其它开发者能阅读,但在采纳补丁时不会将
此合并进来。

应用patch

  1. $ git am 0001-limit-log-function.patch
  2. Applying: add limit to log function

你会看到它被干净地应用到本地分支,并自动创建了新的提交对象。

有时,我们也会遇到打不上补丁的情况。这多半是因为主干分支和补丁的基础分支相差太远,但也可能是因为某些依赖补丁还未应用。这种情况下,git am 会报错并询问该怎么
做:

  1. $ git am 0001-seeing-if-this-helps-the-gem.patch
  2. Applying: seeing if this helps the gem
  3. error: patch failed: ticgit.gemspec:1
  4. error: ticgit.gemspec: patch does not apply
  5. Patch failed at 0001.
  6. When you have resolved this problem run "git am --resolved".
  7. If you would prefer to skip this patch, instead run "git am --skip".
  8. To restore the original branch and stop patching run "git am --abort".

Git 会在有冲突的文件里加入冲突解决标记,这同合并或衍合操作一样。解决的办法也一样,先编辑文件消除冲突,然后暂存文件,最后运行 git am --resolved 提交修正结果

  1. $ (fix the file)
  2. $ git add ticgit.gemspec
  3. $ git am --resolved
  4. Applying: seeing if this helps the gem

如果想让 Git 更智能地处理冲突,可以用 -3 选项进行三方合并。如果当前分支未包含该补丁的基础代码或其祖先,那么三方合并就会失败,所以该选项默认为关闭状态。一般来
说,如果该补丁是基于某个公开的提交制作而成的话,你总是可以通过同步来获取这个共同祖先,所以用三方合并选项可以解决很多麻烦:

  1. $ git am -3 0001-seeing-if-this-helps-the-gem.patch
  2. Applying: seeing if this helps the gem
  3. error: patch failed: ticgit.gemspec:1
  4. error: ticgit.gemspec: patch does not apply
  5. Using index info to reconstruct a base tree...
  6. Falling back to patching base and 3-way merge...
  7. No changes -- Patch already applied.

像上面的例子,对于打过的补丁我又再打一遍,自然会产生冲突,但因为加上了 -3 选项,所以它很聪明地告诉我,无需更新,原有的补丁已经应用。
对于一次应用多个补丁时所用的 mbox 格式文件,可以用 am 命令的交互模式选项 -i,这样就会在打每个补丁前停住,询问该如何操作:

  1. $ git am -3 -i mbox
  2. Commit Body is:
  3. --------------------------
  4. seeing if this helps the gem
  5. --------------------------
  6. Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all

在多个补丁要打的情况下,这是个非常好的办法,一方面可以预览下补丁内容,同时也可以有选择性的接纳或跳过某些补丁。
打完所有补丁后,如果测试下来新特性可以正常工作,那就可以安心地将当前特性分支合并到长期分支中去了

git format-patch 用法【转】的更多相关文章

  1. git rebase和git merge的用法

    http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...

  2. Git merge && git rebase的用法

    Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m  “Merge from Dev”  Dev //-m可以加上m ...

  3. git日常基本用法

    git作为项目管理现在已经是越来越广泛应用,结合自己平时的一些基本操作加上git说明文档里面的一些补充,我总结了一下git的基本用法: mkdir project # 创建项目目录 cd projec ...

  4. git diff 生成patch, git apply patch 打补丁方法说明,以及分支管理的简单操作。

    git diff 简易操作说明 先git log 查看commit ID, 记录你想要打的补丁的ID 比如说: git log commit 4ff35d800fa62123a28b7bda2a04e ...

  5. Git的Patch功能

    转自:http://www.cnblogs.com/y041039/articles/2411600.html UNIX世界的软件开发大多都是协作式的,因此,Patch(补丁)是一个相当重要的东西,因 ...

  6. Git diff 常见用法

      Git diff 用于比较两次修改的差异 1.1 比较工作区与暂存区 git diff  比较的是单个仓库的工作区与暂存区的差别,repo diff是对git diff的封装,用来分别显示各个项目 ...

  7. Eclipse Git和sourceTree用法

    Eclipse Git和sourceTree用法 Eclipse Git: 提交代码到git: 1.team->Repository->pull 若没有冲突: 2.team->com ...

  8. git的基本用法——我的日常使用

    git的基本用法 一,前言 网上有太多关于git的用法说明,而我看得云里雾里,可能是本人比较愚笨.平常时间老问别人又觉得很不好意思,估计大多的同学们都是自己解决.后来我想到了买一本书,淘宝上git书籍 ...

  9. git 生成patch 和打入patch

    转载:https://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用gi ...

  10. str.format格式化用法(通过{}来替代%)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #str.format格式化用法(通过{}来替代%) ''' >>> help(format ...

随机推荐

  1. VFS文件系统结构分析

    VFS是Linux非常核心的一个概念,linux下的大部分操作都要用到VFS的相关功能.这里从使用者的角度,对VFS进行了简单说明.使用者不但需要知道Linux下有哪些文件操作的函数,还需要对VFS的 ...

  2. web service初探

    概述:Web service是一个平台独立.低耦合的.自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发 ...

  3. Python环境搭建之OpenCV

    一.openCV介绍 Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持.OpenCV是一个基于 ...

  4. C++官方文档-常量成员函数

    #include <iostream> using namespace std; class MyClass { public: int x; static int n; const in ...

  5. python urlretrieve 下载图片

    python 3中urlretrieve方法直接将远程数据下载到本地.为什么不行? 55 import re import urllib.request def getHtml(url): page ...

  6. PHP获取跳转后的URL,存到数据库,设置缓存时间

    <?php error_reporting(0); header("Content-Type: text/html; charset=utf-8"); $fid=$_GET[ ...

  7. c++builder XE7 C++11 C++0x 新语法

    Non-static data member initializers 非静态成员变量初始化变得简单,这个XE7 64位编译成功,32位还是不支持 As a simple example, struc ...

  8. 简单的socket_server 和 socket_client(实现文件的上传功能)

    socket_server 客户端程序 import socket, os, json class Ftcplient(object): def __init__(self): "" ...

  9. python的线上环境配置

    1.安装python 2.7   http://www.cnblogs.com/strikebone/p/3970512.html 2.安装相关前置工具  pip, Django http://www ...

  10. Nginx打开目录浏览功能(autoindex)以及常见问题解决方案

    Nginx默认是不允许列出整个目录的.如需此功能,打开nginx.conf文件,在location server 或 http段中加入autoindex on;另外两个参数最好也加上去: autoin ...