本文主要是介绍Git 仓库间代码迁移 | merge cherry-pick,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
工作中遇到了这样场景:原工程 A 由于业务发展,衍生出了 B 工程,至此两个工程独立迭代。A 工程近期上线了一个功能,B 工程也希望具备该功能,需要研发同学做代码的同步。
问题简化:如何在两个 git 仓库间做代码迁移。
回溯一下,如果将代码从一个分支迁移到另一个分支。
- 如果需要所有代码变动,可以使用
merge
操作; - 如果需要部分代码变动(某几个提交),可以使用
cherry-pick
操作。
merge
将两个或多个分支的历史合并在一起。
$ git merge --helpNAMEgit-merge - Join two or more development histories together
...
示例:
🐫 将 branchA
branchB
合并到当前分支
$ git merge branchA branchB
🐎 将 branchA
合并到当前分支,使用 ours
的合并策略:
$ git merge -s ours branchA
三种常见的合并策略:ours
、theirs
和 recursive
:
选择合适的合并策略取决于具体需求和合并的场景
选项 | 说明 |
---|---|
recursive(默认) | 尝试找到两个分支的共同祖先,然后分别将两个分支的改动应用到共同祖先上,最后将这些改动合并到一起 |
ours | 优先选择主分支(通常是当前所在的分支)的改动 |
theirs | 优先选择要合并进来的分支的改动 |
仓库间合并
# 追加源
$ git remote add originNew git://url
# 将新追加源远程内容获取本地
$ git fetch originNew
# merge
$ git merge branchName
当然也可以直接合并远程
# 追加源
$ git remote add originNew git://url
# merge
$ git merge originNew/branchName
git fetch
从另一个存储库下载objects和refs# 从多个获取 $ git fetch origin originNew # 获取全部 $ git fetch --all
cherry-pick
允许开发者精确地选择和应用特定的提交到不同的分支。
$ git cherry-pick --helpNAMEgit-cherry-pick - Apply the changes introduced by some existing commits
允许将一个或多个已有的提交从一个分支应用到当前分支。这就像是从另一个分支“挑选”提交并将其“复制”到当前的工作分支。
示例
🐫 某个特定的提交: 将 commit-hash
应用到当前分支
$ git cherry-pick <commit-hash>
🐎 一系列提交: 将 commit1
到 commit2
的所有提交应用到当前分支
$ git cherry-pick commit1..commit2
🐏 某合并的提交: 将 mergeCommit
应用到当前分支
$ git cherry-pick -m 1 <mergeCommit>
针对 merge 的 cherry-pick
,不知道合并的哪一边应该被视为主线。通过 -m
指定,1 代表父分支。
🐕 只想将变更应用到工作目录和索引,而不创建新的提交
$ git cherry-pick -n <commit-hash>
🐃 将指定提交中对特定文件的变更应用到工作目录和索引
$ git rev-list --reverse <commit-hash> -- <file-path> | git cherry-pick -n --stdin
避免冲突
在 cherry-pick 过程中可能会遇到冲突,Git 会暂停操作并让需要手动解决。解决冲突后,需要继续操作:
$ git cherry-pick --continue
如果决定放弃 cherry-pick,可以使用:
$ git cherry-pick --abort
仓库间应用
# 追加源
$ git remote add originNew git://url
# 将新追加源远程内容获取本地
$ git fetch originNew
# cherry-pick
$ git cherry-pick commit1..commit2
这篇关于Git 仓库间代码迁移 | merge cherry-pick的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!