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.
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

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

4年前 评论

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

4年前 评论

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

4年前 评论

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