问题描述
有三个分支:master、develop、debug
develop分支合并了修复bug的debug分支的内容,develop上又因为开发等原因产生了几个新的commit,然后将develop分支合并到master进行上线,上线后发现develop合并debug的时候因为失误产生了一个紧急的严重bug,
但是develop合并debug之后的几个commit中没问题,且涉及到的改动特别多。
分析:
我之前的做法是使用reset,将develop分支的commit回到合并debug之前的commit,然后再将合并之后的commit中的改动再手动进行一遍,再使用push --force命令用本地分支将远程分支强制覆盖。但是这样做有两个缺点,一:合并之后的commit要手动再进行一遍,太费力;二、本地分支强制覆盖服务器上的分支不友好,也很危险。
解决:
偶然从同事那里知道了有revert这个命令,但是他也不大懂这个命令,就自己去网上查了下,这个命令完全可以解决我碰到的这个问题,相见恨晚~
关键命令
git revert -n commit_id -m 1
-n是不要自动合并
-m是指使用develop上merge之前的commit
复现详细流程如下:
1、初始化
git init
vim file.txt
文件内容:
git add .
git commit
2、
创建develop分支
git checkout -b develop master
//修改文件内容
vim file.txt
如图:
git add .
git commit
3、创建debug分支并修改文件内容
git checkout -b debug master
//修改文件内容
vim file.txt
如图:
git add .
git commit
4、合并debug到develop
git checkout develop
git merge debug
解决冲突:
vim file.txt
解决之后为:
git log
5、继续在develop添加新的commit
vim develop.txt
git status
git log
6、将合并过debug分支的develop分支合并到master
git checkout master
git merge develop
git log
7、在develop分支上使用revert撤销有问题的commit
命令: git checkout develop
命令: git log
commit 6c77bb35d18556a0e04718e345af46e5dd672e4f (HEAD -> develop, master)
Author: *** <***@***.com>
Date: Fri Dec 7 15:13:54 2018 +0800
新增文件
commit 7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f
Merge: bca6f46 55951bf
Author: *** <***@***.com>
Date: Fri Dec 7 15:10:57 2018 +0800
Merge branch 'debug' into develop
commit 55951bfedbcbb8ec86ee60dcb68142e9c5e6360c (debug)
Author: *** <***@***.com>
Date: Fri Dec 7 15:04:53 2018 +0800
debug分支修改文件
commit bca6f46e19674e504b879008df8b703dde6f6414
Author: *** <***@***.com>
Date: Fri Dec 7 15:00:51 2018 +0800
develop分支修改文件
commit 0b872a420185f209389e399549c511a1a1887344
Author: *** <***@***.com>
Date: Fri Dec 7 14:59:46 2018 +0800
初始化
命令:vim file.txt
One day!
Develop branch change file content.
Debug branch change file content!
使用revert命令回到commit id 为7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f
的提交,如果使用reset则要回到
commit id 为55951bfedbcbb8ec86ee60dcb68142e9c5e6360c
的提交。
命令:git revert 7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f
$ git revert 7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f
error: commit 7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f is a merge but no -m option was given.
fatal: revert failed
报错了,是因为这个commit是两个分支的合并,有两个parent的commit,git不知道要用那个分支上的parent commit,所以要指定一个,在哪个分支上进行合并操作的分支(develop)为parent 1,合并过来的分支(debug)为parent 2,这里使用1(即develop)
命令:git revert -n 7c6d01aca90ade45b3a0bbcc90bb7dffe67a577f -m 1
命令:git status
命令:vim file.txt
One day!
Develop branch change file content.
变为了develop合并debug之前的状态
git commit
git status
git log
分支合并之后的commit中新增的文件develop.txt还是存在的,修改的只是将debug合并到develop内容的撤销,撤销到合并前的develop的commit
命令:ls
将revert之后的develop合并到master分支
命令:git checkout master
命令:vim file.txt
One day!
Develop branch change file content.
Debug branch change file content!
命令:git merge develop
命令:vim file.txt
One day!
Develop branch change file content.
现在已经把在develop分支上合并debug的commit有问题的部分解决了,而且可以直接推送到代码服务器。
本文地址:https://blog.csdn.net/leedaning/article/details/84882212
Author:leedaning