2010-02-22

Subversion 用户眼中的 Git (8): SVN没有后悔药,git有好多

Subversion 没有后悔药,就是说一旦完成向服务器的数据提交,就没有办法再追回(从客户端),只能在后续的提交中修正——回退或者修改等。 Git 非常神奇,拥有无数颗粒后悔药... 为什么Subversion 没有后悔药,而 Git 拥有呢。因为 Subversion 作为集中式的版本控制,不能允许个人对已提交的数据进行篡改,而Git 是分布式版本控制系统,代码库是属于个人,允许任意修改。Git 通过对提交建立数字摘要来保证提交的唯一性和不可更改性,通过版本库在多人之间的多份拷贝保障数据的安全性。

Git 丢弃最新的一个或几个提交

使用 git reset --hard 命令可以永远丢弃最新的一个或者几个提交。
  • 丢弃最新的一个提交:
    $ git reset --hard HEAD^
  • 丢弃最新的两个提交:
    $ git reset --hard HEAD^^
  • 丢弃某一提交之后的改动
    $ git reset --hard COMMIT-ID

Git 和 Subversion 修改提交说明

提交后如果对提交说明不满意,Git 可以使用命令 git commit --amend 修改提交说明。 Subversion 也可以修改提交说明,是通过修改提交的 svn:log 版本属性实现的:
  • 不但可以修改最后一次提交的说明,并且可以修改历史提交的提交说明;
  • Subversion 修改提交说明是不可逆的操作,可能会造成提交说明被恶意修改;
  • Subversion 缺省关闭修改提交说明的功能。管理员在设置了提交说明更改的邮件通知后,才可以打开该功能
关于 Git 修改提交说明
  • Git 可以修改最后一次提交说明,并不是说不能修改历史版本的提交说明,只是修改最后一个版本提交说明拥有最简单的命令
  • Git 修改提交说明,会改变提交的 commit-id。即修改提交说明后,将产生一个新的提交
  • Git 可以通过 git reset --hard ,git commit --amend,git rebase onto 等命令来实现对历史提交的修改
  • 使用 stg 工具可以更为简单的修改历史提交的提交说明,包括提交的内容

Git 可以修改和重构历史提交

使用 Git 本身的 reset 以及 rebase 命令可以修改或者重整/重构历史提交,非常灵活。 使用强大的 stg 可以使得历史提交的重构更为简洁,如果您对 stg 或者 Hg/MQ 熟悉的话。

Subversion 修改历史提交,只能由管理员完成

Subversion 是集中式版本控制系统,从客户端一旦完成提交,就没有办法从客户端撤销提交。但是管理员可以在服务器端完成提交的撤销和修改,但是操作过程和代价较大。 Subversion 对提交撤销和提交重构是通过 svnadmin dump, svndump filter, svnadmin load 实现的版本库整理。参见博文:Subversion 版本库整理实战
blog comments powered by Disqus