当前位置:   article > 正文

Git版本管理(02)patch操作和分支操作整理_git diff 批量生成多个patch

git diff 批量生成多个patch

1 git patch操作

1.1 git diff比较

使用git diff用于显示当前工作区与暂存区或提交历史之间的差异,如果使用它生成patch,则需要使用git apply命令来引入patch,比如:

$git diff A.cpp >commit.patch

1.2 git patch打包

使用git format-patch生成patch,如下所示:

  1. # 打包最近的一个patch:
  2. $git format-patch HEAD^
  3. # 打包最近的两个patch
  4. $git format-patch HEAD^^
  5. # 打包最近的三个patch
  6. $git format-patch HEAD^^^
  7. # 打包最近的n个patch
  8. $git format-patch -n
  9. # 打包版本n1与n2之间的patch
  10. $git format-patch -n1 -n2
  11. # 某次提交以后的所有patch,不包含此次提交,两者等价
  12. $ git format-patch -s 5d7c81a2b
  13. $ git format-patch 5d7c81a2b

打包好后会生成0001-XXX.patch 这样格式的patch,使用git am(自动提交) /git apply 来merge patch即可。

1.3 git am操作总结

@1 批量am操作

如果patch有很多且都是这种0001、0002,即由git format-patch批量生成,则直接执行命令:

$git am  ./patch/*.patch

注意:这里的*.patch需要是生成时就做了自动排序的,比如git format-patch批量生成。

如果有如下报错:

  1. git/rebase-apply/patch:272730: trailing whitespace.
  2. struct gpio_pins {
  3. .git/rebase-apply/patch:272752: trailing whitespace.
  4. .git/rebase-apply/patch:272814: trailing whitespace.
  5. gpio_direction_output(data->ipd_hall_en,1);
  6. .git/rebase-apply/patch:272841: trailing whitespace.
  7. .git/rebase-apply/patch:272874: trailing whitespace.
  8. printk(KERN_ERR"GpioCtl_open\n");
  9. warning: squelched 39 whitespace errors
  10. warning: 44 lines add whitespace errors.

则执行:

$git am --whitespace=fix 0001-xxx.patch

会自动修复一部分 whitespace errors

@2 冲突修复

如果git am时报错,如下所示:

  1. warning: quoted CRLF detected
  2. Applying: update code
  3. error: patch failed: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.asn1_compiler.cmd:1
  4. error: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.asn1_compiler.cmd: patch does not apply
  5. error: patch failed: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.bin2c.cmd:1
  6. error: LINUX/android/kernel/ship_prebuilt/secondary_kernel/scripts/.bin2c.cmd: patch does not apply
  7. ...

那么接下怎么做呢?先执行

$git apply --reject 0001-xxx.patch

这时会在文件目录下产生 .rej 后缀的文件,里面就是无法自动合并的冲突,需要手动修改。手动修改正确后再将rej文件删除即可。

因为属于modified状态,因此需要执行

$git add xxx

操作之后再继续执行
 

$git am --continue

就这样,直到所有patch都正确merge即可。

1.4 git diff和git format-patch的区别

git diff和git format-patch是Git中用于生成补丁和差异的命令,它们之间的主要区别如下:

  • git diff:git diff命令用于显示当前工作区与暂存区或提交历史之间的差异。可以显示文件的修改内容,包括添加、删除和修改的行。可以使用不同的选项和参数来控制差异的显示方式,比如显示具体的文件差异、忽略空白字符等。git diff通常用于查看尚未暂存或提交的更改,以帮助你了解当前工作区的状态和修改内容。
  • git format-patch:git format-patch命令用于生成补丁文件(patch files),它将一系列提交转换为可应用的补丁文件。git format-patch会为每个提交创建一个单独的补丁文件,每个补丁文件包含了该提交的所有修改内容。生成的补丁文件一般以.patch扩展名结尾,可以通过邮件或其他方式传递给他人,以便他们应用这些补丁到他们的代码库中。补丁文件包含了修改的具体内容,包括添加、删除和修改的行,以及与之相关的提交信息。git format-patch命令可以使用不同的选项和参数来控制生成补丁文件的方式,比如指定要处理的提交范围、生成多个补丁文件等。

总结来说:git diff用于显示当前工作区与暂存区或提交历史之间的差异,用于查看尚未暂存或提交的更改。git format-patch用于将提交转换为补丁文件,每个补丁文件包含了一个提交的所有修改内容,用于传递和应用补丁。这两个命令在不同的场景下有不同的用途,根据你的需求选择适合的命令来查看差异或生成补丁。

2 git分支操作

2.1 基本操作

  1. # 在master分支下保证当前代码与线上同步。
  2. $git pull origin master
  3. # 查看远程分支
  4. $git branch -r
  5. # 查看本地和远程的所有分支
  6. $git branch -a

2.2 新建 / 切换分支

  1. #新建分支
  2. $git branch <分支名>
  3. #切换到新建的分支
  4. $git checkout/switch <分支名>
  5. #优化操作,创建分支的同时再切换到该分支
  6. $git checkout -b <分支名>

2.3 提交分支到远端

  1. # 把本地分支推到远端,让远端也有一个你的分支,用来后面提交你的代码
  2. $git push origin <分支名>

2.4 合并分支

  1. # 合并分支,在当前分支下将 <分支>合并到当前分支,合并冲突后手动解决冲突
  2. # 解决后使用git commit -m "Merge branchname into current branch"来完成了分支的合并操作
  3. # 如果有冲突则需要先解决冲突再最后提交,其中
  4. # 介于 <<<<<<<HEAD 和 ======= 之间的内容是代码块1中内容,
  5. # 介于 ======= 和 >>>>>>> 之间的内容是代码块2中内容。
  6. $git merge <分支名>

2.5 删除分支

  1. # 删除分支,注意,只有当该分支的修改已经合并到其他分支时,才能被安全地删除。如果分支的修改尚未合并,可以使用强制删除的命令
  2. git branch -d <分支名>
  3. # 分支的修改尚未合并,强制删除分支
  4. git branch -D <分支名>

2.6 重命名本地分支

$git branch -m <oldbranch> <newbranch>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/215957
推荐阅读
相关标签
  

闽ICP备14008679号