当前位置: 首页 > news >正文

05-Git常用高阶操作:reset/rebase/cherry-pick/merge冲突解决

05-Git常用高阶操作:reset/rebase/cherry-pick/merge冲突解决

前言

做开发三年,Git 命令只会addcommitpush三件套?这在团队协作里可不够用。当你需要撤销提交、整理分支历史、或者把某个功能单独摘到另一个分支时,resetrebasecherry-pick这些高阶操作就派上用场了。

本文从实际场景出发,把这些命令掰开揉碎讲清楚,顺带把最让人头疼的 merge 冲突解决流程走一遍。


一、git reset:三种模式,三种后果

git reset的核心作用是移动 HEAD 指针(当前分支的最新提交位置)。根据模式不同,对暂存区和工作区的影响也不同。

1.1 --soft:只动 HEAD

gitreset--softHEAD~1

效果:HEAD 回退到上一个提交,但暂存区和工作区保持不变

适用场景:提交后发现 commit message 写错了,或者想把几个连续的提交合并成一个。代码改动都还在暂存区里,直接重新commit即可。

1.2 --mixed(默认):动 HEAD + 暂存区

gitreset--mixedHEAD~1# 或者直接gitreset HEAD~1

效果:HEAD 回退,暂存区被重置,但工作区代码不变

适用场景:提交后发现多 add 了文件,想重新选择要提交的内容。改动还在,只是从暂存区退回到了工作区。

1.3 --hard:动 HEAD + 暂存区 + 工作区

gitreset--hardHEAD~1

效果:HEAD 回退,暂存区和工作区全部被重置到指定提交的状态。

适用场景:本地写的代码完全不要了,回到某个干净的版本。注意:此操作不可逆(除非用 reflog 找回),生产环境慎用。

一个记忆技巧:soft → 只动 HEAD;mixed → 动 HEAD + 暂存区;hard → 动 HEAD + 暂存区 + 工作区。从轻到重,逐步覆盖。

1.4 三种模式对比

模式HEAD暂存区工作区风险等级
--soft移动不变不变
--mixed移动重置不变
--hard移动重置重置高(不可逆)

二、git rebase:变基原理与黄金法则

2.1 什么是变基

rebase(变基)的意思是:把当前分支的提交"搬"到目标分支最新提交的后面,让提交历史变成一条直线。

# merge 之后的提交历史(有分叉) A---B---C---D (main) \ E---F (feature) # rebase 之后的提交历史(直线) A---B---C---D---E'---F' (feature)

变基过程中,E 和 F 会被重新应用到 D 之后,生成新的提交 E’ 和 F’(SHA 值变了,但内容相同)。

2.2 常用命令

# 将 feature 分支变基到 maingitcheckout featuregitrebase main# 交互式变基,整理最近3个提交(合并、修改message等)gitrebase-iHEAD~3

交互式变基可以做的操作:

  • pick:保留该提交
  • squash:将该提交合并到上一个提交
  • reword:修改提交信息
  • drop:丢弃该提交

2.3 rebase 的黄金法则

永远不要对已经推送到远程仓库的公共分支执行 rebase。

原因很简单:rebase 会重写提交历史,生成新的 SHA 值。如果别人基于旧的提交历史在开发,你 rebase 后一 push,别人的本地分支就全乱了。

简单记:rebase 只用于本地分支整理,公共分支用 merge。


三、git cherry-pick:精准挑选提交

有时候你只想把某个分支上的某几个提交拿到当前分支,而不是合并整个分支。比如 feature 分支上修了一个 bug,你想把这个修复单独提到 main 分支,但不想把其他还没完成的提交带过来。

3.1 基本用法

# 挑选单个提交gitcherry-pick<commit-hash># 挑选多个提交gitcherry-pick<hash1><hash2><hash3># 挑选一个范围(不包含起始提交,包含结束提交)gitcherry-pick<start-hash>..<end-hash>

3.2 实战场景

无人售货柜项目中,固件分支firmware-v2上修了一个传感器读取的 bug,提交 hash 是a3f5b2c。主干分支main也需要这个修复:

gitcheckout maingitcherry-pick a3f5b2cgitpush origin main

就这么简单,精准拿走,不多带一个提交。

cherry-pick 也会产生冲突,解决方式和 merge 冲突一样,后面统一讲。


四、git merge 冲突:产生与解决流程

4.1 冲突是怎么产生的

当两个分支修改了同一个文件的同一行代码,Git 无法自动判断保留哪个版本,就会产生冲突。

gitcheckout featuregitmerge main# Auto-merging src/main.java# CONFLICT (content): Merge conflict in src/main.java

4.2 冲突文件长什么样

打开冲突文件,你会看到类似这样的标记:

