在SVN中,提交记录是无法修改的。比如说,当我们提交了某次修改后,发现该次提交中有错误时,只能将将补丁再次提交一遍。这样,就存在两次提交记录,没有保证提交的原子性。
在GIT中,由于提交是在本地进行的,因此如果没有发布之前,是允许使用reset命令来撤销提交记录的,这个命令有如下三种使用方式:
-
git reset -soft: 只撤销commit,保留working tree和index file。
-
git reset -mixed: 撤销commit和index file,保留working tree
-
git reset -hard: 撤销commit、index file和working tree,即撤销销毁最近一次的commit
默认是-mixed,不过我没有看出来mixed和soft有什么区别,都是把日志历史给reset了,内容保持不变。而hard则是把日志连同内容一起回退了,类似于回滚。
日志可以reset的好处是:可以随时commit,这样就不用担心后面的修改影响到前面,commit日志也可以不用填得很规范。每完成一个迭代后,再把之前的所有commit全部给reset掉,重新写一个能正规的注释,发布到服务器。
修改已经发布的修改
如果你的提交已经发布,reset后发布时会将服务器上的提交记录给同步下来,进行一次merge后再次发布。此时就GIT的工作方式是和SVN一样的了。此时,如果要修改服务器段的提交记录,则可以使用使用了园子里的一篇文章:Git如何永久删除文件(包括历史记录)中介绍的强制推送的命令:
git push origin master --force
先reset,本地提交后,用该命令强制发布,此时服务器的提交记录就会被被本地提交记录覆盖。
需要注意的是:修改已经发布的提交是有很大的有风险的,会导致无法回退到历史版本。这也是SVN不允许修改提交记录的原因。虽然GIT提供了这个命令,但不到万不得已的时候不建议使用它。