| Git VS SVN | ||
| 1 .功能 | ||
| 主體功能 | Git | SVN |
| 1、從服務器上克隆完整的Git倉庫(包括代碼和版本信息)到單機上。 | 1 、SVN是基於關系數據庫的(BerkleyDB)或一系列二進制文件的(FS_FS) | |
| 2、在自己的機器上根據不同的開發目的,創建分支,修改代碼 | 2 、SVN采用標志和分支而拋棄了其他三件東西,實際上這意味着他們把 這個概念替換為在檔案庫內部復制文件或目錄以便保存日志。 |
|
| 3、在單機上自己創建的分支上提交代碼。 | 3、開發的時候不一定要鎖定 | |
| 4、在單機上合並分支。 | 4、速度與穩定性看起來都不錯。 | |
| 5、把服務器上最新版的代碼fetch下來,然后跟自己的主分支合並。 | 5、面向用戶的集中安全策略管理; | |
| 6、生成補丁(patch),把補丁發送給主開發者。 | ||
| 7、看主開發者的反饋,如果主開發者發現兩個一般開發者之間有沖突 (他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由 其中一個人提交。如果主開發者可以自己解決,或者沒有沖突,就通過。 |
||
| 8、一般開發者之間解決沖突的方法,開發者之間可以使用pull 命令解決 沖突,解決完沖突之后再向主開發者提交補丁。 |
||
| 從主開發者的角度(假設主開發者 不用開發代碼)看,git有以下功能: |
||
| 1、查看郵件或者通過其它方式查看一般開發者的提交狀態 | ||
| 2、打上補丁,解決沖突(可以自己解決,也可以要求開發者之間解決以 后再重新提交,如果是開源項目,還要決定哪些補丁有用,哪些不用)。 |
||
| 3、向公共服務器提交結果,然后通知所有開發人員。 | ||
| 2.優點 | ||
| 1、適合分布式開發,強調個體。 | 1、管理方便,邏輯明確,符合一般人思維習慣。 | |
| 2、公共服務器壓力和數據量都不會太大。 | 2、易於管理,集中式服務器更能保證安全性 | |
| 3、速度快、靈活。 | 3、代碼一致性非常高。 | |
| 4、任意兩個開發者之間可以很容易的解決沖突。 | 4、適合開發人數不多的項目開發。 | |
| 5、離線工作。 | 5、大部分軟件配置管理的大學教材都是使用svn | |
| 3. 缺點 | ||
| 1、學習周期相對而言比較長 | 1、服務器壓力太大,數據庫容量暴增。 |
|
| 2、不符合常規思維。 | 2、如果不能連接到服務器上,基本上不可以工作,看上面第二步,如果服務器 不能連接上,就不能提交,還原,對比等等。 |
|
| 3、代碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有代 碼和版本信息 |
一般集中式管理的有非常明確的權限管理機制(例如分支訪問限制),可以實現分層管理,從而很好的解決開發人數眾多的問題 | |
| 區別 | ||
| 比較項目 | Git 命令 | SVN 命令 |
| URL | git://host/path/to/repos.git | svn://host/path/to/repos |
| ssh://user@host/path/to/repos | https://host/path/repos | |
| file:///path/to/repos | file:///path/to/repos | |
| user@host:path/to/repos | ||
| /path/to/repos.git | ||
| 版本庫初始化 | git init[--bare]<path> | svnadmin create<path> |
| 導入數據 | git clone; git add; git commit | svn import<path><url>-m |
| 版本庫檢驗出 | git clone<url><path> | svn checkout<url/of/trunk><path> |
| 版本庫分支檢出 | git clone -b <branch><url><path> | svn checkout<url/ofranches/name><path> |
| 工作區更新 | git pull | svn update |
| 更新至歷史版本 | git checkout <commit> | suv update -r <rev> |
| 更新到指定日期 | git checkout HEAD@'{<date>}' | git update -r {<date>} |
| 更新至最新提交 | git checkout master | git update -r HEAD |
| 切換至里程碑 | git checkout <tag> | svn switch<url/of/tags/name> |
| 切換至分支 | git checkout <branch> | svn switch<url/of/branches/name> |
| 還原文件/強制覆蓋 | git checkout --<path> | svn revert<path> |
| 添加文件 | git add <path> | svn add <path> |
| 刪除文件 | git rm <path> | svn rm <path> |
| 移動文件 | git mv <old> <new> | svn mv <old><new> |
| 清除未跟蹤文件 | git clean | svn status | sed -e?? |
| 清除工作鎖定 | _ | svn clean |
| 讀取文件歷史版本 | git show <commit>:<path>><output> | svn cat -r<rev><url/of/file>@<rev>><output> |
| 反刪除文件 | git add <path> | svn cp -r |
| 工作區差異比較 | git diff git diff --cached git diff HEAD |
svn diff |
| 版本間差異比較 | git diff <commit1><commit2>--<path> | svn diff -r <rev1>:<rev2><path> |
| 查看工作區狀態 | git status -s | svn status |
| 提交 | git commit -a -m "<msg>":git push | svn commit -m "<msg>" |
| 顯示提交日志 | git log | svn log | less |
| 逐行追溯 | git blame | git blame |
| 顯示里程碑/分支 | git tag git branch git show -ref |
svn ls <url/of/tags/> svn ls <url/of/branches/> |
| 創建里程碑 | git tag [-m "<msg>"]<tagname> [<commit>] | svn cp <url/of/trunk><url/of/tags/name> |
| 刪除里程碑 | git tag -d <tagname> | svn rm <url/of/tags/name> |
| 創建分支 | git branch <brach> <commit> git checkout -b <branch><commit> | svn cp <url/of/trunk> <url/braches/name> |
| 刪除分支 | git bracn -d<branch> | svn rm <url/of/branches/name> |
| 導出項目文件 | git archive -o <output.tar><commit> | svn export -r <rev> <path><oupt/path> svn export -r <rev><url><output/path> |
| 反轉提交 | git revert<commit> | git merge -c <rev> |
| 提交練選 | git cherry-pick<commit> | git merg -c <rev> |
| 分支合並 | git merge <branch> | svn merge <url/of/branch> |
| 沖突解決 | git mergetool git add <path> |
svn resolve --accept = <ARG><path> svn resolved<path> |
| 顯示文件列表 | git ls-files git ls-tree<commit> |
git ls git ls <url> -r <rev> |
| 更改提交說明 | git commit -amend | svn ps -revprop -r <rev>svn:log "<<msg>" |
| 撤銷提交 | git reset[--soft|hard]HEAD^ | svnadmin dump, svnadmin load ,svndumpfiler |
| 屬性 | .gitignore 文件 text 屬性 eol 屬性 git submodule 命令 |
svn :ignore svn: mime-type svn:eol-style svn:externals svn:keywords |
