Git如何删除某次commit

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

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

场景复现一

1.假设有2个提交记录

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.现在需要回滚到上一次提交

那么 我们可以使用

git reset --hard HEAD^
复制代码

或者

git reset --hard HEAD~1
复制代码

或者

git reset --hard f36801544670e00b2f59a28e19017d2786c4085e
复制代码

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

git log

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

修复
(END)
复制代码

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

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.然后找出想要回退的版本,进行回退

git reset --hard def5ade
复制代码

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

git push -f
复制代码

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

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

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

image.png

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

场景复现二

1.假设有3个提交记录

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 +版本号 命令进行反做

git revert -n 853dadef5adef4cc05752bdb36577c127be71ba5
复制代码

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

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

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

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.如果此时需要同步远程仓库

git push
复制代码

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

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

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

场景复现三

1.假设有3个提交记录

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]

git rebase --onto master~853dade master~def5ade master
复制代码

或者

git rebase --onto master~2 master~1 master
复制代码

或者使用

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

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

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.如果此时需要同步远程仓库

git push  -f
复制代码

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

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

这样就行:

git rebase -i f368015
复制代码

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

然后

git commit --amend --author="xxxxxxxx"
复制代码

然后

git rebase --continue
复制代码

最后保存退出即可

总结

  • git revert

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

  • git revert

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

  • git rebase –ontogit rebase i

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享