前提条件
假设现在有三次提交到remote repository:
commit abf94bdf743e23737950c36bda381d2aba1803fc(HEAD -> master, origin/master)
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:36:39 2021 +0800
feat add 3.go
commit 181cc7131acc18f248aba4638439054e886d695a
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:36:09 2021 +0800
feat add 2.go
commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:35:16 2021 +0800
feat add 1.go
git reset --hard 命令
git reset 重置的是HEAD指针,是把HEAD指向指定的commit,此指定的commit之后的所有提交都不存在,也不会留下任何的痕迹!!!!!!!!!
如,使用git reset --hard命令:
git reset --hard 75cbe2918cb11e444be085da6890c6d3ecfd71eb #第一次提交的commit id,此时HEAD指针位于第一次提交的地方
使用git log查看提交日志时,如下:
git log
commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:35:16 2021 +0800
feat add 1.go
此只仅仅重置了本地的HEAD,还需要将期强推到remote,如下:
git push origin --force
上面的命令执行成功后,可以看到远端只能看到commit了一次,第2、3次的提交已经不存在了
特别注意:这种操作一但发生成,不可逆的(除非在队友没有更新的前提下使用他本地的repository恢复),也不会留下任何的痕迹!!!!总之,慎之又慎吧。
git revert 命令
git revert命令是用来**revert(恢复)**某一个commit提交的内容的(不会影响其他的commit),可以理解为是某一次commit的逆运算(即:把增加的删除、把删除的加回来,做一次commit的逆运算), git revert commit_id成功之后,会生产一次新的提交,并且commit_id的影响将不会存在于git revert之后的commit,但是在git revert之前的commit中还是能看得到commit_id的改动的(有点乱,。。。。。)
如果revert的commit被后续的commit所依赖,那么会产生编译错误,如:commit20依赖了commit5声明的变量,当revert commit5之后,就会导致commit20编译失败)
如上面提前条件所示,如果想删除 2.go而保留1.go和3.go,revert的命令如下:
git revert 338bf3e30983d34074f37a18b3ff80ea9bca75f0 # 第二次commit的id
执行上面的命令后,已经revert(恢复)了第二次commit的影响(第二次commit增加了2.go,revert而进行逆运算——删除2.go),并且多了一次commit(现在有4次commit了),使用git log得到如下结果:
commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb (HEAD->master, origin/master)
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:40:39 2021 +0800
Revert "feat add 2.go"
This reverts commit 181cc7131acc18f248aba4638439054e886d695a
commit abf94bdf743e23737950c36bda381d2aba1803fc
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:36:39 2021 +0800
feat add 3.go
commit 181cc7131acc18f248aba4638439054e886d695a
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:36:09 2021 +0800
feat add 2.go
commit 75cbe2918cb11e444be085da6890c6d3ecfd71eb
Author: ztenv <class7class@qmm.com>
Date: Tue Sep 21 16:35:16 2021 +0800
feat add 1.go
git reset和git revert都是属于重新恢复工作区以及远程提交的方式,但这两种操作有着截然不同的结果:
git reset
是将之前的提交记录全部抹去,将 HEAD 指向自己重置的提交记录,对应的提交记录都不复存在;
git revert
操作是将选择的某一次提交记录 重做,若之后又有提交,提交记录还存在,只是将指定提交的代码给清除掉。