news 2026/10/15 20:13:32

Git高级操作:从合并冲突到历史重写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git高级操作:从合并冲突到历史重写

前言

日常add、commit、push三连够用,但总有些场景超出基础操作范围:

  • 合并冲突不知道怎么解
  • commit信息写错了想改
  • 代码搞乱了想回退
  • 需要从别的分支复制某个提交

这篇整理Git进阶操作,覆盖这些场景的处理方法。


一、合并冲突

两个人改了同一个文件的同一个地方,Git不知道该保留哪个,就产生冲突了。

gitmerge feature# CONFLICT (content): Merge conflict in src/config.js

打开文件,会看到这样的标记:

<<<<<<<HEADconstAPI='https://prod.api.com';=======constAPI='https://test.api.com';>>>>>>>feature

<<<<<<<到=======是你当前分支的代码,=======到>>>>>>>是要合并进来的代码。

手动改成你想要的样子(把那些标记删掉):

constAPI=process.env.API_URL||'https://prod.api.com';

然后:

gitaddsrc/config.jsgitcommit

搞定。

偷懒的办法:如果你确定要用其中一边的:

gitcheckout --ours src/config.js# 用我的gitcheckout --theirs src/config.js# 用他的

不想合并了:

gitmerge --abort

回到合并前的状态。

二、修改提交

commit message写错了:

gitcommit --amend -m"正确的提交信息"

忘了加某个文件:

gitaddforgotten.jsgitcommit --amend --no-edit

注意:如果已经push了,amend之后要push --force,这个在团队项目里慎用。

三、撤销操作

分情况处理:

改了文件还没add

gitrestore src/config.js# 恢复单个文件gitrestore.# 恢复所有

add了还没commit

gitrestore --staged src/config.js# 从暂存区撤出

commit了还没push

# 撤销commit,代码还在gitreset HEAD~1# 撤销commit,代码也不要了(危险)gitreset --hard HEAD~1

push了

这时候不能直接reset了(会影响别人),用revert:

gitrevert abc1234# abc1234是要撤销的commit hash

这会创建一个新的commit来撤销之前的改动。

四、找回搞丢的代码

手残reset --hard之后发现代码没了?别慌。

gitreflog

这个命令会显示你所有的操作历史:

abc1234 HEAD@{0}: reset: moving to HEAD~1 def5678 HEAD@{1}: commit: 重要的改动

找到你想恢复的那个hash:

gitcheckout def5678# 或者gitbranch recover def5678

reflog是救命的东西,只要提交过,都能找回来。

五、cherry-pick

从别的分支偷一个commit过来。

场景:在develop修了个bug,想把这个修复也应用到release分支。

# 先在develop上提交gitcheckout developgitcommit -m"fix: 修复登录问题"# 假设hash是abc1234# 然后cherry-pick到releasegitcheckout releasegitcherry-pick abc1234

这个命令用得很多,尤其是多版本维护的时候。

六、rebase -i:整理提交历史

代码写完了,但提交历史很乱:

abc1234 Add feature def5678 Fix typo ghi9012 Fix another typo jkl3456 Actually fix it this time

提PR之前整理一下:

gitrebase -i HEAD~4# 整理最近4个

打开编辑器:

pick abc1234 Add feature pick def5678 Fix typo pick ghi9012 Fix another typo pick jkl3456 Actually fix it this time

把那几个typo修复合并到第一个:

pick abc1234 Add feature fixup def5678 Fix typo fixup ghi9012 Fix another typo fixup jkl3456 Actually fix it this time

fixup会把这个commit合并到前一个,并且丢弃commit message。

保存退出,4个commit变成1个干净的commit。

七、bisect:二分查找Bug

有个bug,不知道是哪个commit引入的,但你知道v1.0是好的,现在是坏的。

gitbisect startgitbisect bad# 标记当前版本有buggitbisect good v1.0# 标记v1.0是好的

然后Git会自动checkout中间的版本,你测试一下:

