文章目录
- 适用场景:将某个分支的单个或多个指定提交应用到当前分支。 # 基本语法 git cherry-pick <commit-hash> # 示例:将feature分支的提交应用到main分支 # 1. 首先切换到目标分支 git checkout main # 2. 查看要合并的提交ID git log –oneline –graph feature # 3. 选择并合并特定提交 git cherry-pick abc123def # 4. 合并多个不连续的提交 git cherry-pick abc123def 789xyz01 # 5. 合并连续范围的提交(左开右闭) git cherry-pick start-commit^..end-commit # 例如:合并从A到B的所有提交(不包括A,包括B) git cherry-pick abc123^..def456
- 适用场景:将整个分支的部分功能合并,但只想合并某个提交后的变化。 # 1. 创建一个临时分支,只包含要合并的提交 git checkout -b temp-branch <commit-hash> # 或者从某个点开始 git checkout -b temp-branch feature-branch~3 # 2. 切换到目标分支 git checkout main # 3. 合并临时分支 git merge –no-ff temp-branch # 4. 删除临时分支 git branch -d temp-branch
- 假设我们有以下分支结构: main分支:A—B—C feature分支:D—E—F—G ↑↑ 提交E提交G(我们想合并的提交)
- 方法一:使用cherry-pick(推荐) # 步骤1:确认当前所在分支 git branch # 输出:* main # 步骤2:查看feature分支的提交历史 git log feature –oneline -5 # 输出: # g789xyz1 (feature) 提交G:添加用户注册功能 # f456abc2 提交F:修复登录bug # e123def3 提交E:实现用户登录 # d890ghi4 提交D:初始化项目 # c567jkl5 提交C:main分支的更新 # 步骤3:将feature分支的提交E合并到main git cherry-pick e123def3 # 如果遇到冲突,解决冲突后继续 git add . git cherry-pick –continue # 或者放弃 git cherry-pick –abort # 步骤4:将feature分支的提交G也合并到main git cherry-pick g789xyz1 # 步骤5:查看合并后的历史 git log –oneline -5 –graph # 输出: # * h987mno6 提交G:添加用户注册功能 # * i654pqr7 提交E:实现用户登录 # * c567jkl5 提交C:main分支的更新 # * b234stu8 提交B # * a901vwx9 提交A 方法二:创建补丁并应用 # 步骤1:在源分支创建补丁 git checkout feature git format-patch e123def3 –stdout > my-patch.patch # 步骤2:切换到目标分支并应用补丁 git checkout main git apply my-patch.patch # 步骤3:提交更改 git add . git commit -m “应用来自feature分支的补丁”
- 情况一:合并连续的提交 # 合并feature分支上从提交D到提交G的所有提交(不包括D,包括G) git checkout main git cherry-pick d890ghi4^..g789xyz1 情况二:合并不连续的提交 # 只合并E和G两个提交,跳过F git checkout main git cherry-pick e123def3 g789xyz1 情况三:交互式选择提交 # 使用交互式rebase创建新分支,然后合并 git checkout feature git rebase -i main~5 # 在编辑器中选择要保留的提交,然后: git checkout main git merge –no-ff feature
- # 步骤1:获取远程分支信息 git fetch origin # 步骤2:查看远程分支的提交 git log –oneline origin/feature -5 # 步骤3:合并远程分支的特定提交 git cherry-pick origin/feature:commit-hash # 或者先创建本地跟踪分支 git checkout -b feature origin/feature git checkout main git cherry-pick abc123def
- # 从feature分支提取部分提交到新分支 git checkout -b partial-feature feature git rebase -i HEAD~5# 只保留最近5个提交中需要的部分 # 然后合并到main git checkout main git merge –no-ff partial-feature
- 场景:只合并某个文件或目录的更改 # 方法1:使用checkout提取文件 git checkout feature — path/to/file.js git add path/to/file.js git commit -m “从feature分支合并file.js” # 方法2:使用difftool查看并应用部分更改 git difftool main..feature — path/to/directory 场景:合并提交但修改提交信息 # 使用cherry-pick时编辑提交信息 git cherry-pick -e abc123def # 或者在cherry-pick后修改 git cherry-pick abc123def git commit –amend -m “新的提交信息”
- # 当cherry-pick发生冲突时 git cherry-pick abc123def # Git会提示冲突,查看冲突文件 git status # 手动解决冲突 # 使用编辑器打开冲突文件,标记为: <<<<<<< HEAD 当前分支的内容 ======= 要合并的提交内容 >>>>>>> abc123def… 提交信息 # 解决后标记为已解决 git add resolved-file.js # 继续cherry-pick git cherry-pick –continue # 或者跳过这个提交 git cherry-pick –skip # 或者中止整个操作 git cherry-pick –abort
- # 配置合并工具(如vimdiff、vscode等) git config –global merge.tool vimdiff # 发生冲突时使用工具解决 git mergetool # 或者使用特定工具 git mergetool –tool=vscode
- # 假设我们有以下情况: # main分支(生产环境):v1.0.0 # develop分支(开发分支):有多个新功能,但有一个紧急bug修复需要立即上线 # 1. 首先在开发分支上找到修复bug的提交 git checkout develop git log –oneline –grep=”fix” -5 # 输出:a1b2c3d 修复用户登录的安全漏洞 # 2. 创建热修复分支 git checkout main git checkout -b hotfix-login # 3. 合并bug修复提交 git cherry-pick a1b2c3d # 4. 如果有冲突,解决冲突 # 假设没有冲突,继续… # 5. 测试热修复分支 npm test # 6. 合并到main分支 git checkout main git merge –no-ff hotfix-login git tag v1.0.1 # 7. 推送到远程 git push origin main git push origin v1.0.1 # 8. 将热修复也合并回develop分支 git checkout develop git merge –no-ff hotfix-login # 9. 清理分支 git branch -d hotfix-login
- # 场景:develop分支有功能A、B、C,但本次发布只需要A和C # 1. 查看develop分支的提交历史 git checkout develop git log –oneline –graph -10 # 2. 识别功能A和C的提交范围 # 功能A:提交 x1y2z3 到 a1b2c3 # 功能C:提交 m1n2o3 到 p1q2r3 # 3. 创建发布分支 git checkout -b release-1.1 main # 4. 合并功能A的所有提交 git cherry-pick x1y2z3^..a1b2c3 # 5. 合并功能C的所有提交 git cherry-pick m1n2o3^..p1q2r3 # 6. 解决可能出现的冲突 # 如果两个功能修改了同一文件的不同部分,可能需要手动调整 # 7. 测试发布分支 npm run test npm run build # 8. 最终发布 git checkout main git merge –no-ff release-1.1 git tag v1.1.0
- 先拉取最新代码 git checkout main git pull origin main 保持提交历史的清晰 # 合并后使用rebase整理历史 git rebase -i HEAD~10 编写清晰的提交信息 git cherry-pick abc123def -m “合并功能X的修复:描述详细内容” 及时处理冲突 优先在源分支解决冲突 使用git mergetool工具 小步提交,减少冲突概率
- 问题1:cherry-pick后丢失提交信息 # 解决方案:使用-x参数保留原提交信息 git cherry-pick -x abc123def 问题2:需要合并大量提交 # 解决方案:使用rebase创建新分支 git checkout -b partial-feature feature git rebase –onto main feature~10 feature git checkout main git merge –no-ff partial-feature 问题3:合并后需要修改代码 # 解决方案:使用–no-commit参数 git cherry-pick –no-commit abc123def # 修改代码… git add . git commit -m “合并并调整功能X” 问题4:需要回退错误的合并 # 如果cherry-pick出错 git cherry-pick –abort # 如果已经提交 git revert HEAD # 或者 git reset –hard HEAD~1
- 命令 用途 示例 git cherry-pick <commit> 合并单个提交 git cherry-pick abc123def git cherry-pick A^..B 合并连续提交范围 git cherry-pick start^..end git cherry-pick –no-commit 合并但不自动提交 git cherry-pick –no-commit abc123def git cherry-pick -x 保留原提交信息 git cherry-pick -x abc123def git cherry-pick –continue 解决冲突后继续 解决冲突后执行 git cherry-pick –abort 放弃cherry-pick 冲突时放弃 git cherry-pick –skip 跳过当前提交 冲突时跳过 git format-patch 创建补丁文件 git format-patch abc123def git apply 应用补丁 git apply patch-file.patch
目录
- 一、Git 提交合并的基本方法
- 1.1 使用cherry-pick(最常用方法)
- 1.2 使用merge –no-ff
- 二、详细操作步骤与示例
- 2.1 场景分析
- 2.2 具体操作步骤
- 2.3 处理多个提交的情况
- 三、高级技巧与场景
- 3.1 合并远程分支的特定提交
- 3.2 使用rebase提取提交
- 3.3 处理复杂的合并场景
- 四、解决冲突的策略
- 4.1 冲突解决流程
- 4.2 使用合并工具
- 五、实战案例:完整工作流程
- 案例:从开发分支提取热修复到生产分支
- 案例:提取部分功能到发布分支
- 六、最佳实践与注意事项
- 6.1 最佳实践
- 6.2 常见问题与解决方案
- 6.3 常用命令速查表
- 七、可视化工具的使用
- 7.1 使用 Git GUI 工具
- 7.2 命令行可视化
- 八、总结
适用场景:将某个分支的单个或多个指定提交应用到当前分支。
# 基本语法 git cherry-pick <commit-hash> # 示例:将feature分支的提交应用到main分支 # 1. 首先切换到目标分支 git checkout main # 2. 查看要合并的提交ID git log --oneline --graph feature # 3. 选择并合并特定提交 git cherry-pick abc123def # 4. 合并多个不连续的提交 git cherry-pick abc123def 789xyz01 # 5. 合并连续范围的提交(左开右闭) git cherry-pick start-commit^..end-commit # 例如:合并从A到B的所有提交(不包括A,包括B) git cherry-pick abc123^..def456
适用场景:将整个分支的部分功能合并,但只想合并某个提交后的变化。
# 1. 创建一个临时分支,只包含要合并的提交 git checkout -b temp-branch <commit-hash> # 或者从某个点开始 git checkout -b temp-branch feature-branch~3 # 2. 切换到目标分支 git checkout main # 3. 合并临时分支 git merge --no-ff temp-branch # 4. 删除临时分支 git branch -d temp-branch
假设我们有以下分支结构:
main分支:A---B---C feature分支:D---E---F---G ↑↑ 提交E提交G(我们想合并的提交)
方法一:使用cherry-pick(推荐)
# 步骤1:确认当前所在分支 git branch # 输出:* main # 步骤2:查看feature分支的提交历史 git log feature --oneline -5 # 输出: # g789xyz1 (feature) 提交G:添加用户注册功能 # f456abc2 提交F:修复登录bug # e123def3 提交E:实现用户登录 # d890ghi4 提交D:初始化项目 # c567jkl5 提交C:main分支的更新 # 步骤3:将feature分支的提交E合并到main git cherry-pick e123def3 # 如果遇到冲突,解决冲突后继续 git add . git cherry-pick --continue # 或者放弃 git cherry-pick --abort # 步骤4:将feature分支的提交G也合并到main git cherry-pick g789xyz1 # 步骤5:查看合并后的历史 git log --oneline -5 --graph # 输出: # * h987mno6 提交G:添加用户注册功能 # * i654pqr7 提交E:实现用户登录 # * c567jkl5 提交C:main分支的更新 # * b234stu8 提交B # * a901vwx9 提交A
方法二:创建补丁并应用
# 步骤1:在源分支创建补丁 git checkout feature git format-patch e123def3 --stdout > my-patch.patch # 步骤2:切换到目标分支并应用补丁 git checkout main git apply my-patch.patch # 步骤3:提交更改 git add . git commit -m "应用来自feature分支的补丁"
情况一:合并连续的提交
# 合并feature分支上从提交D到提交G的所有提交(不包括D,包括G) git checkout main git cherry-pick d890ghi4^..g789xyz1
情况二:合并不连续的提交
# 只合并E和G两个提交,跳过F git checkout main git cherry-pick e123def3 g789xyz1
情况三:交互式选择提交
# 使用交互式rebase创建新分支,然后合并 git checkout feature git rebase -i main~5 # 在编辑器中选择要保留的提交,然后: git checkout main git merge --no-ff feature
# 步骤1:获取远程分支信息
git fetch origin
# 步骤2:查看远程分支的提交
git log --oneline origin/feature -5
# 步骤3:合并远程分支的特定提交
git cherry-pick origin/feature:commit-hash
# 或者先创建本地跟踪分支
git checkout -b feature origin/feature
git checkout main
git cherry-pick abc123def
# 从feature分支提取部分提交到新分支
git checkout -b partial-feature feature
git rebase -i HEAD~5# 只保留最近5个提交中需要的部分
# 然后合并到main
git checkout main
git merge --no-ff partial-feature
场景:只合并某个文件或目录的更改
# 方法1:使用checkout提取文件 git checkout feature -- path/to/file.js git add path/to/file.js git commit -m "从feature分支合并file.js" # 方法2:使用difftool查看并应用部分更改 git difftool main..feature -- path/to/directory
场景:合并提交但修改提交信息
# 使用cherry-pick时编辑提交信息 git cherry-pick -e abc123def # 或者在cherry-pick后修改 git cherry-pick abc123def git commit --amend -m "新的提交信息"
# 当cherry-pick发生冲突时
git cherry-pick abc123def
# Git会提示冲突,查看冲突文件
git status
# 手动解决冲突
# 使用编辑器打开冲突文件,标记为:
<<<<<<< HEAD
当前分支的内容
=======
要合并的提交内容
>>>>>>> abc123def... 提交信息
# 解决后标记为已解决
git add resolved-file.js
# 继续cherry-pick
git cherry-pick --continue
# 或者跳过这个提交
git cherry-pick --skip
# 或者中止整个操作
git cherry-pick --abort
# 配置合并工具(如vimdiff、vscode等)
git config --global merge.tool vimdiff
# 发生冲突时使用工具解决
git mergetool
# 或者使用特定工具
git mergetool --tool=vscode
# 假设我们有以下情况:
# main分支(生产环境):v1.0.0
# develop分支(开发分支):有多个新功能,但有一个紧急bug修复需要立即上线
# 1. 首先在开发分支上找到修复bug的提交
git checkout develop
git log --oneline --grep="fix" -5
# 输出:a1b2c3d 修复用户登录的安全漏洞
# 2. 创建热修复分支
git checkout main
git checkout -b hotfix-login
# 3. 合并bug修复提交
git cherry-pick a1b2c3d
# 4. 如果有冲突,解决冲突
# 假设没有冲突,继续...
# 5. 测试热修复分支
npm test
# 6. 合并到main分支
git checkout main
git merge --no-ff hotfix-login
git tag v1.0.1
# 7. 推送到远程
git push origin main
git push origin v1.0.1
# 8. 将热修复也合并回develop分支
git checkout develop
git merge --no-ff hotfix-login
# 9. 清理分支
git branch -d hotfix-login
# 场景:develop分支有功能A、B、C,但本次发布只需要A和C
# 1. 查看develop分支的提交历史
git checkout develop
git log --oneline --graph -10
# 2. 识别功能A和C的提交范围
# 功能A:提交 x1y2z3 到 a1b2c3
# 功能C:提交 m1n2o3 到 p1q2r3
# 3. 创建发布分支
git checkout -b release-1.1 main
# 4. 合并功能A的所有提交
git cherry-pick x1y2z3^..a1b2c3
# 5. 合并功能C的所有提交
git cherry-pick m1n2o3^..p1q2r3
# 6. 解决可能出现的冲突
# 如果两个功能修改了同一文件的不同部分,可能需要手动调整
# 7. 测试发布分支
npm run test
npm run build
# 8. 最终发布
git checkout main
git merge --no-ff release-1.1
git tag v1.1.0
- 先拉取最新代码
git checkout main
git pull origin main
- 保持提交历史的清晰
# 合并后使用rebase整理历史
git rebase -i HEAD~10
- 编写清晰的提交信息
git cherry-pick abc123def -m "合并功能X的修复:描述详细内容"
- 及时处理冲突
- 优先在源分支解决冲突
- 使用
git mergetool工具
- 小步提交,减少冲突概率
git mergetool工具
问题1:cherry-pick后丢失提交信息
# 解决方案:使用-x参数保留原提交信息 git cherry-pick -x abc123def
问题2:需要合并大量提交
# 解决方案:使用rebase创建新分支 git checkout -b partial-feature feature git rebase --onto main feature~10 feature git checkout main git merge --no-ff partial-feature
问题3:合并后需要修改代码
# 解决方案:使用--no-commit参数 git cherry-pick --no-commit abc123def # 修改代码... git add . git commit -m "合并并调整功能X"
问题4:需要回退错误的合并
# 如果cherry-pick出错 git cherry-pick --abort # 如果已经提交 git revert HEAD # 或者 git reset --hard HEAD~1
| 命令 | 用途 | 示例 |
|---|---|---|
| git cherry-pick <commit> | 合并单个提交 | git cherry-pick abc123def |
| git cherry-pick A^..B | 合并连续提交范围 | git cherry-pick start^..end |
| git cherry-pick –no-commit | 合并但不自动提交 | git cherry-pick –no-commit abc123def |
| git cherry-pick -x | 保留原提交信息 | git cherry-pick -x abc123def |
| git cherry-pick –continue | 解决冲突后继续 | 解决冲突后执行 |
| git cherry-pick –abort | 放弃cherry-pick | 冲突时放弃 |
| git cherry-pick –skip | 跳过当前提交 | 冲突时跳过 |
| git format-patch | 创建补丁文件 | git format-patch abc123def |
| git apply | 应用补丁 | git apply patch-file.patch |
- SourceTree:可视化的cherry-pick操作
- GitKraken:拖拽提交到其他分支
- VSCode GitLens:图形化界面选择提交
# 查看分支图
git log --all --graph --oneline --decorate
# 查看特定分支的提交
git log feature --graph --oneline -10
# 使用tig工具(需要安装)
tig feature
将一个分支的特定提交合并到另一个分支是Git中常见且重要的操作,主要通过以下方法实现:
git cherry-pick:最直接的方法,适用于合并单个或少量提交- 创建临时分支:适用于需要合并一系列相关提交
- 补丁文件:适用于需要跨仓库或离线合并
关键要点:
- 始终在合并前确保目标分支是最新的
- 小步提交,减少冲突概率
- 使用
-x参数保留原提交信息 - 及时处理冲突,避免累积问题
- 合并后进行充分的测试
通过掌握这些技巧,你可以灵活地管理代码库,精确控制哪些更改进入哪个分支,提高团队协作效率和代码质量。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- idea切换Git分支时保存未提交的文件方式
- Git提交到错误分支如何解决
- git如何合并某个分支的某次提交(cherry-pick)
- Git创建子分支,合并分支并提交
- Git 创建分支提交远程分支详解