git对比svn

  本文主要是记录了笔者对git和svn的操作的对比。

git与svn操作

操作\vcs git svn
克隆(检出) git clone {url} svn checkout {url} –username={username}
设置用户信息 git config –global user.name {name} git config –global user.email {e-mail} 在命令后面加–username={username}即可
查看版本库信息 × svn info
查看版本库下的文件 × svn list {url}
查看状态 git status svn status
添加文件 git add(stage暂存(多次)) svn add(版本管理器追踪(一次))
删除文件 git rm {file} svn rm/delete {file}
提交 git commit -m “message” svn commit -m “message”
查看远程仓库 git remote [-v] svn info
修改远程地址 git remote set-url [–push] [] svn sw
远程提交 git push {remote name} {remote branch} svn import {url} -m “message” –username={username}
删除远程分支 git push {remote name} :{remote brach} ×
查看提交历史 git log –graph –pretty=oneline –abbrev-commit svn log
diff git diff svn diff
使用远程仓库更新本地 git pull svn update
恢复未提交 git checkout – {file} svn revert {file}/-R {dir}
恢复已提交 git reset –hard HEAD^/cmid, HEAD为指向当前commit的指针, ^上一个commit svn merge -r : (不能删除历史记录,只能合并到老的版本然后做一次新的提交)
命令历史 git reflog(想要获取比当前版本更新的cmid) ×
冲突解决 git pull之后修改再提交 1.svn up更新选择df, 2.选择p推迟冲突, 3.修改文件, 4.svn resolve –accept=working {file}通知解决
创建标签 git tag -a {tag} [-m “message”][cmid] svn copy –revision={revision} {repository} tags/{tag}
删除标签 git tag -d {tag} svn rm {url}
创建分支 git checkout -b {branch} svn copy trunk branches/{branch}
删除分支 git checkout -d {branch} svn rm {url}
合并分支 git merge {branch}默认快速合并,–no-ff -m “message”禁用掉快速合并 svn merge {branch path}
创建stash git stash ×
恢复stash git stash apply {stash}/git statsh pop ×
删除stash git stash drop {stash} ×
ignore 新建一个.gitignore文件即可 svn propset svn:ignore “file1{回车}file2{回车}dir” .

注释:

  1. git pull和git fetch的区别:前者不光是拉数据还会和本地分支合并。以下两者等价:
    git pull == git fetch && git merge origin/master, 默认分支为master的情况下。
  2. git checkout -b {branch} == git branch {branch} (创建)
    && git checkout {branch}(切换)。
  3. git有暂存区的概念,是追踪修改,而不是追踪文件。svn只需要一次add,其余的直接commit即可。
  4. svn的命令基本都是可以缩写,checkout=co, copy=cp, update=up等等。
  5. 快速合并(fast forward)通过git log –graph看不到合并的过程,–no-ff -m相当与有了一个新的commit,能看到合并的过程。
  6. 当使用git clone其实只有master分支,如果想要在dev分支开发,可以使用git checkout -b dev origin/dev。
  7. 当直接使用git pull或者git push什么的应该要求当前分支和远程分支有一个关联关系,在git push的时候的-u参数应该就是这个作用。可以通过git branch –set-upstream dev origin/dev来设置本地dev与远程的关联。
  8. snv的export相对与checkout来说是导出一份“干净”的项目,也就是没有.svn目录。
  9. git的ignore内容对于目录区分是否已/结尾,而svn不能以/结尾,不区分。
  10. git可以通过git add . 添加所有未追踪的文件,svn就比较麻烦了,可以使用svn st | awk ‘{if ( $1 == “?”) { print $2}}’ | xargs svn add增加,事实证明我大awk还是比较牛逼的。
  11. 感觉svn就是一堆文件目录拷贝,就是在操作文件,感觉分支基本没用喃,感觉太鸡肋了。

git与svn开发模式

git开发模式

  1. master是稳定的,创建dev分支进行开发,开发完成合并到master。当还在dev上开发的时候,老版本有bug被发现,此时的status查看有一些修改但是不想提交,可以使用git stash将工作现场“存储”起来。bug修改完成之后,切换会dev,使用git stash list查看stash,然后使用git stash apply {stash@{0}}或者git stash pop恢复,前者需要单独使用git stash drop来删除。

svn开发模式

  1. 一般在trunk进行主要开发,当开发完成,在trunk进行打tag,比如v1.0。然后在trunk进行2.0的开发。当1.0发现了bug,从v1.0的tag中拷贝一个为v1.0_bugfix的分支进行bug修复,修复完成够合并到trunk。
  2. 和git类似,trunk只是用来打tag的。开发1.0,则创建一个dev_1.0的分支进行开发,当开发完成,合并到trunk然后打tag,比如v1.0。然后copy创建一个dev_2.0的分支进行开发,当1.0发现bug,则直接在dev_1.0上进行bug修正。合适的时候可以把dev_1.0合并到dev_2.0进行测试,最后合并到trunk。

svn服务器安装问题

  极客学院wiki安装svn服务器遇到的问题(1. httpd不能启动,2. 没有apache这个用户,3. import出错)解决办法如下:

1
2
3
4
5
6
7
8
9
10
11
12
# 若apache服务器不能载入两svn相关的模块
# 反注释掉 LoadModule dav_fs_module modules/mod_dav_fs.so
# LoadModule dav_module modules/mod_dav.so
# 本机的apache对应的的用户为http而不是apache
[ifpelset@archlinux svn]$ sudo chown -R http.http project_repo/
# 教程给的后面没有指定SVN的URL
[ifpelset@archlinux svn]$ sudo svn import -m 'Create trunk, branches, tags directory structure' /tmp/svn-template/ http://[your-ip]/svn/project_repo
Adding /tmp/svn-template/branches
Adding /tmp/svn-template/tags
Adding /tmp/svn-template/trunk
Committing transaction...
Committed revision 1.

参考链接

  1. 极客学院SVN教程
  2. 廖雪峰的官方网站-git教程
  3. 关于SVN 目录结构

2017-7-21 于 成都

文章目录
  1. 1. git与svn操作
  2. 2. git与svn开发模式
    1. 2.1. git开发模式
    2. 2.2. svn开发模式
  3. 3. svn服务器安装问题
  4. 4. 参考链接