kingBook

导航

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` 确认合入状态,完成冲突解决。

posted on 2022-05-13 11:38  kingBook  阅读(580)  评论(0编辑  收藏  举报