Git 优雅的撤销中间某次提交(包括 merge)

前言

最近两天,公司的git合并代码时,出现了严重的问题,浪费很多时间;
现在记录下;
情况是这样的,有一个 dev 测试分支,我们有自己额外的开发分支,在不知情的情况下有人执行了 merge dev 当发布的时候才发现问题。模拟图片:

git 优雅的撤销中间某次提交(包括merge)

而此时版本库已经提交过多次,现在的问题是如何将中间 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 优雅的撤销中间某次提交(包括merge)

这个时候,怎么办呢?
我的做法

步骤 一

git revert 100047dcc -m 1

参数 -m 就是指定要撤销的那个提价,从左往右,从1开始数;也就是我撤销的是 0099aca7
接着其把代码冲突,然后我就解决冲突,保留主分支的代码,去掉那个人的代码。

git 优雅的撤销中间某次提交(包括merge)

最后一步

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 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

合并 master 分支到 dev_merge 分支最终造成合并时浪费很多时间,这个是什么原理?是两个分支的差别非常大吗?

5年前 评论

@varro 不是 master 分支合并到 dev_merge, 是 dev_merge 分支合并了其他不想发布正式或者功能未开发完善的分支的代码,这时又不想让这块代码发布就出现了文章中的删除某次 commit

5年前 评论

@james_xue 浪费很多时间 是指的浪费了处理问题的时间?我以为是 merge 的速度变慢了浪费了很多时间

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!