赞
踩
使用git diff用于显示当前工作区与暂存区或提交历史之间的差异,如果使用它生成patch,则需要使用git apply命令来引入patch,比如:
$git diff A.cpp >commit.patch
使用git format-patch生成patch,如下所示:
- # 打包最近的一个patch:
- $git format-patch HEAD^
- # 打包最近的两个patch
- $git format-patch HEAD^^
- # 打包最近的三个patch
- $git format-patch HEAD^^^
- # 打包最近的n个patch
- $git format-patch -n
- # 打包版本n1与n2之间的patch
- $git format-patch -n1 -n2
- # 某次提交以后的所有patch,不包含此次提交,两者等价
- $ git format-patch -s 5d7c81a2b
- $ git format-patch 5d7c81a2b
打包好后会生成0001-XXX.patch 这样格式的patch,使用git am(自动提交) /git apply 来merge patch即可。
如果patch有很多且都是这种0001、0002,即由git format-patch批量生成,则直接执行命令:
$git am ./patch/*.patch
注意:这里的*.patch需要是生成时就做了自动排序的,比如git format-patch批量生成。
如果有如下报错:
- git/rebase-apply/patch:272730: trailing whitespace.
- struct gpio_pins {
- .git/rebase-apply/patch:272752: trailing whitespace.
-
- .git/rebase-apply/patch:272814: trailing whitespace.
- gpio_direction_output(data->ipd_hall_en,1);
- .git/rebase-apply/patch:272841: trailing whitespace.
-
- .git/rebase-apply/patch:272874: trailing whitespace.
- printk(KERN_ERR"GpioCtl_open\n");
- warning: squelched 39 whitespace errors
- warning: 44 lines add whitespace errors.
则执行:
$git am --whitespace=fix 0001-xxx.patch
会自动修复一部分 whitespace errors
如果git am时报错,如下所示:
- warning: quoted CRLF detected
- Applying: update code
- error: patch failed: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.asn1_compiler.cmd:1
- error: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.asn1_compiler.cmd: patch does not apply
- error: patch failed: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.bin2c.cmd:1
- error: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.bin2c.cmd: patch does not apply
- ...
那么接下怎么做呢?先执行
$git apply --reject 0001-xxx.patch
这时会在文件目录下产生 .rej 后缀的文件,里面就是无法自动合并的冲突,需要手动修改。手动修改正确后再将rej文件删除即可。
因为属于modified状态,因此需要执行:
$git add xxx
操作之后再继续执行:
$git am --resolved
就这样,直到所有patch都正确merge即可。
git diff和git format-patch是Git中用于生成补丁和差异的命令,它们之间的主要区别如下:
总结来说:git diff用于显示当前工作区与暂存区或提交历史之间的差异,用于查看尚未暂存或提交的更改。git format-patch用于将提交转换为补丁文件,每个补丁文件包含了一个提交的所有修改内容,用于传递和应用补丁。这两个命令在不同的场景下有不同的用途,根据你的需求选择适合的命令来查看差异或生成补丁。
- # 在master分支下保证当前代码与线上同步。
- $git pull origin master
- # 查看远程分支
- $git branch -r
- # 查看本地和远程的所有分支
- $git branch -a
- #新建分支
- $git branch <分支名>
- #切换到新建的分支
- $git checkout/switch <分支名>
- #优化操作,创建分支的同时再切换到该分支
- $git checkout -b <分支名>
- # 把本地分支推到远端,让远端也有一个你的分支,用来后面提交你的代码
- $git push origin <分支名>
- # 合并分支,在当前分支下将 <分支>合并到当前分支,合并冲突后手动解决冲突
- # 解决后使用git commit -m "Merge branchname into current branch"来完成了分支的合并操作
- # 如果有冲突则需要先解决冲突再最后提交,其中
- # 介于 <<<<<<<HEAD 和 ======= 之间的内容是代码块1中内容,
- # 介于 ======= 和 >>>>>>> 之间的内容是代码块2中内容。
- $git merge <分支名>
- # 删除分支,注意,只有当该分支的修改已经合并到其他分支时,才能被安全地删除。如果分支的修改尚未合并,可以使用强制删除的命令
- git branch -d <分支名>
- # 分支的修改尚未合并,强制删除分支
- git branch -D <分支名>
$git branch -m <oldbranch> <newbranch>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。