前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git如何删除某次commit 操作

Git如何删除某次commit 操作

作者头像
乱码三千
发布2021-07-29 15:56:26
12.2K0
发布2021-07-29 15:56:26
举报
文章被收录于专栏:乱码三千乱码三千

在团队开发的时候, 经常会出现某次commit导致整个项目出现无法名状的错误, 这个时候, 最好的解决办法就是删除错误的commit

场景复现一

1.假设有2个提交记录

代码语言:javascript
复制
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

优化代码

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在需要回滚到上一次提交

那么 我们可以使用

代码语言:javascript
复制
git reset --hard HEAD^

或者

代码语言:javascript
复制
git reset --hard HEAD~1

或者

代码语言:javascript
复制
git reset --hard f36801544670e00b2f59a28e19017d2786c4085e

3.执行完后 查看日志,就会发现只剩下一个提交了

代码语言:javascript
复制
git log

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果这个时候,你突然发现回退版本错了,那么就用git reflog查看提交记录

代码语言:javascript
复制
git reflog

f368015 HEAD@{0}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085e
def5ade HEAD@{1}: reset: moving to def5ade
f368015 HEAD@{2}: reset: moving to f36801544670e00b2f59a28e19017d2786c4085e
def5ade HEAD@{3}: commit: 优化代码
f368015 HEAD@{4}: commit (initial): 修复

5.然后找出想要回退的版本,进行回退

代码语言:javascript
复制
git reset --hard def5ade

6.如果此时需要同步远程仓库, 需要使用强推

代码语言:javascript
复制
git push -f

因为我们本地库HEAD指向的版本比远程库的要旧

由此可见, git reset可以很方便的回滚到指定的历史commit,

但是它的劣势也很明显, 一旦回滚到指定commit, 那么后面提交的commit都会一并删除

为了保留后面需要的的commit内容, 咱们可以使用另一种指令 git revert

场景复现二

1.假设有3个提交记录

代码语言:javascript
复制
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5

Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作

那么, 我们可以使用git revert -n +版本号 命令进行反做

代码语言:javascript
复制
git revert -n 853dadef5adef4cc05752bdb36577c127be71ba5

注意: 这里可能会出现冲突,那么需要手动修改冲突的文件, 然后重新add提交

代码语言:javascript
复制
git add .
git commit -m "重做 增加文件"

3.执行完后 查看日志,会发现原来的commit记录还在,同时新增了一个commit版本

代码语言:javascript
复制
git log

commit 05752def5adef853da4ccbdb36577c127be71ba5
Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

重做 增加文件

commit def5adef853da4cc05752bdb36577c127be71ba5
Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5
Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果此时需要同步远程仓库

代码语言:javascript
复制
git push

使用git revert这种方式既可以清除指定的commit操作, 同时可以保留后面的commit

但是也存在一个让人不舒服的地方, 虽然操作被重写了,但是记录还在, 而且由新增了一个记录,感觉有些冗余

为了解决这个问题, 最后我选择了第三种方式, 也就是使用 git rebase 节点切片

场景复现三

1.假设有3个提交记录

代码语言:javascript
复制
commit def5adef853da4cc05752bdb36577c127be71ba5

Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

优化代码
commit 853dadef5adef4cc05752bdb36577c127be71ba5

Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

增加文件
commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作

假设是master分值那么, 我们可以使用git rebase --onto [startpoint] [endpoint]

代码语言:javascript
复制
git rebase --onto master~853dade master~def5ade master

或者

代码语言:javascript
复制
git rebase --onto master~2 master~1 master

或者使用

代码语言:javascript
复制
git rebase i f368015 /把 需要改动那条 commit 前面的 pick 改成drop 然后, 保存退出即可

3.执行完后 查看日志 指定的commit已被切除

代码语言:javascript
复制
git log

commit def5adef853da4cc05752bdb36577c127be71ba5
Author: xxx
Date:   Thu Dec 28 16:01:36 2017 +0800

优化代码

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date:   Thu Dec 28 15:59:46 2017 +0800

修复
(END)

4.如果此时需要同步远程仓库

代码语言:javascript
复制
git push  -f

要注意的是,这样做会 彻底 删掉那条 commit。唯一的找回方式是通过 git reflog

5.如果你只是想改下那条 commit 的 author

这样就行:

代码语言:javascript
复制
git rebase -i f368015

把 需要改动那条 commit 前面的 pick 改成 edit

然后

代码语言:javascript
复制
git commit --amend --author="xxxxxxxx"

然后

代码语言:javascript
复制
git rebase --continue

最后保存退出即可

总结

  • git revert

适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。

  • git revert

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

  • git rebase --ontogit rebase i

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,彻底清除commit记录, 而又不增加新的commit记录, 就可以用这种方法

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景复现一
  • 场景复现二
  • 场景复现三
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档