场景

业务需要从主代码仓库中fork出新代码仓库做定制化平台功能,后续各自迭代自身不同版本一段时间后,主代码仓库上线了某个新功能,希望同步到新平台,但历史其他版本隔离不做同步。

可以借助代码对比工具,手动复制代码提交,相对麻烦且容易遗漏;
后续尝试下面方案:在本地仓库添加多个远端源,之后正常的git命令操作就可以。

添加主仓库作为远程源

1
2
3
4
5
6
7
8
9
10
# 添加一个新的远端仓库
git remote add upstream https://github.com/author-fuyf/largeFileUpload.git

# 从仓库获取所有分支的更新
git fetch upstream

# 此时本地存在两个远端仓库
$ git remote
origin
upstream

不同仓库间的分支可直接merge

如果希望分支之间的改动全量同步,本地分别拉取不同仓库对应分支,直接merge就可以。

1
2
3
4
5
24115@fuyf MINGW64 /e/My-Git/largeFileUploadNew (feature/n1)
$ git merge feature/v1 --no-ff
Merge made by the 'ort' strategy.
frontend/src/main.js | 2 ++
1 file changed, 2 insertions(+)

通过cherry-pick只合并特定的提交(SHA值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 建议操作前新建一个专门的merge分支
git checkout -b merge/20250815

# 执行cherry-pick合并特定commit (单个commit)
git cherry-pick <commit-SHA>

# 多个commit,可批量操作
git cherry-pick <SHA1> <SHA2> ...

# 区间内所有commit git cherry-pick <start-SHA>^..<end-SHA>(^前开后闭 会包含<start-SHA>)
git cherry-pick a719ffbe25c6618eee2f21719ae265f79e727556^..7e5b75afb891f36974f19fcf79d3eedcbc60c793

# -n/--no-commit 表示把改动应用到工作区和暂存区,但不自动生成提交 这样你就可以在工作区里看到这些 commit 带来的所有更改 如果有冲突,需要先解决冲突,然后再继续
git cherry-pick -n a719ffbe25c6618eee2f21719ae265f79e727556^..7e5b75afb891f36974f19fcf79d3eedcbc60c793

为什么用cherry-pick? 它只复制指定提交的更改,而不引入主仓库的其他历史记录(只合并指定的commit当次提交)。相比git merge,它避免了不相关的提交影响。

如果发生冲突,Git会暂停合并;需要手动编辑文件解决冲突,跟正常的分支合并时发生冲突表现一致,不同的是在冲突解决后, 需要运行git cherry-pick –continue 继续进行剩下的cherry-pick,直至全部合并完成

1
git cherry-pick --continue

cherry-pick合并完成后,与主分支对比差异,确认无误后将merge分支合并到目标分支即可,结束。