git merge,rebase,cherry-pick区别以及遇到冲突之后如何解决

一、 git merge

使用:

js 复制代码
// 切换到当前分支
git checkout test
// 合并目标分支
git merge master

merge操作会将master分支的最新提交E与test分支的最新提交C D与两者的公共祖先B进行三方合并生成最新提交G。

特点:

1.merge会将目标分支与当前分支的最新提交进行合并,如果没有遇到冲突的情况下会生成一个新的提交记录并默认进行提交。

2.merge注重的是真实的提交历史记录,保持树状的提交历史。

遇到冲突如何解决:

  1. 解决冲突 :首先,手动编辑冲突的文件。冲突部分通常会被特殊的标记包围,比如<<<<<<<=======>>>>>>>。你需要检查这些部分,决定保留哪些更改,并删除这些标记和你不想要的更改。
  2. 将解决冲突后的文件添加到暂存区 :使用git add命令将解决冲突后的文件添加到暂存区。可以逐个添加文件,也可以使用git add .一次性添加所有已解决冲突的文件。
  3. 提交合并后的代码 :使用git commit命令提交合并后的代码。在提交时,最好附上一个有意义的提交信息,说明此次合并的内容和解决冲突的情况,例如git commit -m "Merge branch 'feature' into 'main' with conflict resolution"
  4. 推送合并后的代码 :最后,使用git push命令将合并后的代码推送到远程仓库。

因此merge再遇到冲突时需要手动解决冲突并提交,不会进行自动提交。

二、git rebase

js 复制代码
git checkout test(待变基分支)
git rebase master(基分支)

特点:

  1. git rebase在没有冲突的情况下不会自动提交。当执行 rebase 操作时,git 会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面,这个过程本身并不包括提交操作。
  2. git rebase会改变当前分支的基底,使分支记录呈线性。

遇到冲突如何解决:

  1. 解决冲突 :首先,你需要手动编辑文件以解决冲突。冲突的部分通常会被特殊的标记包围,比如<<<<<<<=======>>>>>>>。你需要保留你想要的更改,并删除这些标记和你不想要的更改。
  2. 添加文件到暂存区 :一旦冲突解决,你需要使用git add命令将修改后的文件添加到暂存区。你可以逐个添加文件,或者使用git add .来添加所有修改过的文件。
  3. 继续rebase :接下来,使用git rebase --continue命令来继续rebase过程。这个命令会应用你之前解决的冲突,并尝试继续将剩下的提交去进行对比。
  4. 处理可能的后续冲突:如果在继续rebase的过程中遇到更多的冲突,你需要重复上述步骤(解决冲突、添加文件、继续rebase)直到所有的冲突都被解决。
  5. 完成rebase:如果rebase过程顺利完成,没有更多的冲突需要解决,那么你的分支现在应该已经包含了所有你想要的提交,并且是基于最新的上游分支。
  6. commit提交:当完成rebase之后,需要手动进行提交操作,然后push到远程仓库

需要注意的是,在使用rebase时,如果当前分支已经提交到了远程仓库中,那么再git push时会出现问题:

原因就是因为使用了rebase导致跟远程分支的历史提交记录发生了偏离,因此需要git push -f进行强制push,这一操作也会使远程分支的提交记录发生改变。

三、git cherry-pick

js 复制代码
git checkout 当前分支
git cherry-pick <commit-hash>...

特点:

1.git cherry-pick可以选择一个或多个已经存在的提交,并应用到当前分支,如果没有遇到冲突,会再当前分支的历史记录后边新增一个或多个提交记录,没有冲突情况下也会默认进行提交。

2.与git merge不同,git merge会把两个分支的提交记录进行合并后新增一个新的提交记录,而git cherry-pick只会再当前分支后新增,不会进行合并。

遇到冲突如何解决:

  1. 解决冲突 :首先,你需要手动编辑文件以解决冲突。冲突的部分通常会被特殊的标记包围,比如<<<<<<<=======>>>>>>>。你需要保留你想要的更改,并删除这些标记和你不想要的更改。
  2. 将解决冲突后的文件添加到暂存区 :使用 git add 命令将解决冲突后的文件添加到暂存区。可以逐个添加文件,也可以使用 git add . 一次性添加所有已解决冲突的文件。
  3. 继续cherry-pick :一旦冲突解决并添加了文件,使用 git cherry-pick --continue 命令来继续cherry-pick操作。这个命令会应用你之前解决的冲突,并尝试继续cherry-pick操作。
  4. 处理可能的后续冲突:如果在继续cherry-pick的过程中遇到更多的冲突,你需要重复上述步骤(解决冲突、添加文件、继续cherry-pick)直到所有的冲突都被解决。
  5. 放弃cherry-pick :如果由于某些原因你决定放弃cherry-pick操作,可以使用 git cherry-pick --abort 命令来中止操作,此时Git会将你的代码恢复到操作前的状态。
相关推荐
kyriewen29 分钟前
你的前端滤镜慢得像PPT?用Rust+WebAssembly,一秒处理4K图
前端·rust·webassembly
kyriewen1138 分钟前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒1 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端
东方小月1 小时前
Claude Code 完整上手指南:MCP、Skills、第三方模型配置一次搞定
前端·人工智能·后端
XZ探长2 小时前
基于 Trae Solo 移动办公修复 Vue3 前端服务问题
前端
蝎子莱莱爱打怪2 小时前
Claude Code 省 Token 小妙招:RTK + Caveman 组合拳
前端·人工智能·后端
Momo__2 小时前
Vue 3.6 Vapor Mode:跳过虚拟 DOM,性能极致优化
前端·vue.js
少年白马醉春风丶2 小时前
从零构建 AIGC 无限画布:AIGCCanvasFlow 技术全解析
前端·后端·aigc
OpenTiny社区2 小时前
生成式 UI 藏大招!看似露营案例,实则电商集成 GenUI SDK 干货
前端·ai编程·交互设计
Awu12272 小时前
🍎Vue官方Skills深度解读:那些被悄悄藏起来的宝藏
前端·aigc·claude