git删除远程仓库的某次提交以及误操作恢复

前两天工作的时候遇到了一个问题,开发的时候发现远程仓库之前的某次提交是没有必要的,需要删除掉这次提交。网上搜索了搜也没有找到解决的方法,问了问同事也都说不行。在我直觉看来git这么强大应该肯定可以得吧,后来突然想起了一个命令cherry-pick。

Git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。
就是对已经存在的v3.0的某次commit合并到v2.0

说一下我的具体问题以及操作

1
2
3
4
5
commit5 head5
commit4 head4
commit3 head3
commit2 head2
commit1 head1

现在在test分支,有5次commit,cimmit5是我最新的一次提交,现在要把commit2删除掉,并且不影响其它的提交,操作如下

1
2
3
git branch testsave
git reset --hard head1
git cherry-pick head3 head4 head5

后来知道了用 git revert head2 就可以了

还有一个比较少用,但是很实用的一个git命令, git reflog,可以对git误操作进行数据恢复。

reflog是git用来记录引用变化的一种机制,比如记录分支的变化或者是HEAD引用的变化。 比如在某git库中运行git reflog,当git reflog命令不指定引用的时候默认列出HEAD的reflog。

比如说你已经执行了

1
git reset --hard heade1

然后发现执行错了,这个时候你该如何操作呢,首先执行 git reflog,找到 commit5 的heade5,
然后执行

1
git reset --hard head5