工作中遇到了这样场景:原工程 A 由于业务发展,衍生出了 B 工程,至此两个工程独立迭代。A 工程近期上线了一个功能,B 工程也希望具备该功能,需要研发同学做代码的同
问题简化:如何在两个 git 仓库间做代码迁移。
回溯一下,如果将代码从一个分支迁移到另一个分支。
merge 操作;cherry-pick 操作。merge将两个或多个分支的历史合并在一起。
$ git merge --help
NAME
git-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/branchNamegit fetch 从另一个存储库下载objects和refs
# 从多个获取
$ git fetch origin originNew
# 获取全部
$ git fetch --allcherry-pick允许开发者精确地选择和应用特定的提交到不同的分支。
$ git cherry-pick --help
NAME
git-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