git导出不同版本的差异代码

本文介绍了如何利用git导出不同版本之间的代码差异,并提供了在不同git仓库间持续同步代码的方案。通过执行特定命令,可以便捷地获取版本间的修改,避免手动操作的繁琐。此外,还阐述了一种确保代码同步且能独立开发的流程。

场景:

有时候会遇到不同git仓库但要相互同步代码,而我们只需要导出修改后的代码,我们不可能一个个文件的拷贝出来吧,而且文件夹的目录结构手动处理不管是容错、还是工作量都是不小的开支。因此我们利用git archive指令来导出有差异的代码

两个已提交版本的代码差异导出

  1. 列出两个版本commit(可以使用git log、也可以使用IDEA的VersionControl右键Copy Reversion Number)
  2. 执行命令(win版)
git archive --format=zip HEAD $(git diff --name-only b083cb774d2a19d58ff043bbdea904316e9c84c5 6cc9baeb488f3d6e1f254ef092703351057f3250) > diff.zip
  1. 执行命令(linux版)
git archive --format=zip HEAD `git diff --name-only b083cb774d2a19d58ff043bbdea904316e9c84c5 6cc9baeb488f3d6e1f254ef092703351057f3250` > diff.zip

b083cb774d2a19d58ff043bbdea904316e9c84c5 表示老版commit
6cc9baeb488f3d6e1f254ef092703351057f3250 表示新版commit

  1. 注意点:
  • 存在文件删除的,无法同步(未验证)
  • 必须在git仓库的根目录执行
  • 打包后的zip解压,直接粘贴到老版commit的基准代码就能实现代码合并了。

不同git仓库的代码持续同步方案

假设现在的场景,gitA仓库的代码,被发送给了B,并建立了新的仓库gitB。B要在此基础开发。同时又需要接受gitA仓库代码的bug修复。

  1. gitA与gitB确认代码基线
  2. gitB仓库建立专属gitA的分支
  3. gitB仓库建立B分支在此基础做开发任务
  4. 当gitA发布代码补丁,通过上述导出命令,生成zip后将代码同步到gitB仓库的gitA分支,最后合并gitA分支到B分支。
  5. 以上流程便实现既能开发又能维护补丁。当然fork也有这个功能,但这种情况考虑的是两个git仓库是私仓或不愿透露仓库信息的情况。
以下是几种使用 Git 导出提交文件的方法: ### 导出提交记录及修改的文件清单 可以使用 `git log` 命令结合不同的选项参数来导出相关信息: - `-p`:按补丁格式显示每个更新之间的差异。 - `--stat`:显示每次更新的文件修改统计信息。 - `--shortstat`:只显示 `--stat` 中最后的行数修改添加移除统计。 - `--name-only`:仅在提交信息后显示已修改的文件清单。 - `--name-status`:显示新增、修改、删除的文件清单。 - `--abbrev-commit`:仅显示 SHA - 1 的前几个字符,而非所有的 40 个字符。 - `--relative-date`:使用较短的相对时间显示(比如,“2 weeks ago”)。 - `--graph`:显示 ASCII 图形表示的分支合并历史。 - `--pretty`:使用其他格式显示历史提交信息。可用的选项包括 `oneline`,`short`,`full`,`fuller` 和 `format`(后跟指定格式)。 示例命令: ```bash git log --name-only ``` 运行此命令后,会显示提交信息及已修改的文件清单。同时,运行 `git log --help` 可查看完整的参数说明,运行该命令后会自动打开本地的帮助文档,如 `file:///D:/Git/mingw64/share/doc/git-doc/git-log.html` [^1]。 ### 查找特定提交中已更改的文件列表 - `git show --name-only`:简洁列出文件名,适用于快速查看单次提交的文件列表。 ```bash git show --name-only <commit-hash> ``` - `git show --name-status`:显示变更类型(A/M/D),适用于需区分增删改操作的代码审查。 ```bash git show --name-status <commit-hash> ``` - `git diff-tree --name-only`:无冗余信息,适合脚本处理,可用于自动化流程或导出文件列表。 ```bash git diff-tree --name-only <commit-hash> ``` - `git log --name-only`:支持多提交范围查看,适用于分析连续提交的整体变更趋势。 ```bash git log --name-only <start-commit-hash>..<end-commit-hash> ``` 其中 `<commit-hash>` 为提交的哈希值,`<start-commit-hash>` 和 `<end-commit-hash>` 分别为起始和结束提交的哈希值 [^2]。 ### 使用 patch 文件导出和导入修改 可以创建一个 `patch` 文件来导出修改内容,然后在其他地方应用这些修改。 ```bash git diff <start-commit-hash> <end-commit-hash> > changes.patch ``` 该命令将两个提交之间的差异保存到 `changes.patch` 文件中。之后可以使用以下命令将 `patch` 文件中的修改应用到当前目录下的文件: ```bash git apply changes.patch ``` 需要注意,如果修改的文件在其他 Git 分支或者其他 Git 仓库中也被修改过,那么 `patch` 命令可能会遇到冲突,需要手动解决 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值