Git如何删除某次commit

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

场景复现一

1.假设有2个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
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.现在需要回滚到上一次提交

那么 我们可以使用

1
git reset --hard HEAD^

或者

1
git reset --hard HEAD~1

或者

1
git reset --hard f36801544670e00b2f59a28e19017d2786c4085e

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

1
2
3
4
5
6
7
8
git log

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

修复
(END)

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

1
2
3
4
5
6
7
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.然后找出想要回退的版本,进行回退

1
git reset --hard def5ade

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

1
git push -f

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

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

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

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

场景复现二

1.假设有3个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 +版本号 命令进行反做

1
git revert -n 853dadef5adef4cc05752bdb36577c127be71ba5

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

1
2
git add .
git commit -m "重做 增加文件"

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.如果此时需要同步远程仓库

1
git push

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

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

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

场景复现三

1.假设有3个提交记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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]

1
git rebase --onto master~853dade master~def5ade master

或者

1
git rebase --onto master~2 master~1 master

或者使用

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.如果此时需要同步远程仓库

1
git push  -f

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

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

这样就行:

1
git rebase -i f368015

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

然后

1
git commit --amend --author="xxxxxxxx"

然后

1
git rebase --continue

最后保存退出即可

总结

  • git reset

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

  • git revert

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

  • git rebase –ontogit rebase i

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

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%