2010-01-19

Subversion 用户眼中的 Git (3): 命令集不兼容

SVN 用户对 Git 的不好的体验,可能大多来自于两者命令集差异很大,不兼容,感觉非常不习惯。 这其中的一部分原因是因为 SVN 和 Git 的原理不同,分属不同阵营——集中式和分布式版本控制;另外一个重要的原因,可能就是 Linus Torvals 痛恨 CVS,而且 Torvals 曾经说过的很有争议话,就是他认为 SVN 也是一个失败。所以,Torvals 设计的 Git 当然要特立独行了。 不过...

由于原理不同,导致 SVN 和 Git 不兼容的命令

svn checkout 和 git clone

这两个命令,都是首次从其他版本库创建本地拷贝时运行的命令,都是只需要执行一次就可以的命令。
  • “svn checkout” 就是检出,很形象的比喻,subversion 就是要从服务器的版本库建立本地的工作拷贝(工作区)。检出之后的本地拷贝和版本库有着千丝万缕的联系(每个子目录下的 .svn 目录中的 entries 文件都会标记版本库的地址),本地提交都要上传到服务器版本库中完成。
  • “git clone”就是克隆,也是非常形象的比喻。作为分布式版本控制系统,通过克隆创建的本地版本库和远程版本库一模一样,没有谁比谁更好。克隆之后的本地版本库和源版本库有着一丝联系(在 .git/config 中配置 remote版本库的URL),这一丝联系,无非是为了不定期的双方分享改动而已。

svn update 和 git checkout, git pull

真的很难说和 "svn update" 对应的 git 命令,是 git checkout? 还是 git pull?
  • "svn update" 是从 subversion 版本库更新最新的提交到本地
  • "git pull" 是从源版本库拉数据到本地版本库,并和本地对应的分支进行合并。“pull”在这里非常形象,因为这个操作不会将本地版本库的改动传递到源版本库(远程版本库),只会将远程版本库最新的改动 fetch 过来,然后在合并。
  • "git checkout" 在某种意义上,也很像。例如像要将本地修改取消或者本地删除的文件还原,在 subversion 中就要用 svn up 命令,而在 git 中,当然用 "git checkout ." 命令了。

可以通过别名改进兼容性的 Git 命令

一个纯爷们说:
  • 这个可以有: git commit, 这个真没有: git ci
  • 这个可以有: git checkout, 这个真没有: git co
  • 这个可以有: git status, 这个真没有: git st
  • 这个可以有: git branch, 这个真没有: git br
如果 Git 真的那么不堪,我也就不再这里写博客,早就洗洗睡了。Git 可以用别名实现
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
通过上面的几条命令,在git的全局配置文件中定义了命令别名,这样就可以使用和 CVS/SVN 兼容的短格式命令了。

大同小异,兼容的命令居多

  • svn diff  和 git diff git diff 命令自动提供分页显示功能
  • svn log 和 git log 如果想要查看提交中的文件变更,svn log -v 可以很好的显示出来,git log -p 或者 git log --stat 显得罗嗦,在这种情况下,可能 git whatchanged 是您需要的
  • svn add 和 git add 要注意的是 git add 不但对新文件操作,还可对修改的文件操作,实际上是将变更加入Index(stage, 可以看作是提交集)
  • svn rm 和 git rm
  • svn mv 和 git mv
  • svn commit 和 git commit 要注意的是 git commit 只提交 stage 中的内容(被 git add 命令记录的变更),git commit -a 可能才是 SVN 用户眼中的对应物
  • svn blame 和 git blame
  • svn merge 和 git merge svn merge 选择某个合并范围,则对应于 git cherry-pick 命令

命令行不同,功能相似的命令

  • svnadmin create 和 git init 用于初始化版本库的命令
  • svn cat 和 git show
  • svn log -v 和 git whatchanged
  • svn cp trunk tags/... 和 git tag
  • svn cp trunk branches/... 和 git branch
  • svn switch 和 git checkout branchname
  • svn resolve 和 git mergetool
  • svn changelist 和 git add

互相找不到对应的命令

  • svn cp 在 git 中没有对应物
  • git rebase 在 svn 中没有对应物
  • git push 在 svn 中没有对应物
  • git reset 在 svn 中没有对应物
  • git clean, stash,  ... 等命令在 svn 中没有对应物...
blog comments powered by Disqus