首页  编辑  

git patch打补丁

Tags: /计算机文档/软件应用技巧/   Date Created:

项目开发过程当中,客户要求新开一个repo(相当于硬分叉),和原来的repo脱离,但是原repo又有一些维护工作,代码需要同步更新到新的repo,怎么办?

对于上述情况,我们有两种办法解决:

  • 手动迁移合并
  • 使用git patch自动迁移合并

手动迁移合并容易遗漏,也效率低下,最好是使用git patch来实现自动化的迁移。

  1. 首先,在老的repo中,找到需要迁移的两个 commit 的 hash,例如 8f368259(最新的提交) 和 73bbc19d(老提交) 
  2. 运行 git 指令生成 git diff 文件: git diff 73bbc19d..8f368259 > changes.diff
  3. 在新的 repo 下,运行指令合并  git apply changes.diff ,如果新的 repo 下也有修改,那么需要三方合并: git apply --3way changes.diff 

用上述的方法,可以不遗漏的快速合并所有差异到新的 repo 当中。

上述方法适合源代码目录名没有更改的情况,如果新老repo中,某些源代码文件名目录更改了,会提示错误:
error: xxx/xxx/xxx.xxx: does not exist in index

这种情况下,只能分步骤处理了,对目录变更的单独处理:

git diff HEAD~1 path/to/original/file > patch.diff

然后在应用补丁的时候:

git apply --directory=path/to/new/directory patch.diff

如果需要改变新文件的名称,可以在命令中指定具体的文件名。例如:

git apply --directory=path/to/new/directory --filename=new_file patch.diff

当然,第一步当中,我们如果只是需要对特定的一些文件生成补丁文件也是可以的,不一定要对所有文件生成diff。