一、SVN是集中式管理
1.SVN十分简单粗暴、版本库只保存在中央服务器上。所有的使用者都需要连接到这台服务器、进行提交更新/拉取最新文件的操作
2.中央服务器就相当于是一个共享文件夹、每个人都可以进去操作文件
3.当你操作完毕、再把这个文件放进共享文件夹里
二、Git是分布式管理
1.Git版本库分散在每个使用者的电脑上。每个终端都是一个仓库、每次拉取操作都是备份对应的整个版本库而不仅限于最新的文件快照
2.因为版本库就在自己的电脑上、你不再需要联网去修改版本库
3.小明修改了版本库中的A文件、只需要将推送给小亮、小亮的版本库中也能看到A文件的修改
4.么远程仓库的作用是什么呢。远程仓库并不是必须的、他只是方便大家协作、交换工作结果(通常是各个分支上的版本库信息)的云盘而已。(比如两个仓库不在一个局域网、或者某天你同事的电脑没开机、你就没有办法直接从他的本地仓库拉取数据了)
三、Git 只关心文件数据的整体是否发生变化、而SVN这类版本控制系统则只关心文件内容的具体差异
1.SVN会每次记录有哪些文件作了更新、以及都更新了哪些行的什么内容
2.SVN 服务器上保存着唯一的一份历史版本库、当然是越详细越好了
- Git 更像是把变化的文件作快照后、记录在一个微型的文件系统中。每次提交更新时、它会纵览一遍所有文件的指纹信息并对文件作一快照、然后保存一个指向这次快照的索引。为提高性能、若文件没有变化、Git 不会再次保存、而只对上次保存的快照作一连接。
四、查找数据
- Git为了快速查找数据、将数据添加一个header封装为数据对象、然后进行Hash、将此Hash值当作对象名字、以后根据此Hash值变可找到数据
2.具体的实现方式为:Hash值的前2位是文件的目录名字、后面的值为文件名。由于进行Hash、一旦文件内容改变、其对应的Hahs值就会变化、因而很适合变化的数据
五、在Git 中的绝大多数操作都只需要访问本地文件和资源、不必联网就可以看到所有的历史版本记录、而SVN 却需要联网
1.因为 Git 在本地磁盘上就保存着所有当前项目的历史更新、所以处理起来速度飞快、当我们需要浏览项目的历史更新摘要、Git 不用跑到外面的服务器上去取数据回来、而直接从本地数据库读取后展示给你看
- 如果想要看当前版本的文件和一个月前的版本之间有何差异、Git 会取出一个月前的快照和当前文件作一次差异运算。
六、Git 的内容完整性要优于SVN
- Git每次Commit或者push动作都会通过哈希值进行文件校验、保证传输过程中不会意外的丢包
- Git数据库中所有的索引都是通过哈希值来实现、而不是文件名。
七、Git把内容按元数据方式存储,而SVN是按文件
这也是为什么.git文件比.svn文件要大的原因
八、分支不同
- SVN也是有分支的、只是开启分支的代价比Git要大得多
- SVN的分支确实是有些蛋疼的、因为每一个分支都是一套完完整整的文件。虽然SVN可以针对某个目录做分支、但是你真能保证你的代码只影响到一个目录么
- Git的分支你只要下载一份主文件、然后获取文件的每个分支的元素
- 对于存在分支的项目、SVN的克隆速度要成倍的慢于Git
九、关于分支合并
Git从数据结构上更好的支持了分支合并、但我们都知道合并的麻烦程度总是取决于冲突的数量。
十、git常用命令
命令 | 说明 |
---|---|
git branch | 查看本地所有分支 |
git status | 查看当前状态 |
git commit | 提交 |
git branch -a | 查看所有的分支 |
git branch -r | 查看远程所有分支 |
git commit -am "init" | 提交并且加注释 |
git remote add origin git@192.168.1.119:ndshowgit push origin master | 将文件给推到服务器上 |
git remote show origin | 显示远程库origin里的资源 |
git push origin master:developgit push origin master:hb-dev | 将本地库与服务器上的库进行关联 |
git checkout --track origin/dev | 切换到远程dev分支 |
git branch -D master develop | 删除本地库develop |
git checkout -b dev | 建立一个新的本地分支dev |
git merge origin/dev | 将分支dev与当前分支进行合并 |
git checkout dev | 切换到本地dev分支 |
git remote show | 查看远程库git add .git rm 文件名(包括路径) 从git中删除指定文件 |
git clone git://github.com/schacon/grit.git | 从服务器上将代码给拉下来 |
git config --list | 看所有用户 |
git ls-files | 看已经被提交的 |
git rm [file name] | 删除一个文件 |
git commit -a | 提交当前repos的所有的改变 |
git add [file name] | 添加一个文件到 |
git indexgit commit -v | 当你用-v参数的时候可以看commit的差异 |
git commit -m "This is the message describing the commit" | 添加commit信息 |
git commit -a | -a是代表add,把所有的change加到git index里然后再commit |
git commit -a -v | 一般提交命令git log 看你commit的日志 |
git diff | 查看尚未暂存的更新 |
git rm a.a | 移除文件(从暂存区和工作区中删除) |
git rm --cached a.a | 移除文件(只从暂存区中删除) |
git commit -m "remove" | 移除文件(从Git中删除) |
git rm -f a.a | 强行移除修改后文件(从暂存区和工作区中删除) |
git diff --cached 或 $ git diff --staged | 查看尚未提交的更新 |
git stash push | 将文件给push到一个临时空间中 |
git stash pop | 将文件从临时空间pop下来 |
git remote add origin git@github.com:username/Hello-World.gitgit push origin master | 将本地项目给提交到服务器中 |
网友评论