Git 优雅的撤销中间某次提交(包括 merge)
前言
最近两天,公司的git
合并代码时,出现了严重的问题,浪费很多时间;
现在记录下;
情况是这样的,有一个 dev
测试分支,我们有自己额外的开发分支,在不知情的情况下有人执行了 merge dev
当发布的时候才发现问题。模拟图片:
而此时版本库已经提交过多次,现在的问题是如何将中间 merge dev
提交的代码撤销,并保留之后别人提交的代码。
方法一:revert 撤销某次提交
步骤 一
git revert 100047dcc
error: Commit 100047dccb58f3ee5e27b0dfaf5c02ac91dc2c73 is a merge but no -m option was given.
fatal: revert failed
结果报错了,报了一个 Commit is a merge but no -m option was given.
为什么呢?
如果 100047dcc
这只是一个普通的提交,其实是不会报错的,但是,这是一个 merge
的提交。
这个时候,怎么办呢?
我的做法
步骤 一
git revert 100047dcc -m 1
参数 -m 就是指定要撤销的那个提价,从左往右,从1开始数;也就是我撤销的是 0099aca7
。
接着其把代码冲突,然后我就解决冲突,保留主分支的代码,去掉那个人的代码。
最后一步
git push
方法二:
具体步骤:
1,首先git log查看提交记录,找到出错的前一笔提交的commit_id
2,用命令git rebase -i commit_id ,查找提交记录
3,将出错那笔提交的pick改为drop
4,Esc,:wq
方法三:git cherry-pick
1、git reset --hard 1d7444 #回退到出错版本前一个commit
2、git cherry-pick 626335 #将某次commit的更改应用到当前版本(将出错 cmmit 之后别人提交的代码合并到当前正常代码分支上)
3、git push origin HEAD --force #强制提交
本作品采用《CC 协议》,转载必须注明作者和本文链接
合并
master
分支到dev_merge
分支最终造成合并时浪费很多时间,这个是什么原理?是两个分支的差别非常大吗?@varro 不是
master
分支合并到dev_merge
, 是dev_merge
分支合并了其他不想发布正式或者功能未开发完善的分支的代码,这时又不想让这块代码发布就出现了文章中的删除某次commit
@james_xue
浪费很多时间
是指的浪费了处理问题的时间?我以为是merge
的速度变慢了浪费了很多时间