Git零基础实战之如何实现子项目同步更新

Git零基础实战之如何实现子项目同步更新


  • 1. 背景

  • 2.git apply vs git am

  • 3.生成patch

  • 4.git apply使用

  • 5.git am使用

1. 背景

假设我们有一个独立的插件项目,因为一些项目的变更,现在需要将其迁移到一个较大的项目中的子目录中。传统的方法可能包括使用 git cherry-pick 来选择性地应用提交,但这种方法并不能很好的处理子目录问题

例如:项目A是我们的目标仓库,项目B是我们的子项目仓库,我们期望将项目B的commit同步到项目A,但是当你直接使用cherry-pick你会发现,项目B中的文件会同步到light/src目录,而不是我们期望的extension/src里面,这样就不对了。

项目A: 
 light/src/xxx
 light/extension
 light/extension/src/xxx
 ...
 
项目B: 
 extension/src/xxx

相比之下,Git Apply 与 Git AM 提供了更加灵活和高效的方式来处理这种迁移。

2.git apply vs git am

命令 是否应用补丁? 是否创建提交? 适用场景
git apply 在提交之前测试 git diff(即补丁)的效果。也可用于在构建前将补丁应用于第三方库。
git am 从邮件或由 git format-patch 生成的文件中应用补丁。适用于协作和接受他人的贡献。
  • 适用场景:
    • git apply:主要用于测试 git diff(即补丁)在提交之前的效果。也可以用于在构建之前将补丁应用于第三方库。
    • git am:用于从邮件或由 git format-patch 生成的文件中应用补丁。非常适用于协作和接受他人的贡献。
  • 是否创建提交:
    • git apply:只应用补丁,不创建提交。
    • git am:在应用补丁的同时,会创建提交。

这里提到了两个点,git diff与git format-patch,这两者有一点区别,git diff只有 diff信息,而format会携带commit信息、diff信息、git版本。

而git apply与git am最根本的区别在于apply不会创建新的提交,即没有commit,只是应用patch,而git am会把commit带过来。所以git am不能使用git diff的patch,因为没有commit,而git apply可以使用git diff与git format-patch的patch,因为都包含了diff信息。


3.生成patch

生成patch我们可以用git diff与git format-patch,用法比较简单,以下给出几个示例。

  • git diff

示例1:比较工作目录和暂存区之间的差异。

git diff > changes.patch

示例2:比较两个提交之间的差异:

git diff <commit1> <commit2>
  • git format-patch

示例1:获取最新的commit生成patch。

git format-patch -1 --stdout > changes.patch

示例2:生成两个提交之间的补丁文件。

git format-patch <start_commit>..<end_commit>

git format-patch <start_commit>..<end_commit> --stdout > changes.patch

可以通过指定:--stdout > changes.patch 将所有的patch合并为一个。

4.git apply使用

不论是git apply还是git am在进行同步diff时,最好开启-3或--3way,当发生合并冲突事件,便可以看到diff信息。

可以看到当git apply时,出现了ours与theirs,ourstheirs 选项用于指定冲突解决策略。当在应用补丁的过程中遇到冲突时,Git 需要知道如何解决这些冲突。这些选项允许你指定使用当前分支 (ours) 或者应用的补丁 (theirs) 的更改来解决冲突。

5.git am使用

与git apply类似,但又有所不同,当使用-3或--3way后,下面的diff便是HEAD与commit。

可以看到不论是git am还是git apply都可以做到diff同步功能,git cherry-pick也可以做到,回到本文的背景,为何没有使用git cherry-pick呢,那是因为涉及到子目录的迁移,而git am与git apply允许指定subdirectories,通过--directory,完整命令:

git apply --3way --directory=extension changes.patch

git am --3way --directory=extension changes.patch


本节完,欢迎转发收藏~

往期精彩回顾



  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961


相关推荐

  • 【深度学习】基于深度学习的目标检测算法综述
  • vue3优雅的使用useDialog
  • 15.5K Star,开源免费的IP归属地实现包
  • 性能提升 46%,又一开源项目爆了
  • 一文说清当下时间序列热门应用与挑战
  • 马斯克突然开源 Grok:3140 亿参数巨无霸,免费可商用
  • 没等来 OpenAI,等来了 Open-Sora 全面开源
  • 黄仁勋甩出最强AI核弹!GPU新架构性能暴涨30倍,首发人形机器人大模型,联手苹果闯MR
  • 苹果希望iPhone引入谷歌Gemini模型;英伟达发布最强AI芯片;Apache Flink 1.19发布 | 极客头条
  • Linus Torvalds 不满提交到 Linux 6.9 的部分 Bcachefs 代码
  • 分析了 500 万份工作,看看有多少正被 AI 取代?
  • 50+国内外大模型专家齐聚,全球机器学习技术大会第二批嘉宾阵容公布!
  • 为什么defineProps宏函数不需要从vue中import导入?
  • helloworld - 同一个世界,同一行代码
  • 养成15个好的代码小习惯,让老大对你刮目相看
  • 一次真实生产事故,让我总结了线程池的正确使用方式
  • 谁说MySQL单表行数不要超过2000W?
  • 假如周处除三害发生在 IT 圈
  • springboot第65集:字节跳动一面经,一文让你走出微服务迷雾架构周刊
  • Spring Boot 整合 Postgres 实现轻量级全文搜索