分布式版本控制系统
一、Git、Github、Gitlab 的区别
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。
是Linus Tovalds 为了帮助管理Linux内核开发的一个开放源码的版本控制软件。
Github是在线的基于Git的代码托管服务,Github是2008年由Ruby on Rails编写而成。Github同时提供付费账户和免费账户。这两种账户都可以常见公开的代码仓库,只有付费账户可以创建私有代码仓库。Github解决了这个问题,可以在上面创建免费的私人repo。
二、Git 与 SVN 区别
Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
GIT 与 SVN 区别
- GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
- GIT把内容按元数据方式存储,而SVN是按文件:所有的资源版本控制系统都是把文件的元信息隐藏在一个类似svn.cvs等的文件夹里。
- GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外一个目录。
- GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
- GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低版本库的破坏。
三、部署 Git 服务
准备两台虚拟机 centos7.x
192.168.1.120 git-server
192.168.1.121 git-client
git-server 的操作
yum install git git-core gitweb -y useradd git passwd git mkdir /git-root/ cd /git-root/ git init --bare shell.git #初始化操作,其实就是创建了一个库 git init 与 git init --bare 的区别 …… …… #授权 cd shell.git chown -R git:git /git-root/shell.git #切换用户 su - git ssh-keygen -t rsa cd .ssh/ cp id_rsa.pub authorized_keys vim authorized_keys logout usermod -s /usr/bin/git-shell git
git仓库测试
git-client 的操作
[git@localhost ~]# yum install git -y [git@localhost ~]# ssh-keygen [git@localhost ~]# ssh-copy-id git@192.168.1.120 [git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git #克隆 [git@localhost ~]# ls rh shell [git@localhost ~]# cd shell [git@localhost shell~]# vim test.sh [git@localhost shell~]# git add test.sh [git@localhost shell~]# git config --global user.name "administrator" [git@localhost shell~]# git config --global user.email admin@example.com [git@localhost shell~]# git push -u origin master [git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git
四、 Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git的工作流程示意图:
![](https://img2020.cnblogs.com/blog/2174174/202103/2174174-20210303104920653-1265325277.png)
五、 Git 基本概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文名叫stage或index.一般存放在git目录下index文件(.git/index)中,所以我们把暂存区有时也叫做索引(idenx)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
工作区、版本库中的暂存区和版本库之间的关系的示意图:
![](https://img2020.cnblogs.com/blog/2174174/202103/2174174-20210303104823313-153764223.png)
- 图中左侧为工作区、右侧为版本库。在版本库中标记为"index"的区域是暂存区(stage,index),标记为"master"分支所代表的目录树。
- 图中可以看出此时对"HEAD"实际是指向 master 分支的一个"游标",所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为Git的对象库,实际位于".git/objects"目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行"git add" 命令时,暂存区的目录树被更新,同时工作区修改(或更新)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做对应的更新,即 master 指向的目录树就是提交暂存区的目录树。
- 当执行"git reset HEAD"命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行"git rm --cached <file>"命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行"git checkout"或者"git checkout --<file>"命令时,会用暂存区全部或指定文件替换工作区的文件,这个操作很危险,会清除工作区中未添加到暂存区的改动
六、Git 客户端安装使用
1、Git 安装配置
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel yum install -y git git-all git-core git --version
2、Git 配置
Git 提供了一个叫做git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了Git在各个环节的具体工作方式和行为,这些变量可以存放在以下三个不同的地方:
- /etc/gitconfig 文件:系统中对所有用户都普通适用的配置。若使用 git config 时用--system 选项,读写的就是这个文件。
- -/.gitconfig 文件: 用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
- 当前项目的 Git 目录中的配置文件(也就是工作目录中 .git/config 文件):这里的配置仅仅针对当前项目有效,每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
2.1、git 用户信息
配置个人的用户名称和电子邮件地址:(可自定义名称)
git config --global user.name "administrator" git config --global user.email admin@example.com
如果使用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所以的项目都会默认使用这个配置的用户信息。
如果要在某个特定的项目中使用其他名称或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config文件里。
2.2、文本编辑器
设置Git默认使用的文本编辑器,一般可能会是vi或者vim,如果你有其他偏好,比如Emacs的花,可以重新设置
git config --global core.editor emacs
2.3、差异分析工具
还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具,比如要改为vimdiff的话:
git config --global merge.tool vimdiff
可以理解kdiff3,tkdiff,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和opendiff等合并工作的输出的信息。
当然,你也可以指定使用自己开发的工具。
2.4、检查配置信息
要检查已有的配置信息,可以使用git config --list命令:
git config --list
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如/etc/gitconfig和~/.gitconfig),不过最终 Git 实际采用的是最后一个。
[root@localhost .git]# git config user.name administrator [root@localhost .git]# git config user.name fdd 更改用户名 fdd
3、Git 使用
3.1、ssh 链接
客户机上上传公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全
3.2、http 链接(两种方式实现)
1.修改代码里 .git/config文件添加登录用户名密码
2.执行命令设置登录用户和密码
3.设置身份验证
注意:设定本机用户名,绑定邮箱,让远超服务器知道机器的身份
git config --global user.name "user_name" git config --global user.email "xxxxx.com"
4.本地项目与远程服务器项目之间的交互
- 如果你没有最新的代码,希望从头开始
git clone git@xxx.git #这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来 cd BCBInspector_vo1 # colne 之后进入该项目的文件夹 touch README.md #新建readme文件 git add README.md #将新建的文件添加到git的暂存区 git commit -m "Its note: add a readmo file" #将暂存区的文件提交到某一个版本保存下来,并加上注释 git push -u origin master #将本地的更改提交到远程服务器
- 如果你已经有一个新版代码,希望直接本地的代码替换到远程服务器
cd existing_folder #进入代码存在的文件夹,或者直接在该文件夹打开 git bash git init #初始化 git remote add origin git@xxx.git #添加远程项目地址(可从项目主页复制) git add . #添加该文件夹中所有的文件到git的暂存区 git commit -m "note" #提交所有代码到本机的版本库 git push -u origin master #将本地的更改提交到远程服务器
- git 中 clone过来的时候,git不会对本地和服务器的文件,也就不会有冲突。
- 建议确定完全覆盖本地的时候用clone,不确定会不会有冲突的时候用git pull,将远程服务器的代码download下来
5、常用的 Git 命令
git init #初始化 git add main.cpp #将某一个文件添加到暂存区 git add . #将文件夹下的所有的文件添加到暂存区 git commit -m 'note' #将暂存区中的文件保存成为某一个版本 git log #查看所有的版本日志 git status #查看现在暂存区的状况 git diff #查看现在文件与上一个提交-commit版本的区别 git reset --hard HEAD #回到上一个版本 git reset --hard xxxxx #xxx为版本编号,回到某一个版本 git pull origin master #从主分支pull到本地 git push -u origin master #从本地push到主分支 git pull #pull默认主分支 git push #push默认主分支 ……
6、版本穿梭
6.1、版本回退
#用 git log 命令查看: #每一个提交的版本都唯一对应一个 commit 版本号 #使用 git reset 命令退到上一个版本 git reset --hard HEAD^ git reflig #查看命令历史,一遍确定回到那个版本 git reset --hrad commit_id #比如 git reset --hard 3628164 (怒用全部输入,输入前几位即可)
6.2、分支管理
创建分支
git checkout -b dev #创建dev分支,然后切换到dev分支 git checkout #命令加上-b 参数表示创建并切换。 相当于以下两条命令: git branch dev git checkout dev git branch #命令查看当前分支 git branch #命令会列出所有分支,当前分支前面会标一个*号 git branch * dev master git add readme.txt git commit -m 'branch test' #在dev分支上正常提交
分支切换
git checkout master #切换回 master分支
git merge dev #把dev分支的工作成果合并到master分支上 git merge #命令用于合并指定分支到当权分支。 #合并后,再查看readme.txt的内容,就可以看到,和dev分支的罪行提交是完全一样的。 git branch -d dev #删除dev分支