public void checkSensor() { <<<<<<< HEAD int threshold = 50; // feature分支的修改 ======= int threshold = 80; // main分支的修改 >>>>>>> main if (sensorValue > threshold) { alert(); } }
  • <<<<<<< HEAD=======之间是当前分支(feature)的代码
  • =======>>>>>>> main之间是传入分支(main)的代码

4.3 解决冲突的标准流程

第一步:查看冲突文件列表

gitstatus# Unmerged paths:# both modified: src/main.java

第二步:打开冲突文件,手动编辑

保留正确的代码,删除冲突标记。比如这里我们判断threshold应该取 80:

publicvoidcheckSensor(){intthreshold=80;if(sensorValue>threshold){alert();}}

第三步:标记冲突已解决

gitaddsrc/main.java

第四步:完成合并

gitcommit-m"merge: 合并main分支,解决传感器阈值冲突"

或者用git merge --continue一键完成。

4.4 冲突解决的三条原则

  1. 看懂再改:理解两段代码各自的意图,别盲目保留一端
  2. 改完测试:解决冲突后必须跑一遍编译和测试,确保逻辑没有断裂
  3. 小步合并:频繁同步主干分支,减少长期分叉带来的大面积冲突

4.5 rebase 冲突的解决

rebase 产生冲突时,解决流程类似,但命令不同:

# 解决冲突后gitadd<冲突文件>gitrebase--continue# 如果想中止 rebase,回到开始前gitrebase--abort

五、命令速查表

操作命令风险
回退提交(保留改动)git reset --soft HEAD~1
回退提交(改动退回工作区)git reset --mixed HEAD~1
回退提交(彻底丢弃改动)git reset --hard HEAD~1
整理提交历史git rebase -i HEAD~3
挑选提交git cherry-pick <hash>
合并分支git merge <branch>
中止合并git merge --abort
中止变基git rebase --abort

总结

命令核心用途一句话记忆
reset回退到历史提交soft 轻、mixed 中、hard 重
rebase整理提交历史为直线只在本地用,别碰公共分支
cherry-pick精准摘取单个提交像摘樱桃,挑熟的那颗
merge合并分支冲突不可怕,看懂再改

掌握这四个命令,日常 Git 协作基本够用了。关键不是记住命令参数,而是理解每一步操作背后到底动了什么——HEAD、暂存区、工作区,搞清楚这三者,Git 就不会再让你头疼。

http://www.jsqmd.com/news/1377874/

相关文章:

  • 工程机械工件焊缝硬度精准检测解决方案 - 仪器小丸子
  • 本地部署Krea-2-Turbo-GGUF与ComfyUI:构建可视化AI生图工作流
  • 开源视频知识蒸馏工具“仓颉.Skill”2.0:从原理到部署实战
  • Postman入门指南:从HTTP请求到API测试自动化
  • 基于Playwright的滑块验证码自动化破解实战指南
  • 分布式链路追踪Java实战12
  • 5分钟解锁Wand高级功能:开源增强工具全面指南
  • 从1到n求和:编程思维、算法优化与OJ实战全解析
  • 从零理解Function Calling:大模型与外部世界交互的核心协议
  • 2026年非标机械设计培训择校参考指南 - 优质品牌中立测评推荐
  • 构建可解释AI Agent:从黑盒到透明化的四层架构实践
  • 无源码调试与重构.NET程序集:dnSpyEx深度分析指南
  • 2026年贵州武术散打培训机构选型指南:师资能力、升学保障与文武兼修模式对比 - 中国品牌企业推荐网
  • 中国技术大败局TBL-20260812-063深度解剖报告V2.1 决策迭代版
  • Wireshark 4.0.2 安装配置全指南:从零搭建网络分析环境
  • 从零手写AI Agent:深入理解核心架构与Python实现
  • 新手学Python开发,先搞懂这七个核心概念
  • YOLO-World开放词汇目标检测:从环境配置到实战部署全指南
  • BabyAGI 之后何去何从?2026 AI Agent 框架选型与生产级落地避坑实录
  • 2026昭通瓷砖空鼓翘边维修指南|筑宅安房屋修缮,全域上门解决墙砖松动脱落难题 - 筑宅安
  • CentOS 7.9离线部署Nginx全攻略:从Yum本地源到源码编译
  • 零基础也能玩转激光雕刻:LaserGRBL让你的创意轻松变现实
  • 3分钟免安装微信网页版解决方案:绕过公司限制的终极指南
  • 爱你老己从涨薪开始:UG全3D模具设计硬控面试官,包教到能接单,2026逆袭! - 橡果教育Acorn
  • Ubuntu 22.04安装配置VS Code全攻略:APT/Snap/手动安装与高效开发环境搭建
  • Windows 11安装跳过强制联网与微软账户登录的四种实用方法详解
  • Visual Studio代码格式化实战:.editorconfig配置与团队协作规范
  • AI Agent启动流程全解析:从配置管理到健康监控的工程实践
  • 2026北京离婚争取孩子抚养权律师选择盘点:正规机构推荐对比+签约避坑指南 - U渠道
  • 别再一个个传了!PHP批量上传图片,这代码直接抄