git format-patch/diff
Git 提供了两种补丁方案:
一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。
.diff文件
: 只记录文件更改的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。.patch文件
: 带有记录文件更改的内容,也带有commit记录信息,每个commit对应一个patch文件。
-
创建 .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
-
-
应用 .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` 确认合入状态,完成冲突解决。