场景
1.使用SVN的都知道, SVN是集中化的版本控制系统. 本地只存储最新的版本快照, 不能查看整个库的历史记录; 修改代码过后, 如果需要提交代码到中心仓库,是需要联网的; 如果别人更快的提交, 那么必须先update之后解决冲突才可以提交, 相当麻烦.
说明
下边比较Svn(集中化版本控制) 和 Git(分布式版本控制)的优缺点:
Svn
特性
1.只存储某个个版本的快照.
2.是以数值为版本号.

优点
1.每个人都可以在一定程度上看到项目中的其他人在做什么.
2.管理员可以轻松掌控每个开发人员的权限.(特别是对源码控制要求比较高的公司)
缺点
1.如果中央服务器单点故障, 那么任何一个客户端都无法提交更新, 也就无法协同工作.
2.如果中心数据库的磁盘发生损坏, 又没做备份, 那么会丢失整所有数据,包括变更历史, 如果有一个SVN里的中心数据文件损坏, 那么导致这个存储文件对应的记录或文件无法恢复, 严重的整个SVN库都因此报废.
3.本地开发时完成如果连不上代码仓库, 那么某个功能想提交保存又提交不了,做新功能时又担心覆盖或影响之前的功能,束手束脚(效率低,慢,容易出错). 提交失败时还得先打包备份。防止Update时不小心merge错误.
Git
特性
1.存储整个个仓库的镜像, 并不是某个快照.
2.git的文件存在3种状态: 已修改(modified)和已暂存(staged),已提交(committed)
3.是以sha1为版本号.

优点
1.客户端不只是提取最新版本的文件快照, 而是把代码仓库完整的Clone(镜像)下来.
2.中心服务器如果发生故障,可以用任何一个客户端的本地仓库进行恢复.
3.多阶段提交, 比如项目C=A+B, A=A1+A2+A3, 这样一个大项目可以分成足够细的子项目协同开发而不受影响.
4.基本所有的操作和提交都可以在本地执行提交而不受其他人影响,这样能保护代码不小心被还原或删除造成的变更丢失, 是个很好的功能. 它是先提交到本地的仓库(快速),之后再push到远程, 只有在push时才有可能发生冲突. 这时候解决冲突其实已经安全很多, 因为你自己的修改已经提交到本地.
缺点
1.权限控制相当麻烦, 默认没有对一个项目的权限控制.
常用操作
获取仓库
第一种:克隆仓库
git clone https://github.com/libgit2/libgit2 .
# checkout 分支
git checkout -b 新分支名(可以和分支同名,起到本地分支绑定远程分支的作用) origin/分支
# 更新远程
git pull```
第二种:在现有目录初始化仓库
进入该项目目录-> `git init`
### 配置git
1.进入项目目录设置 user.name和 user.email, 设置编辑这个项目的用户名和email.全局的会在/etc/gitconfig 与
~/.gitconfig 里设置, 如果是某个项目的是在该项目的.git/config文件里.
git config [–global] user.name “Sam”
git config [–global] user.email “Sam@gmail.com”
2.检测配置
git config list
3.获取帮助
git help
git help
man git
### 操作git
1.查看当前文件状态
git status [-s]
2.添加一个跟踪文件
git add
3.添加忽略, 比如pyc文件不提交, 全局的在 ~/.gitignore 文件里. 项目的在.git/info/exclude文件.
-- 所有空行或者以 # 开头的行都会被 Git 忽略。
-- 可以使用标准的 glob 模式匹配。
-- 匹配模式可以以(/)开头防止递归。
-- 匹配模式可以以(/)结尾指定目录。
-- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
4.查看尚未暂存的文件更新了哪些部分
git diff
5.提交更新到本地
git commit -m “描述”
6.删除文件
git rm
7.移动文件
git mv <file_from> <file_to>
8.查看提交历史,一个常用的选项是 -p,用来显示每次提交的内容差异。你也可以加上 -2 来仅显示最近两次提交
git log [-p -2]
9.撤销操作, 比如一次提交漏掉了某个文件或注释写错.
git commit -m ‘initial commit’
git add forgotten_file
git commit --amend
10.取消暂存的文件
git reset HEAD CONTRIBUTING.md
11.撤销(放弃)对文件的修改
git checkout – CONTRIBUTING.md
12.显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote -v
13.添加远程仓库
git remote add
git remote add pb https://github.com/paulboone/ticgit
14.从远程仓库中抓取与拉取
git fetch [remote-name]
git pull [更新远程服务器代码到本地]
15.推送到远程仓库
git push [remote-name] [branch-name]
git push origin master
16.查看远程仓库信息
git remote show origin
17.列出标签
git tag
git tag -l ‘v1.8.5*’ (过滤标签)
18.创建标签
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。
然而,附注标签是存储在 Git 数据库中的一个完整对象。它们是可以被校验的;其中包含打标签者的名字、电子
邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard
-- 附注标签
git tag -a v1.4 -m ‘my version 1.4’
git show v1.4 (显示标签信息)
-- 轻量标签
git tag v1.4
-- 后期打标签, 对某个历史打标签,你需要在命令的末尾指定提交的校验和(或部分校验和)
git log (显示历史)
git tag -a v1.2 9fceb02
-- 共享标签,默认情况下 git push 不会传送标签到远程仓库服务器上.
git push origin [tagname]
git push origin --tags (所有远程仓库不在的标签提交)
-- 检出标签
git checkout -b [branchname] [tagname]
19.存储提交的email和密码
git config credential.helper store
git push origin master
...
会自动保存到 ~/.git-credentials, 下次提交不会再输入,缺点是明文的. 不建议使用.
最后补充下开源项目还是用github吧, code.youkuaiyun.com都用不了了还要迁移到码云,关键是码云还不能搜代码片段, 没什么意义. 自己写的博客备份工具会迁移到github.
# 参考
[Pro Git 中文](https://git-scm.com/book/zh/v2)
[is-there-a-way-to-make-git-remember-the-password-for-webdav-remotes](https://stackoverflow.com/questions/2233590/is-there-a-way-to-make-git-remember-the-password-for-webdav-remotes)
[git-credential-store](https://git-scm.com/docs/git-credential-store)
本文对比了SVN和Git这两种版本控制系统的特点与优缺点。SVN作为集中式版本控制系统,便于权限管理和团队协作,但易受服务器故障影响;Git作为分布式版本控制系统,具备良好的离线工作能力与代码安全性,但在权限管理方面较为复杂。
1152

被折叠的 条评论
为什么被折叠?



