https://git-scm.com/book/zh/v2
关于版本控制
- 本地版本控制系统
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。
有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异
- 集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version
Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce
等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
多年以来,这已成为版本控制系统的标准做法。
事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
- 分布式版本控制系统
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像
Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,
而是把代码仓库完整地镜像下来,包括完整的历史记录。
这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改表示修改了文件,但还没保存到数据库中。
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
实验步骤:
.git目录是git跟踪管理版本库的,没事别瞎溜达!
安装Git:
# yum install -y git
获取 Git 仓库通常有两种方式:
将尚未进行版本控制的本地目录转换为 Git 仓库。
从其它服务器克隆 一个已存在的 Git 仓库。比如: git clone
初始化版本库:
$ mkdir demo
$ git init
Initialized empty Git repository in /home/git/demo/.git/
$ ls .git/
branches config description HEAD hooks info objects refs
状态简览
$ git status -s
M README #在工作区修改,还未提交到暂存区
MM Rakefile ##该文件已经修改并提交到暂存区,但在工作区进行了再次的修改
A lib/git.rb #首次进行跟踪操作
M lib/simplegit.rb #已修改,并提交到暂存区
?? LICENSE.txt #新建的文件
忽略文件
$ cat .gitignore
.* //忽略所有隐藏文件
/test //只忽略当前目录下的test文件
build/ //忽略任何目录下名为 build 的文件夹
查看已暂存和未暂存的修改
$ git diff
跳过使用暂存区域
$ git commit -a -m 'added new benchmarks'
移除文件
$ git rm PROJECTS.md
$ git rm --cached README
重命名文件
$ git mv README.md README
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
查看提交历史
$ git log
$ git log -p -2
$ git log --stat
$ git log --pretty=oneline
取消暂存的文件
$ git reset HEAD README.md
版本回退:
$ git reflog
$ git reset --hard efa267a
git使用
远程仓库:注册github帐号,并新建一个仓库:
推送本地仓库内容到github:
$ git remote add origin https://github.com/westos007/git.git //关联远程仓库
$ git push -u origin master //第一次推送需要加 -u参数
使用https方式推送每次需要输入用户名和密码,如果不想麻烦的话采用ssh方式:
$ ssh-keygen -t rsa -b 4096 -C “yakexi007@westos.org”
生成本地密钥,并上传公钥到github:
克隆远程仓库:$ git clone git@github.com:westos007/gittest.git
搭建私有仓库
(1)下载gitlab
(2)编写配置文件
登录gitlab(//用户:root 第一次登录需要强制修改密码)
新建项目:
添加ssh密钥: