版本控制系统
git 分布式 没有中心代码库 所有机器之间的地位是同等的,每台机器上有所有的代码
svn 集中管理 中心代码库--client 必须要连网
开发
git是linus开发的
功能 只能控制文本文件 .txt 结尾的文件
可以进行版本控制
可以进行很好的团队开发
作为运维人员的上线工具
git属于分布式版本控制系统:
客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。
优点:
a.由于任何人每次提取操作,实际上都是一次对代码仓库的完整备份,因此近乎所有的操作都可以在
本地执行,速度就是相当的快,并且可以在网络断开的时候操作仍然不受影响,可以频繁的进行提交
更新,等到有网络的时候再上传到远程的镜像仓库就可以了。
b.文档很详细,并且命令行的提示也很到位,用起来比较得新应手,而且很多的设置与操作跟linux操
作很相近(不亏是linux之父创造的)。
c.git的分支模型,相当的轻量级,被称为“必杀技”。
缺点:
a.每个开发人员都拥有所有的代码,不利于核心代码的保密(如果有重要代码需要保密,则不建议使用git)
工作区(Working Directory):
本身是一个目录
1.代码文件
2.代码库:控制代码版本的,他在工作区里创建一个隐藏目录.git
缓存机制
存放git版本仓库的目录就是工作区
版本库(Repository):
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
暂存区:
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
HEAD:
你的本地仓库由 git 维护的三棵“树”组成。
第一个是你的 工作目录,它持有实际文件;
第二个是 缓存区(Index),它像个缓存区域,临时保存你的改动;
第三个HEAD,指向你最近一次提交后的结果。
HEAD的头就是当前指向的版本
添加修改到暂存区:
创建两个文件add到stage:
#git add 文件名
或者
#git add *
从stage提交到当前master分支的HEAD:
#git commit -m “版本描述信息” //提交暂存区里的修改到版本库的分支
git 部署:
环境:
centos7u3
vm20 192.168.245.139 充当中央服务器
vm21 192.168.245.249
安装:所有机器都安装
# yum install git -y
# git --version
git version 1.8.3.1
准备:
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
# git config --global user.email "wing@up.com"
# git config --global user.name "wing"
1.创建一个空目录:在vm20上创建
[root@vm20 /]# mkdir gittest
[root@vm20 /]# cd gittest/
2.通过git init命令把这个目录变成Git可以管理的仓库(初始化代码库):
方式1.创建本地库:相当于第一种情况,本地自己的机器别人不能上传到自己的机器
这样创建的库其他机器可以clone(克隆),但是没办法push(上传)
[root@vm20 gittest]# git init
初始化空的 Git 版本库于 /gittest/.git/
创建完成后查看库目录:
[root@vm20 gittest]# ls -a
. .. .git
方式2.创建裸库: 适用与作为远程中心仓库使用
创建裸库才可以从别处push代码过来,使用--bare参数
[root@vm20 gittest2]# git init --bare
初始化空的 Git 版本库于 /gittest2/
默认会把当前所在目录做成库目录,可以在命令后面跟目录指定子目录为版本库
git init --bare 库名字
裸库创建完成后查看库目录:
[root@vm20 gittest2]# ls
branches config description HEAD hooks info objects refs
注:不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的
3.在gittest目录下创建一个测试文件readme.txt
[root@vm20 gittest]# cat readme.txt
Git is a version control system.
Git is free software.
4.把文件添加到暂存区:使用 "git add" 建立跟踪
[root@vm20 gittest]# git add readme.txt
使用#git status可以查看状态
使用#git rm --cached readme.txt可以删除文件跟踪,但是不可以回退文件内容的修改
5.提交文件到仓库分支: 默认的分支是master
[root@vm20 gittest]# git commit -m "test"
[master(根提交) addd750] test
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
-m 本次提交的说明
6.查看git状态:
[root@vm20 gittest]# git status
# 位于分支 master
无文件要提交,干净的工作区
场景1: 源文件添加了一行thursday,还没有add到stage(前提:之前提交过此文件)撤销对文件的修改。
[root@vm20 gittest]# git checkout -- a.txt
场景2:源文件添加了一行thursday,并且add到了stage(前提:之前提交过此文件,添加到了暂存区)
[root@vm20 gittest]# git reset HEAD a.txt
[root@vm20 gittest]# git checkout -- a.txt
查看现在的版本:
[root@ansible gittest]# git log
回到上一个版本:
[root@vm20 gittest]# git reset --hard HEAD^^ ^一个上箭头回退一个版本号
回到指定的版本(根据版本号):
[root@vm20 gittest]#git reset --hard 6fe5b9a2
[root@vm20 gittest]# git reflog 查看所有的id号
从工作区删除a.txt,并且从版本库一起删除
[root@vm20 gittest]# rm -rf a.txt
[root@vm20 gittest]# git status
删除了文件readme.txt之后又后悔了,恢复回来
[root@vm20 gittest]# ls
readme.txt
[root@vm20 gittest]# rm -rf readme.txt
[root@vm20 gittest]# git checkout -- readme.txt
[root@vm20 gittest]# ls
readme.txt
GitHub 提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
GitHub允许添加多个Key用于可以在多台电脑上往GitHub推送。
部署远程仓库:
第一步,安装git:
#yum install git
第二步,创建一个git用户,用来运行git服务:
#adduser git
#git config --global user.email "zhuangyaovip@163.com"
#git config --global user.name "blackmed"
第三步,创建证书登录:
mkdir /home/git/.ssh
vim /home/git/.ssh/authorized_keys
将其他的机器的公钥(id_rsa.pub)里的文件导入到/home/git/.ssh/authorized_keys 这个文件里
第四步,初始化Git仓库:
选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
chown -R git.git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
# git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
在远程克隆过来的目录里创建一个文件,并提交到版本库里
git remote add test
[root@tomcat gittest4]# git push -u origin master
tesla@192.168.245.3's password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To tesla@192.168.245.3:/gittest3/teslaProject.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。