gitbisect good# 这个版本没问题# 或gitbisect bad# 这个版本有问题

几轮之后Git会告诉你是哪个commit引入的bug。

gitbisect reset# 结束

如果有自动化测试更方便:

gitbisect start HEAD v1.0gitbisect runnpmtest# 自动跑测试

八、stash:临时保存

写代码写到一半,突然要切分支修个紧急bug。

gitstash# 暂存当前修改gitcheckout hotfix# 切分支干活# 干完活...gitcheckout featuregitstash pop# 恢复之前的修改

可以加描述,方便找:

gitstash push -m"正在做用户模块"gitstash list# 看列表

九、实用配置

推荐配置:

gitconfig --global alias.st statusgitconfig --global alias.co checkoutgitconfig --global alias.br branchgitconfig --global alias.lg"log --oneline --graph --all"

git lg看提交历史特别爽。

十、清理本地分支

时间长了本地会有很多已经合并的分支:

# 删除已合并的分支gitbranch --merged|grep-v"main\|develop"|xargsgitbranch -d# 清理远程已删除的追踪分支gitfetch --prune

总结

Git进阶操作速查:

场景命令
解决冲突手动编辑 →git add→git commit
修改最近提交git commit --amend
撤销未addgit restore
撤销已addgit restore --staged
撤销已commit未pushgit reset HEAD~1
撤销已pushgit revert
找回误删代码git reflog→git checkout
复制单个提交git cherry-pick
整理提交历史git rebase -i
二分查Buggit bisect
临时保存git stash

核心原则:

  • 已推送的历史不要用reset,用revert
  • reflog是后悔药,只要提交过就能找回
  • rebase -i前最好备份分支

有问题评论区交流。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 18:02:18

STM32 USART多机通信与RS485协同工作原理

STM32 RS485&#xff1a;当硬件地址识别撞上半双工总线&#xff0c;工业串行组网才真正开始可靠你有没有遇到过这样的现场&#xff1f;一台STM32控制着十几台温控模块&#xff0c;用RS485连成一串&#xff0c;跑着Modbus RTU——某天产线突然报“从机无响应”&#xff0c;排查…

作者头像 李华
网站建设 2026/10/15 10:55:12

小白必看:Qwen3-ASR-1.7B语音转文字保姆级教程

小白必看&#xff1a;Qwen3-ASR-1.7B语音转文字保姆级教程 1. 这不是“又一个语音识别工具”&#xff0c;而是你会议记录、视频字幕的本地安心之选 你有没有过这些时刻—— 录完一场两小时的技术分享&#xff0c;想整理成文字稿&#xff0c;却卡在“听不清”“中英文混着说”…

作者头像 李华
网站建设 2026/10/15 17:37:36

基于运放的精密LED灯电流控制电路示例

运放恒流驱动LED&#xff1a;一个老工程师的实战手记 去年调试一款车载仪表盘背光时&#xff0c;我连续烧了三颗LED灯珠——不是过流&#xff0c;而是电流“悄悄”飘高了18%。示波器抓到的不是尖峰&#xff0c;是一条缓慢上爬的斜线&#xff1a;环境温度从25C升到45C&#xff0…

作者头像 李华
网站建设 2026/10/13 2:58:09

nodejs+vue二手电子产品回收系统

文章目录系统概述核心功能技术亮点应用场景--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Node.js与Vue.js结合的二手电子产品回收系统是一个基于现代Web技术的全栈应用&#xff0c;旨在为用户提供便捷的…

作者头像 李华
网站建设 2026/10/15 15:59:56

/usr/bin/ld: 找不到 -xx如何处理

usr/bin/ld: 找不到 -lbrotlidec /usr/bin/ld: 找不到 -lharfbuzz collect2: error: ld returned 1 exit status 这些错误表示缺少 libbrotlidec 和 libharfbuzz 库。你需要安装这些库的开发版本。以下是根据不同系统的解决方案: 1. Ubuntu/Debian 系统 # Ubuntu 20.04 及更…

作者头像 李华