git format-patch/diff

Git 提供了两种补丁方案:
一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。

  • .diff文件: 只记录文件更改的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。
  • .patch文件: 带有记录文件更改的内容,也带有commit记录信息,每个commit对应一个patch文件。
  1. 创建 .patch / .diff 文件

    • git format-patch -1 在当前项目文件夹下,创建最新一次提交的 .patch 文件

    • git format-patch <commitHash> -n 在当前项目文件夹下,创建某次提交(含)之前的 n 次提交的 .patch 文件

    • git format-patch <commitHash> -1 在当前项目文件夹下,创建某次提交的 .patch 文件

    • git format-patch <commitHashA>..<commitHashB> 在当前项目文件夹下,创建某两次提交间的所有 .patch 文件(假设提交顺序为a,b,c,d,如果填a..d,则为b,c,d不包括a)

    • git format-patch <commitHash> -n -o C:/Users/Administrator/Desktop 在桌面,创建某次提交(含)之前的 n 次提交的 .patch 文件

    • git diff <commitHashA> <commitHashB> > <xx.diff> 在当前项目文件夹下,创建某两次提交间的 .diff 文件(假设提交顺序为a,b,c,d,如果填a d,则为b,c,d不包括a)
      如:git format-patch d75b13a 666f706 > abc.diff

  2. 应用 .patch / .diff 文件

    • git apply --stat <xx/xx/xx.patch> 这个命令用于检查补丁文件,确保文件没有问题

    • git apply --check <xx/xx/xx.patch> 这个命令用于检查如果应用到本代码树是否会有问题,相当于一个演练。这样可以避免合并的时候才出现问题

    • git apply <xx/xx/xx.patch> 应用 .patch 文件,不包括提交信息

    • git apply <xx/xx/xx.diff> 应用 .diff文件,不包括提交信息

    • git am <xx/xx/xx.patch> 应用修改,包括提交信息

    • git am -s <xx/xx/xx.patch> 应用修改,包括提交信息,并在提交信息增加提交者的签名信息

冲突解决
在应用补丁时,可能会出现冲突的情况,会应用失败,如:

Administrator@kingBook MINGW64 ~/Desktop/testGitB (master)
$ git am -s 0002-cc.patch
error: patch failed: new text.txt:1
error: new text.txt: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Applying: cc
Patch failed at 0001 cc
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

Administrator@kingBook MINGW64 ~/Desktop/testGitB (master|AM 1/1)
$ 

// 提示:
// 解决此问题后,运行 "git am --continue".
// 如果你想跳过这个补丁,可以运行 "git am --skip".
// 要恢复原始分支并停止修补,请运行 "git am --abort".

此时需要解决冲突:

1. 首先执行 `git apply --reject xxxx.patch`,应用 .patch 文件中不冲突的部分,并将冲突的部分生成对应的 .rej 文件记录下来。
2. 依据生成的.rej文件内容逐个手动解决冲突,然后删除这些 *.rej 文件
3. 执行命令 `git status` 查看当前改动过的以及新增的文件,确保没有多添加或少添加文件
4. 执行命令 `git add -A` 将所有改动都添加到暂存区
5. 执行命令 `git am --resolved` 继续被中断的 patch 合入操作。合入完成后,会有提示信息输出。
6. 执行命令 `git log` 确认合入状态,完成冲突解决。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值