一、Git和SVN的区别
- Git是分布式版本控制系统而SVN都是集中式的版本控制系统
集中化版本控制:都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。

- 分布式版本控制:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

二、介绍Git的三区和三状态
- 工作区:工作区是对项目的某个版本独立提取出来的内容。
- 暂存区:是一个文件,保存了下次将提交的文件列表信息。
- 仓库区:Git 用来保存项目的元数据和对象数据库的地方。
- 修改状态:如果自上次取出后,作了修改但还没有放到暂存区域。
- 暂存状态:如果作了修改并已放入暂存区域。
- 提交状态:如果 Git 目录中保存着的特定版本文件。
三、Git常用命令
- 1、安装: 打开git官网http://git-scm.com/下载。
- 2、设置用户信息:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
git config –-list 可以查看git信息
- 3、获取 Git 仓库
第一种是在现有项目或目录下导入所有文件到 Git 中。
第二种是从一个服务器克隆一个现有的 Git 仓库。
首先的生成密匙:
ssh-keygen -t rsa -C "your_email@youremail.com" 生成私密,在.ssh下找到id_rsa.pub.把里面的密匙加到gitlab中,不然是不能提交代码的。
使用git init 对现有项目管理。会在目录下生成.git版本文件。或者克隆现有的仓库:git clone 你需要克隆的git项目地址 (有两种协议http、ssh)。
- 4、克隆后会发现默认分支是master分支。
- 5、创建新分支并切换到该分支:
git checkout –b 分支名
- 6、切换分支:
git checkout 分支名
- 7、检查当前文件状态:
git status
- 8、查看远程分支:
git branch –r
- 9、删除远程分支:
git push origin --delete 分支名 或 git push origin :分支名
- 10、把本地分支推到远程:
git push --set-upstream origin 分支名
- 11、删除本地分支:
git branch -d 分支名
- 12、删除远程仓库:
git remote rm origin (比如我从GitHub下colne后,需要提交到我们自己的版本仓库时)
- 13、添加到远程:
git remote add origin https://你的远程git地址。 git push -u origin master //提交到远程版本库 u 是--set-upstream 的简写
- 14、添加文件到暂存区:
git add .
- 15、提交文件:
git commit -m '添加内容'
- 16、跳过暂存区提交文件:
git commit –a –m '添加内容'
- 17、移除文件不纳入版本:
git rm 文件
- 18、从暂存区移除文件:
git rm -–cached 文件
- 19、查看提交历史:
git log
、git log --oneline --before={3.weeks.ago} --after={2016-08-19}
- 20、打标签:
git tag –a v1.4 -m 'version 1.4' (-m 选项指定了一条将会存储在标签中的信息)
- 21、打完标签推送到远程:
git push origin v1.4
- 22、检出莫个标签作为开发分支:
git checkout -b 分支名 v1.4
- 23、推送到远程仓库更新:
git push
- 24、从远程仓库拉取更新:
git pull
- 25、回滚到当前版本、上个版本,就像没提交过一样:
git reset --hard HEAD git reset --hard HEAD^
- 26、回滚的日志(后悔药):
git reflog
- 27、统计某人贡献的代码行数:
git log --author="$(git config --get user.name)" --since=2016-01-01 --before=2016-12-31 --pretty=tformat: --numstat | awk '{adds += $1; subs += $2; all += $1 + $2} END {printf "added lines: %s removed lines : %s all lines: %s\n",adds,subs,all}'