前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回滚/重置git merge

回滚/重置git merge

作者头像
十毛
发布2021-06-11 18:06:37
2.8K0
发布2021-06-11 18:06:37
举报
文章被收录于专栏:用户1337634的专栏

代码合并的时候,有时候合并后发现合并错了,需要回滚或重置

回滚merge其实有两种方式,一种是revert,一种是reset

环境准备

构造一个已经merge的分支,并准备撤销/回滚刚才的merge

  • 初始化仓库库
代码语言:javascript
复制
mkdir git-revert-merge-commit
cd git-revert-merge-commit
git init
  • master上提交两个commit
代码语言:javascript
复制
echo 'file1' > file1 
git add . && git commit -m 'commit 1'
echo 'file2' > file2
git add . && git commit -m 'commit 2'
  • 从master创建分支feature并提交两个新的commit
代码语言:javascript
复制
git checkout -b feature
echo 'file3' > file3
git add . && git commit -m 'feature - commit 1'
echo 'file4' > file4
git add . && git commit -m 'feature - commit 2'
  • 切换回master后再提交两个commit,这时候master和feature是不能fast-forword了
代码语言:javascript
复制
git checkout master
echo 'file5' > file5
git add . && git commit -m 'commit 3'
echo 'file6' > file6
git add . && git commit -m 'commit 4' 
  • 合并feature到master
代码语言:javascript
复制
git checkout master
git merge feature
  • 假如这个时候发现合并错误,想撤销/回滚,下面就分别看一下revert和reset怎么操作 *

revert

revert的原理实际上就是提交一个反向变更,低消之前的变更。revert会保留所有的操作记录,历史变更和revert变更都会保存在历史中,可以从git log中看到

  • 执行命令git revert d904008
代码语言:javascript
复制
➜  git-revert-merge-commit git:(master) git revert d904008
error: commit d904008ec11d364b674a720a9755bd5e247903fe is a merge but no -m option was given.
fatal: revert failed

回滚失败 no -m option was given,这是因为merge是把两个分支合并到一起,回滚的话,就必须告诉git需要回滚到哪个个分支

代码语言:javascript
复制
commit d904008ec11d364b674a720a9755bd5e247903fe (HEAD -> master)
Merge: dd542b2 18b2194
Author: timxia <timxia@tencent.com>
Date:   Wed Jun 9 13:29:10 2021 +0800

    Merge branch 'feature'

commit dd542b2a254a27d1704fe4f9317fef7e3d99b2cb
Author: timxia <timxia@tencent.com>
Date:   Tue Jun 8 20:01:41 2021 +0800

    commit 4

commit 99acb1f6ddfbd2cdc2bb4a9e1073176c4d1a55e2
Author: timxia <timxia@tencent.com>
Date:   Tue Jun 8 20:01:41 2021 +0800

    commit 3

commit 18b2194719103f2917960268683b4d052b2eeec3 (feature)
Author: timxia <timxia@tencent.com>
Date:   Tue Jun 8 20:01:37 2021 +0800

    feature - commit 2

#省略了其他的commit...

从log(Merge: dd542b2 18b2194)中可以看出来,dd542b2(master)是1,18b2194(feature)是2

所以回滚到master的-m参数值是1,命令是git revert d904008 -m 1

代码语言:javascript
复制
➜  git-revert-merge-commit git:(master) git revert d904008 -m 1
Removing file4
Removing file3
[master 2c32c27] Revert "Merge branch 'feature'"
 2 files changed, 2 deletions(-)
 delete mode 100644 file3
 delete mode 100644 file4
  • 查看日志
代码语言:javascript
复制
git log --pretty=oneline
## 结果如下
2c32c27231cdceee676286038e3551913d324a04 (HEAD -> master) Revert "Merge branch 'feature'"
d904008ec11d364b674a720a9755bd5e247903fe Merge branch 'feature'
dd542b2a254a27d1704fe4f9317fef7e3d99b2cb commit 4
99acb1f6ddfbd2cdc2bb4a9e1073176c4d1a55e2 commit 3
18b2194719103f2917960268683b4d052b2eeec3 (feature) feature - commit 2
1203202401c84cdc2defd589e958355ef0574662 feature - commit 1
759fb3f3c740764563ab11a03fdf5a3ad13ed9b9 commit 2
d7757c8fb1c65449d4e436b1c9bc575f79a01ce5 commit 1

日志中可以看出来,虽然合并进来的分支内容都退回了,但是提交记录以及回滚记录都在

reset

是重置代码到历史某一个提交点

代码语言:javascript
复制
git reset dd542b2
  • 查看提交历史,可以看到merge和feature上的commit都没有了(这种方式一般感觉更加好一点,没有引入一些没有意义的提交)
代码语言:javascript
复制
git log --pretty=oneline
## 执行结果如下,可以看出来,合并的commit都没有了
dd542b2a254a27d1704fe4f9317fef7e3d99b2cb (HEAD -> master) commit 4
99acb1f6ddfbd2cdc2bb4a9e1073176c4d1a55e2 commit 3
759fb3f3c740764563ab11a03fdf5a3ad13ed9b9 commit 2
d7757c8fb1c65449d4e436b1c9bc575f79a01ce5 commit 1

取消merge

如果merge过程中(一般是有冲突需要解决),想取消,则执行命令

代码语言:javascript
复制
git merge --abort

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境准备
  • revert
  • reset
  • 取消merge
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档